java实现类似百度文库功能

jopen 6年前

公司需要开发一个类似百度文库功能的管理站,在网上找了好久,主要有两种实现方法,我在这里根据网上一篇文章,总结了一下具体的实现。

首先下载必要的文件。

1、SWF显示组件 flexpaper  下载地址 http://flexpaper.devaldi.com/

2、DOC文件转换为PDF文件 openoffice3.2

3、PDF文件转换SWF文件  pdf2swf.exe

4、实现在java类中操作openoffice3.2 的类包  jodconverter-2.2.2


flexpaper可以去上面的官网地址下载,但直接下载的组件会有广告和一些不需要用到的功能,所以最好是自己下载Flex源码进行修改

接下来要通过java类来实现文件类型的转换,在网上直接找到该类的代码。

package com;    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格式转换   *    * @author Administrator   *    */  public class DocConverter {   private static final int environment = 1;// 环境 1:windows 2:linux              // (只涉及pdf2swf路径问题)   private String fileString;   private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置   private String fileName;   private File pdfFile;   private File swfFile;   private File docFile;     public DocConverter(String fileString) {    ini(fileString);   }     /**    * 重新设置file    *     * @param fileString    */   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    */   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:/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();   }     /**    * 转换主方法    */   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;    }      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");     }    }   }     public static void main(String s[]) {    DocConverter d = new DocConverter("D:/1.doc");    d.conver();   }  }
贴入上面代码前

第一步:先确认OpenOffice是否已经安装,因为在代码中要引入到文件安装的路径

第二步:确认你的项目中引入了jodconverter-2.2.2的jar包

第三步:在DOS中启动OpenOffice的服务

找到OpenOffice的安装路径并执行下面代码

C:\Program Files\OpenOffice.org 3\program  soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard

注:我在执行上面代码时,DOS报出了找不到–nofirststartwizard文件的异常,所以我去掉了–nofirststartwizard这一段,执行也成功了。

C:\Program Files\OpenOffice.org 3\program  soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;"

确认所有准备工作都完成后,在下面代码中变更你pdf2swf.exe的文件位置

Process p = r.exec("D:/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");
最后在main方法传入你要转换的文件路径和文件名,执行就可以生成swf文件了。


在WEB项目中,生成的文件名可以根据自己的要求来变更,最终只用掉用上面的工具类代码就可以了。