java实现txt、excle、pdf、doc文档的在线预览

Java实现office文档与pdf文档的在线预览功能

      要实现的过程就是把office转换成pdf,当然pdf就不用转换了。然后在pdf转换为swf文件,在浏览器实现预览swf文件。整个过程就是这样,看起来很简单,实际操作起来会出现各种问题。下面我就把自己写的这一小功能记录下来。

1、首先我们需要找到可以把office转换成pdf的方法,查找资料发现有openoffice这一软件可以把office转换成pdf,这一软件先下载下来,然后记住自己安装的在那个位置。然后在cmd环境下进入安装目录的program目录,输入打开openoffice的命令:

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

输入完成之后在任务管理器可以看见soffice.bin的进程在任务管理器,这一服务就启动成功。当然在代码中转换office2pdf我们还需要一些架包。下载jodconverter-2.2.2架包,然后复制到lib目录下,引入架包就可以了。这个架包有如下包:

 

有一些项目重复的可以删除,根据实际情况自己处理。

 

2、我们需要找到转换pdf2swf的方法。查找资料发现swftools这个软件可以把pdf转换成swf文件。把它下下来安装好就可以了。

 

3、我们需要一个展示swf文件的容器,发现有flexpaper这个插件。而且展示效果还不错。所以我们需要下载这个插件。使用这个插件需要有三个js文件。分别是:jquery.jsflexpaper_flash.jsflexpaper_flash_debug.js。插件的名字是FlexPaperViewer.swf

 

整个项目结如下:

准备工作完成下面开始编码.

转换类为DocConverter 的代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
package  com.cectsims.util;
 
import  java.io.BufferedInputStream;
import  java.io.File;
import  java.io.IOException;
import  java.io.InputStream;
import  com.artofsolving.jodconverter.DocumentConverter;
import  com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import  com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import  com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
 
 
/**
  * doc docx格式转换 
  */
public  class  DocConverter {
     private  static  final  int  environment =  1 ; // 环境 1:Windows 2:Linux
     private  String fileString; // (只涉及PDF2swf路径问题)
     private  String outputPath =  "" ; // 输入路径 ,如果不设置就输出在默认 的位置
     private  String fileName;
     private  File pdfFile;
     private  File swfFile;
     private  File docFile;
 
     public  DocConverter(String fileString) {
         ini(fileString);
         System.out.println( "文件路径" +fileString);
     }
 
     /**
      * * 重新设置file
      *
      * @param fileString
      *            32.
      */
     public  void  setFile(String fileString) {
         ini(fileString);
     }
 
     /**
      *  * 初始化
      *
      * @param fileString
      *          
      */
     private  void  ini(String fileString) {
         this .fileString = fileString;
         fileName = fileString.substring( 0 , fileString.lastIndexOf( "." ));
         docFile =  new  File(fileString);
         pdfFile =  new  File(fileName+  ".pdf" );
         swfFile =  new  File(fileName+  ".swf" );
     }
 
     /**
      *  转为PDF
      *
      * @param file
      *      
      */
     private  void  doc2pdf()  throws  Exception {
         if  (docFile.exists()) {
             if  (!pdfFile.exists()) {
                 OpenOfficeConnection connection =  new  SocketOpenOfficeConnection( 8100 );
                 try  {
                     connection.connect();
                     DocumentConverter converter =  new  OpenOfficeDocumentConverter(
                             connection);
                     converter.convert(docFile, pdfFile);
                     // close the connection
                     connection.disconnect();
                     System.out.println( "****pdf转换成功,PDF输出: " + pdfFile.getPath() +  "****" );
                 catch  (java.net.ConnectException e) {
                     e.printStackTrace();
                     System.out.println( "****swf转换器异常,openoffice 服务未启动!****" );
                     throw  e;
                 catch  (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
                     e.printStackTrace();
                     System.out.println( "****swf转换器异常,读取转换文件 失败****" );
                     throw  e;
                 catch  (Exception e) {
                     e.printStackTrace();
                     throw  e;
                 }
             else  {
                 System.out.println( "****已经转换为pdf,不需要再进行转化 ****" );
             }
         else  {
             System.out.println( "****swf转换器异常,需要转换的文档不存在, 无法转换****" );
         }
     }
 
     /** * 转换成 swf */
     @SuppressWarnings ( "unused" )
     private  void  pdf2swf()  throws  Exception {
         Runtime r = Runtime.getRuntime();
         if  (!swfFile.exists()) {
             if  (pdfFile.exists()) {
                 if  (environment ==  1 ) { // windows环境处理
                     try  {
                         Process p = r.exec( "D:/Program/swfttools/pdf2swf.exe " + pdfFile.getPath() +  " -o " + swfFile.getPath() +  " -T 9" );
                          System.out.print(loadStream(p.getInputStream()));
                          System.err.print(loadStream(p.getErrorStream()));
                          System.out.print(loadStream(p.getInputStream()));
                          System.err.println( "****swf转换成功,文件输出: " +swfFile.getPath() +  "****" );
                         if  (pdfFile.exists()){
                             pdfFile.delete();
                         }
                     catch  (IOException e) {
                         e.printStackTrace();
                         throw  e;
                     }
                 else  if  (environment ==  2 ) { // linux环境处理
                     try  {
                         Process p = r.exec( "pdf2swf"  + pdfFile.getPath()+  " -o "  + swfFile.getPath() +  " -T 9" );
                          System.out.print(loadStream(p.getInputStream()));
                          System.err.print(loadStream(p.getErrorStream()));
                          System.err.println( "****swf转换成功,文件输出: " + swfFile.getPath() +  "****" );
                         if  (pdfFile.exists()) {
                             pdfFile.delete();
                         }
                     catch  (Exception e) {
                         e.printStackTrace();
                         throw  e;
                     }
                 }
             else  {
                 System.out.println( "****pdf不存在,无法转换****" );
             }
         else  {
             System.out.println( "****swf已经存在不需要转换****" );
         }
     }
 
     static  String loadStream(InputStream in)  throws  IOException {
         int  ptr =  0 ;
         in =  new  BufferedInputStream(in);
         StringBuffer buffer =  new  StringBuffer();
         while  ((ptr = in.read()) != - 1 ) {
             buffer.append(( char ) ptr);
         }
         return  buffer.toString();
     }
 
     /**
      * * 转换主方法
      */
     @SuppressWarnings ( "unused" )
     public  boolean  conver() {
         if  (swfFile.exists()) {
             System.out.println( "****swf转换器开始工作,该文件已经转换为 swf****" );
             return  true ;
         }
         if  (environment ==  1 ) {
             System.out.println( "****swf转换器开始工作,当前设置运行环境 windows****" );
         else  {
             System.out.println( "****swf转换器开始工作,当前设置运行环境 linux****" );
         }
         try  {
             doc2pdf();
             pdf2swf();
         catch  (Exception e) {
               e.printStackTrace();
               return  false ;
         }
         System.out.println( "文件存在吗?" +swfFile);
         if  (swfFile.exists()) {
             System.out.println( "存在" );
             return  true ;
         else  {
             System.out.println( "不存在" );
             return  false ;
         }
     }
 
     /**
      *返回文件路径      
      * @param     
      */
     public  String getswfPath(){
         if  ( this .swfFile.exists()){
             String tempString = swfFile.getPath();
             tempString = tempString.replaceAll( "\\\\" "/" );
             System.out.println( "最后文件路径为" +tempString);
             return  tempString;
         else  {
             return  "文件不存在" ;
         }
     }
 
     /**
      * 设置输出路径
      *
      * @param outputPath
      */
     public  void  setOutputPath(String outputPath){
         this .outputPath = outputPath;
         if  (!outputPath.equals( "" )) {
             String realName = fileName.substring(fileName.lastIndexOf( "/" ),
                     fileName.lastIndexOf( "." ));
             if  (outputPath.charAt(outputPath.length()) ==  '/' ) {
                 swfFile =  new  File(outputPath + realName +  ".swf" );
             else  {
                 swfFile =  new  File(outputPath + realName +  ".swf" );
             }
         }
     }
}

 

  

调用转换类只需要传wordpttexcelpdf文件所在的路径参数就可以了。

展示在线预览的jsp代码如下:

 

复制代码
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
   String swfFilePath=session.getAttribute("swfpath").toString();
   System.out.println("展示路径"+swfFilePath);
 %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/flexpaper_flash.js"></script>
<script type="text/javascript" src="js/flexpaper_flash_debug.js"></script>
<!--  <script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/flexpaper.js"></script>
<script type="text/javascript" src="js/flexpaper_handlers.js"></script>-->
<style type="text/css" media="screen">
html,body{
        height: 100%;
}
body{
        margin: 0;
        padding: 0;
        overflow: auto;
}
#flashContent{
       display: none;
}
</style>
<title>在线文档预览</title>
</head>
<body>
   <div style="position: absolute; left:50px;top:10px;">
        <a id="viewerPlaceHolder" style="width: 820px;height: 650px;display: block;"></a>
          <script type="text/javascript">
           var fp=new FlexPaperViewer('FlexPaperViewer','viewerPlaceHolder',{config:{SwfFile:escape('<%=swfFilePath%>'),Scale:1.2,
            ZoomTransition:'easeOut',ZoomTime:0.5,ZoomInterval:0.2,FitPageOnLoad:false,FitWidthOnload:false,
            FullScreenAsMaxWindow:false,ProgressiveLoading:false,MinZoomSize:0.2,MaxZoomSize:5,SearchMatchAll:false,
            InitViewMode:'SinglePage',RenderingOrder : 'flash',ViewModeToolsVisible:true,ZoomToolsVisible:true,NavToolsVisible:true,CursorToolsVisible:true,
            SearchToolsVisible:true,localeChain:'en_US'}});
          </script>
   </div>
</body>
</html>
复制代码

 

其中可能会出现在线预览只能实现10页的情况,需要把RenderingOrder : 'flash',设置为flash才可以实现超过10页的在线预览。swfFilePat为转换后的文件所在路径。

转换后面的效果如下:

注意问题:

1、发现错误一般是openoffice服务没有开启。

2、Linux环境下会存在中文乱码的问题,是linux下不像windows支持那么多字体,需要安装多的字体,并且把字体所在位置链接到flexpaper所在位置。在使用pdf2swf加上参数-s languagedir=/usr/local/xpdf-chinese-simplified/。具体的一些参数请百度。

源代码已经在我的github上了,可以访问https://github.com/liaowp/OnlinePreview,也可以点击我博客的github标签。

 

以上内容均为转载,现就我在项目使用中遇到的问题做以下总结:

1、路径问题,这个一般是最终swf文件无法展示的罪魁祸首。

2、FlexPaperViewer.swf插件中的FlexPaperViewer.swf文件要放在项目中用于展示swf文件,少了这个文件则swf文件无法播放。

    3、在上文jsp中,加粗的FlexPaperViewer为FlexPaperViewer.swf在项目中的位置,后者为所展示的swf文件位置。

猜你喜欢

转载自blog.csdn.net/guo147369/article/details/78486337