`
hz_chenwenbiao
  • 浏览: 994615 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[JODConverter]word转pdf心得分享(转)

阅读更多

官方网站:  http://www.artofsolving.com/opensource/jodconverter 

下载地点: 
  http://www.artofsolving.com/opensource/jodconverter 
  http://zh.openoffice.org/new/zh_tw/downloads.html 
  目前版本: JODConverter v2.2.1, OpenOffice v3.0.0 
  使用需求: JDK1.4以上, 安装OpenOffice v2.0.3以上 


  基本简介: 
  
JODConverter主要的功能是用来做各种档案的转换. 目前测试过, Word,Excel,PowerPoint转PDF都是没问题的. 
  因为JODConverter是透过OpenOffice来做转换, 所以使用前需要先安装OpenOffice, 并且将OpenOffice的Service启动, 才可以使用. 

OpenOffice.org具有一个鲜为人知的特性就是其能够作为一个服务来运行,而这种能力具有一定的妙用。举例来说,你可以把openoffice.og变成一个转换引擎,利用这种转换引擎你可以通过网络接口或命令行工具对文件的格式进行转换,JODConverter可以帮助你实现OpenOffice.org的这种文件转换功能。

为了将OpenOffice.org作为一个转换引擎,你必须以服务的方式将它启动,使它在某个特定的端口监听连接,在Linux平台你可以用如下的命令启动openoffice.org:
soffice -headless -accept=”socket,port=8100;urp;”(我在linux下使用
soffice -headless -accept=”socket,host=127.0.0.1,port=8100;urp;”,open office server是开启来了,但是文件转换不成功,异常是连接失败,这个很可以是你用jodconverter来转换时使用的是localhost,而当你的机有host配置文件里没有将localhost与127.0.0.1对应起来时,就无法解析了,这里可以修改host文件或去掉host=127.0.0.1,这样我试过可以成功)

在Windows平台, 使用如下命令:
“C:\Program Files\OpenOffice.org 2.2\program\soffice” -accept=”socket,port=8100;urp;”

  使用教学: 
  Step1: 安装OpenOffice 
  Step2: 启动OpenOffice Service 


    

     1 cd C:\Program Files\OpenOffice.org 3\program 

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

  Step3:将JODConverter的Jar档放进专案中的Library, 请检查你的专案是否包含以下的Jar档: 

  jodconverter-2.2.1.jar 
  jurt-2.3.0.jar 
  xstream-1.2.2.jar 
  ridl-2.3.0.jar 
  commons-io-1.3.1.jar 
  juh-2.3.0.jar 
  slf4j-api-1.4.3.jar 
  unoil-2.3.0.jar 
  slf4j-jdk14-1.4.3.jar 

  Step4: 准备一个word档放在c:/document.doc 
  Step5: 执行以下程式 


import java.io.File; 

  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; 

  public class JodDemo { 

  public static void main(String[] args) throws Exception{ 

  File inputFile = new File("c:/document.doc"); 

  File outputFile = new File("c:/document.pdf"); 

  // connect to an OpenOffice.org instance running on port 8100 

  OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); 

  connection.connect(); 

  // convert 

  DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 

  converter.convert(inputFile, outputFile); 

  // close the connection 

  connection.disconnect(); 

  } 

  } 

 程式说明: 

  程式的部份相当简洁, 特别要注意的地方是第12行连线的port必须与你启动OpenOffice的Port相同, 
  另外JODConverter预设是用副档名作文件种类的判断, 所以副档名必须要正确才行. 
    如果副档名比较特别的话, 就必须在convert()的时候强制指定Document Type. 

心得: 
  JODConverter使用起来相当方便, 官网也提供War档让JODConverter变成Web Service提供给不同的语言来呼叫. 
  特别要注意的是, OpenOffice Service并不是ThreadSafe的, 多个Web AP在使用的时候必须要注意. 



那我也來補充一些好了 
之前也在試這個檔案轉換的程式 
程式最好加上 try-catch 
因為之前发現有些檔案 format 不能转,发生 Exception 后,connection 不會自动切断,程序会hand 住 
所以改成如下方式: 


public void convert(String input, String output){ 
        File inputFile = new File(input); 
        File outputFile = new File(output); 
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); 
        try { 
            connection.connect(); 
            DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 
            converter.convert(inputFile, outputFile); 
        } catch(Exception e) { 
            e.printStackTrace(); 
        } finally { 
            try{ if(connection != null){connection.disconnect(); connection = null;}}catch(Exception e){} 
        } 
    } 


再來,明明就是 open office 的檔案,卻生不能轉換的問題。例如:*.STW, *.SXD, *.ODF 等,後來才知道可以自行指定來源檔和輸出檔的 mime-type,程式如下: 


public void convertSTW(String input, String output){ 
        DocumentFormat stw = new DocumentFormat("OpenOffice.org 1.0 Template", DocumentFamily.TEXT, "application/vnd.sun.xml.writer", "stw"); 
        DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry(); 
        DocumentFormat pdf = formatReg.getFormatByFileExtension("pdf"); 
        File inputFile = new File(input); 
        File outputFile = new File(output); 
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100); 
        try { 
            connection.connect(); 
            DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 
            converter.convert(inputFile, stw, outputFile, pdf); 
        } catch(Exception e) { 
            e.printStackTrace(); 
        } finally { 
            try{ if(connection != null){connection.disconnect(); connection = null;}}catch(Exception e){} 
        } 
    } 

上面的程式是轉換 STW 到 PDF,如果是 SXD / ODF 則只需要變更 DocumentFormat 的內容即可。 


DocumentFormat sxd = new DocumentFormat("OpenOffice.org 1.0 Drawing", DocumentFamily.DRAWING, "application/vnd.sun.xml.sraw", "sxd"); 

DocumentFormat odf = new DocumentFormat("OpenDocument Math", DocumentFamily.TEXT, "application/vnd.oasis.opendocument.formula", "odf"); 

 所有 default support 的 DocumentFormat 都在 com.artofsolving.jodconverter.DefaultDocumentFormatRegistry 裡,但並非所有 open office 支援的 file format 都有,所以要像上面的方法自行去定义 DocumentFormat,至于它里面的参数可以从jodconverter-2.2.2.jar包的com.artofsolving.jodconverter包下的document-formats.xml文件里面得到,这样就可以完成多种格式的转换,如open office,ms office , wps office及所有的纯文本文件。


在此獻給所有需要作 File Convert 的人試試。 
免錢的,最好用。還有 source code 可以自己改。 


 

分享到:
评论
8 楼 wenlongsust 2016-06-17  
openoffice和文件不在同一个服务器上,用过吗?
7 楼 lsioui 2013-12-10  
能否把xml格式的word转换成pdf?
6 楼 李娜869736982 2013-12-06  
请问 当word文档里面有 类似目录这种超链接形式,怎么转换为pdf后,超链接部分就没有了呢?
5 楼 eppen 2013-04-26  
LeWeLa 写道
如何通过调用jodconverter的接口将转换成的PDF加密,请大虾们指点!

文档转换后的pdf ,可以通过iText随便操作。
4 楼 LeWeLa 2013-04-02  
如何通过调用jodconverter的接口将转换成的PDF加密,请大虾们指点!
3 楼 chinacq 2012-03-22  
我目前遇到一个问题:一个word2003的文档,能正常打开,没有加密,转换会报:
Exception in thread "main" com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException: conversion failed: could not load input document
就是在conver()方法的时候,但是,如果我将word里面的东西复制到本机上的word里,就可以转换成功。
    还一个问题就是什么的东西转换不了?office的,我目前遇到 的就是就有一个之前提到的问题,还有一个就是一种pdf文档。
2 楼 海豚12315 2011-12-02  
怎样在多线程下开启Openoffice服务呢
1 楼 rianpeny 2011-04-02  
请教个问题,在多线程应用环境中(有大量的并发请求用于word文件到html文件的转换),Openoffice应怎样调用呢?

1、用监听器,当应用启动时创建一个Openoffice连接,供所有程序调用?

2、每次调用时都先new SocketOpenOfficeConnection(8100); 然后去connect(),然后再convert,后后disconnect()?


博主有这方面的经验么,请指教。


相关推荐

Global site tag (gtag.js) - Google Analytics