Java实现文档在线预览(openoffice+swfTools+FlexPaper)

一、文档在线阅读思路  

    1.用OpenOffice把PPT、Word、Excel、Text转换为pdf
    2.用SWFTool将生成的pdf转换成swf,然后利用FlexPlayer实现在线预览播放
二、准备工作
    1.安装OpenOffice,官网下载地址:http://www.openoffice.org/download/index.html,最新版为3.4.1,我使用的版本为3.3.0:http://pan.baidu.com/share/link?shareid=1181746637&uk=1913152192#dir/path=%2F%E8%BD%AF%E4%BB%B6%E5%B7%A5%E5%85%B7
    2.启动OpenOffice服务,CMD命令进入OpenOffice安装目录下的program目录,键入如下命令
        soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard
    
    参考资料:http://blog.csdn.net/hbcui1984/article/details/5109169
    3.下载JODConverter:http://sourceforge.net/projects/jodconverter/files/,项目中主要使用lib目录下的jar包。
    4.下载并安装SWFTools:http://www.swftools.org/download.html,下载exe文件安装完成即可
    5.下载FlexPlayer
    http://pan.baidu.com/share/link?shareid=1181746637&uk=1913152192#dir/path=%2F%E8%BD%AF%E4%BB%B6%E5%B7%A5%E5%85%B7
    官网下载地址:http://flexpaper.devaldi.com/download/,版本为2.1.5,与1.5.1有较大差别,未使用最新版。


3.开发过程

1.新建项目,将flexpaper 文件中的js文件夹(包含了flexpaper_flash_debug.js,flexpaper_flash.js,jquery.js,这三个js 文件主要是预览swf文件的插件)拷贝至网站根目录;将FlexPaperViewer.swf拷贝至网站根目录下(该文件主要是用在网页中播放swf文 件的播放器),目录结构如下图:

注:需创建upload文件夹

2.创建fileUpload.jsp

[html]  view plain copy
  1. <span style="font-size:12px;"><%@ page language="java" contentType="text/html; charset=UTF-8"    
  2.     pageEncoding="UTF-8"%>    
  3. >    
  4. <html>    
  5. <head>    
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
  7. <title>文档在线预览系统title>    
  8. <style>    
  9.     body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}    
  10.     a {color:#CE4614;}    
  11.     #msg-box {color: #CE4614; font-size:0.9em;text-align:center;}    
  12.     #msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}    
  13.     #msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}    
  14.     #msg-box .nav {margin-top:20px;}    
  15. style>    
  16.     
  17. head>    
  18. <body>    
  19. <div id="msg-box">    
  20.     <form name="form1"  method="post" enctype="multipart/form-data" action="docUploadConvertAction.jsp">    
  21.         <div class="title">    
  22.             请上传要处理的文件,过程可能需要几分钟,请稍候片刻。    
  23.         div>    
  24.         <p>    
  25.             <input name="file1" type="file">    
  26.         p>    
  27.         <p>    
  28.             <input type="submit" name="Submit" value="上传">    
  29.         p>    
  30.     form >    
  31. div>    
  32. body>    
  33. html>  span>  

3.创建转换页 docUploadConvertAction.jsp

[html]  view plain copy
  1. <span style="font-size:12px;"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>    
  2.     
  3. <%@page import="java.io.*"%>    
  4. <%@page import="java.util.Enumeration"%>    
  5. <%@page import="com.oreilly.servlet.MultipartRequest"%>    
  6. <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>    
  7. <%@page import="com.cectsims.util.DocConverter"%>    
  8. <%    
  9. //文件上传采用cos组件上传,可更换为commons-fileupload上传,文件上传后,保存在upload文件夹    
  10. //获取文件上传路径    
  11. String saveDirectory =application.getRealPath("/")+"upload";    
  12. //打印上传路径信息    
  13. System.out.println(saveDirectory);    
  14. //每个文件最大50m    
  15. int maxPostSize = 50 * 1024 * 1024 ;    
  16. //采用cos缺省的命名策略,重名后加1,2,3...如果不加dfp重名将覆盖    
  17. DefaultFileRenamePolicy dfp = new DefaultFileRenamePolicy();    
  18. //response的编码为"UTF-8",同时采用缺省的文件名冲突解决策略,实现上传,如果不加dfp重名将覆盖    
  19. MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8",dfp);    
  20. //MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize,"UTF-8");    
  21. //输出反馈信息    
  22.  Enumeration files = multi.getFileNames();    
  23.      while (files.hasMoreElements()) {    
  24.         System.err.println("ccc");    
  25.        String name = (String)files.nextElement();    
  26.        File f = multi.getFile(name);    
  27.        if(f!=null){    
  28.          String fileName = multi.getFilesystemName(name);    
  29.          //获取上传文件的扩展名    
  30.          String extName=fileName.substring(fileName.lastIndexOf(".")+1);    
  31.          //文件全路径    
  32.          String lastFileNamesaveDirectory+"\\" + fileName;    
  33.          //获取需要转换的文件名,将路径名中的'\'替换为'/'    
  34.          String converfilename = saveDirectory.replaceAll("\\\\", "/")+"/"+fileName;    
  35.          System.out.println(converfilename);    
  36.          //调用转换类DocConverter,并将需要转换的文件传递给该类的构造方法    
  37.          DocConverter d = new DocConverter(converfilename);    
  38.          //调用conver方法开始转换,先执行doc2pdf()将office文件转换为pdf;再执行pdf2swf()将pdf转换为swf;    
  39.          d.conver();    
  40.          //调用getswfPath()方法,打印转换后的swf文件路径    
  41.          System.out.println(d.getswfPath());    
  42.          //生成swf相对路径,以便传递给flexpaper播放器    
  43.          String swfpath = "upload"+d.getswfPath().substring(d.getswfPath().lastIndexOf("/"));    
  44.          System.out.println(swfpath);    
  45.          //将相对路径放入sessio中保存    
  46.          session.setAttribute("swfpath", swfpath);    
  47.          out.println("上传的文件:"+lastFileName);    
  48.          out.println("文件类型"+extName);    
  49.          out.println("<hr>");    
  50.        }    
  51.      }    
  52.     
  53. %>    
  54. >    
  55. <html>    
  56. <head>    
  57. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
  58. <title>Insert title heretitle>    
  59. <style>    
  60.     body {margin-top:100px;background:#fff;font-family: Verdana, Tahoma;}    
  61.     a {color:#CE4614;}    
  62.     #msg-box {color: #CE4614; font-size:0.9em;text-align:center;}    
  63.     #msg-box .logo {border-bottom:5px solid #ECE5D9;margin-bottom:20px;padding-bottom:10px;}    
  64.     #msg-box .title {font-size:1.4em;font-weight:bold;margin:0 0 30px 0;}    
  65.     #msg-box .nav {margin-top:20px;}    
  66. style>    
  67. head>    
  68. <body>    
  69.     <div>    
  70.         <form name="viewForm" id="form_swf" action="documentView.jsp" method="POST">    
  71.             <input type='submit' value='预览' class='BUTTON SUBMIT'/>    
  72.         form>    
  73.     div>    
  74. body>    
  75. html>  span>  


4.创建查看页documentView.jsp

[html]  view plain copy
  1. <span style="font-size:12px;"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>    
  2. <%    
  3.     String swfFilePath=session.getAttribute("swfpath").toString();    
  4. %>    
  5. >    
  6. <html>    
  7. <head>    
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
  9. <script type="text/javascript" src="js/jquery.js">script>    
  10. <script type="text/javascript" src="js/flexpaper_flash.js">script>    
  11. <script type="text/javascript" src="js/flexpaper_flash_debug.js">script>    
  12. <style type="text/css" media="screen">     
  13.             html, body  { height:100%; }    
  14.             body { margin:0; padding:0; overflow:auto; }       
  15.             #flashContent { display:none; }    
  16.         style>     
  17.     
  18. <title>文档在线预览系统title>    
  19. head>    
  20. <body>     
  21.         <div style="position:absolute;left:50px;top:10px;">    
  22.             <a id="viewerPlaceHolder" style="width:820px;height:650px;display:block">a>    
  23.                 
  24.             <script type="text/javascript">     
  25.                 var fp = new FlexPaperViewer(       
  26.                          'FlexPaperViewer',    
  27.                          'viewerPlaceHolder', { config : {    
  28.                          SwfFile : escape('<%=swfFilePath%>'),    
  29.                          Scale : 0.6,     
  30.                          ZoomTransition : 'easeOut',    
  31.                          ZoomTime : 0.5,    
  32.                          ZoomInterval : 0.2,    
  33.                          FitPageOnLoad : true,    
  34.                          FitWidthOnLoad : false,    
  35.                          FullScreenAsMaxWindow : false,    
  36.                          ProgressiveLoading : false,    
  37.                          MinZoomSize : 0.2,    
  38.                          MaxZoomSize : 5,    
  39.                          SearchMatchAll : false,    
  40.                          InitViewMode : 'SinglePage',    
  41.                              
  42.                          ViewModeToolsVisible : true,    
  43.                          ZoomToolsVisible : true,    
  44.                          NavToolsVisible : true,    
  45.                          CursorToolsVisible : true,    
  46.                          SearchToolsVisible : true,    
  47.                             
  48.                          localeChain: 'en_US'    
  49.                          }});    
  50.             script>                
  51.         div>    
  52. body>    
  53. html>  span>  


5.创建转换类DocConverter.java

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

6.部署发布

启动tomcat,部署当前web应用

地址栏输入http://localhost:8080/ctcesims/documentUpload.jsp 如下图:


单击选择文件,选择您要上传的文档,然后单击上传,处理完成后,打印如下信息,如下图所示:


单击预览按钮,就会生成预览界面,如下图:


4.常见问题

若出现swf无法预览,请访问

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065

将生成swf的文件夹设置为信任文件位置。


    8.参考资料:http://blog.csdn.net/hil2000/article/details/8459940
                        http://www.cnblogs.com/star-studio/archive/2011/12/09/2281807.html
                       文件中文名乱码解决:http://blog.csdn.net/kunoy/article/details/7903258

其他优化
    解决flexpaper搜索文字时不能高亮的问题:  http://my.oschina.net/dianfusoft/blog/125450 
      flexpaper去简介去水印等:http://blog.csdn.net/zengraoli/article/details/7827840 

源码demo:
http://download.csdn.net/detail/fei1502816/6648553


五,修改解决txt文件转pdf时乱码问题


1, txt转pdf会发生乱码,(如果txt本身编码为utf-8则不会乱,否则会乱码)。
关于这个问题解决思路,
(1),把txt转成odt在转成pdf,可以成功解决乱码问题,缺点:无法删除odt文件,因为当openoffice


服务打开的时候odt文件是无法删除的。所以采用了下面的方法。
   (2),把txt按照其原来的编码读出来,然后再以utf-8的编码写到一个新的txt文件中去,然后再对这个新的


txt转为pdf,乱码解决。(这里要用到一个工具类,获取文件原始编码的类)
-------------更改部分-----------------------------
1.修改DocConverter.java类中的初始化方法及cofy方法,添加了cofy2方法
2,DocConverter.java类中调用了工具类EncodingDetect.java类中getJavaEncode方法获取文件原始编码

EncodingDetect.java下载链接

修改的文件

--------------------------------------------------------------------------------------------


package com.hl.zoneSystem_v01.utils;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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;


/**
 * @ClassName: DocConverter 
 * @Description: 文档转换 txt\office转pdf再转swf 
 * @project: zoneSystem_v01
 * @package: com.hl.zoneSystem_v01.utils
 * @author: hl
 * @version: V1.0
 * @since: JDK 1.6.0_21
 * @date: 2014-4-18 下午12:33:05
 */
public class DocConverter {

//SWFTools的安装路径   linux与windows各不同
private String SWFTools_Windows = "F:/sortware/testingsoftware/SWFTools/pdf2swf.exe ";
private String SWFTools_Linux = "pdf2swf ";

// 环境1:windows,2:linux(涉及pdf2swf路径问题)  调用工具类处理,根据回车符判断系统平台
private static final int environment = CommUtils.getOsType();
private String fileString;
private String outputPath = "";// 输入路径,如果不设置就输出在默认位置
private String fileName;
private File pdfFile;
private File swfFile;
private File docFile;
private File odtFile;
private String txtName;
public String swfFileName;//最后生成的swf文件 短文件名,不包括路径。



public DocConverter(String fileString) {
ini(fileString);
}


/*
* 重新设置 file @param fileString
*/
public void setFile(String fileString) {
ini(fileString);
}


/*
* 初始化 @param fileString
*/
private void ini(String fileString) {    
    try {    
    //生成绝对路径全名,包括路径+文件名
        this.fileString = fileString;
        fileName = fileString.substring(0, fileString.lastIndexOf(File.separator)); 
        
        
        docFile = new File(fileString);    
        String s = fileString.substring(fileString.lastIndexOf(File.separator) + 1,fileString.lastIndexOf("."));    
        fileName = fileName + File.separator + s;    
        // 用于处理TXT文档转化为PDF格式乱码,获取上传文件的名称(不需要后面的格式)    
        txtName = fileString.substring(fileString.lastIndexOf("."));    
        // 判断上传的文件是否是TXT文件    决绝乱码问题
        if (txtName.equalsIgnoreCase(".txt")) {    
            //方法一:
        // 定义相应的ODT格式文件名称    
            //odtFile = new File(fileName + ".odt");    
            // 将上传的文档重新copy一份,并且修改为ODT格式,然后有ODT格式转化为PDF格式    
            //this.copyFile(docFile, odtFile);    
            //pdfFile = new File(fileName + ".pdf"); // 用于处理PDF文档 
            
            //方法二:
            //将txt重新复制一份,转成utf-8在转成pdf就不会乱码了
            odtFile = new File((fileName+1) + ".txt"); 
            this.copyFile2(docFile, odtFile);
            pdfFile = new File(fileName + ".pdf"); // 用于处理PDF文档 
            
        } else if (txtName.equals(".pdf") || txtName.equals(".PDF")) {    
            pdfFile = new File(fileName+1 + ".pdf");    
            this.copyFile(docFile, pdfFile);    
        } else {    
            pdfFile = new File(fileName + ".pdf");    
        }    
        swfFile = new File(fileName + ".swf");   
        //获取swf文件,短文件名,不包含路径
        swfFileName = s + ".swf";
    } catch (Exception e) {    
        e.printStackTrace();    
    }    
}    


/**
* @Title: copyFile
* @Description: TODO
* @param: @param docFile2
* @param: @param odtFile2
* @return: void
* @author: hl
* @time: 2014-4-17 下午9:41:52
* @throws
*/
private void copyFile(File sourceFile,File targetFile)throws Exception{
//新建文件输入流并对它进行缓冲 
FileInputStream input = new FileInputStream(sourceFile);
BufferedInputStream inBuff = new BufferedInputStream(input);
// 新建文件输出流并对它进行缓冲
FileOutputStream output = new FileOutputStream(targetFile);
BufferedOutputStream outBuff  = new BufferedOutputStream(output);

// 缓冲数组 
byte[]b = new byte[1024 * 5];
int len;
while((len = inBuff.read(b)) != -1){
outBuff.write(b,0,len);
}
// 刷新此缓冲的输出流
outBuff.flush();
// 关闭流
inBuff.close();
outBuff.close();
output.close();
input.close();
}

/*
* 读取txt的方法  设置编码     txt转pdf有乱码情况(txt本身编码不是utf-8,时,如果本身为utf-8则不会乱码),
* 本例中采用先复制另一份txt文件出来,然后将其转化为utf-8格式,然后在转换为pdf就不会乱码了。
*/
@SuppressWarnings("unused")
private void copyFile2(File sourceFile,File targetFile)throws Exception{
//获取txt原始编码
String charSet = new EncodingDetect().getJavaEncode(sourceFile.getPath());
//新建文件输入流并对它进行缓冲 
FileInputStream input = new FileInputStream(sourceFile);
InputStreamReader input2 = new InputStreamReader(input,charSet);
BufferedReader bfr = new BufferedReader(input2);


// 新建文件输出流并对它进行缓冲
FileOutputStream output = new FileOutputStream(targetFile);
OutputStreamWriter out = new OutputStreamWriter(output,CommUtils.charSet);
BufferedWriter bfw = new BufferedWriter(out);

// 缓冲 一行一行的读
String line;
//获取系统平台换行符
String lineSeparator = System.getProperty("line.separator");
while((line = bfr.readLine()) != null){
bfw.write(line + lineSeparator);
}

//刷新
bfw.flush();
//关流
input.close();
input2.close();
bfr.close();
output.close();
out.close();
bfw.close();
}




/*
* 转为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);
//判断上传文件为pdf的情况,则无需在转换
if (txtName.equals(".pdf") || txtName.equals(".PDF")) {

}else if(txtName.equals(".txt") || txtName.equals(".TXT")){
converter.convert(odtFile, pdfFile);
// 关闭文件链接
connection.disconnect();
//删除odt文件
if(odtFile.exists()){
odtFile.delete();
}
}else{//office文件处理
converter.convert(docFile, pdfFile);
// close the connection
connection.disconnect();
}
System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath() + "****");
} catch (java.net.ConnectException e) {
// ToDo Auto-generated catch block
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 {
// 这里根据SWFTools安装路径需要进行相应更改
Process p = r.exec(SWFTools_Windows + 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 (Exception e) {
e.printStackTrace();
throw e;
}
} else if (environment == 2){// linux环境处理
try {
Process p = r.exec(SWFTools_Linux + 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 new RuntimeException();
}
}
} else {
System.out.println("****pdf不存在,无法转换****");
}
} else {
System.out.println("****swf已存在不需要转换****");
}

if (pdfFile.exists()) {
pdfFile.delete();
}
}


static String loadStream(InputStream in) throws IOException {
int ptr = 0;
//把InputStream字节流 替换为BufferedReader字符流 2013-07-17修改
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder buffer = new StringBuilder();
while ((ptr = reader.read()) != -1) {
buffer.append((char) ptr);
}
return buffer.toString();
}


/*
* 转换主方法
*/
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();

if (pdfFile.exists()) {
pdfFile.delete();
}
} catch (Exception e) {
// TODO: Auto-generated catch block
e.printStackTrace();
return false;
}


if (swfFile.exists()) {
return true;
} else {
return false;
}
}


/*
* 返回文件路径 @param s
*/
public String getswfPath() {
if (swfFile.exists()) {
String tempString = swfFile.getPath();
tempString = tempString.replaceAll("\\\\", "/");
return tempString;
} else {
return "";
}
}


/*
* 设置输出路径
*/
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");
}
}
}







}




--------------------------------------------------------------------------------------------


你可能感兴趣的:(开源项目与接口)