目前版本: JODConverter v2.2.1, OpenOffice v3.0.0 
使用需求: JDK1.4以上, 安裝OpenOffice v2.0.3以上 
基本簡介: 
JODConverter 主要的功能是用來做各種檔案的轉換. 目前測試過, Word,Excel,PowerPoint轉PDF都是沒問題的. 
因為JODConverter 是透過OpenOffice來做轉換, 所以使用前需要先安裝OpenOffice, 並且將OpenOffice的Service啟動, 才可以使用. 
使用教學: 
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: 執行以下程式 

 

  1. import java.io.File;   
  2. import com.artofsolving.jodconverter .DocumentConverter;   
  3. import com.artofsolving.jodconverter .openoffice.connection.OpenOfficeConnection;   
  4. import com.artofsolving.jodconverter .openoffice.connection.SocketOpenOfficeConnection;   
  5. import com.artofsolving.jodconverter .openoffice.converter.OpenOfficeDocumentConverter;   
  6.  
  7. public class JodDemo {   
  8. public static void main(String[] args) throws Exception{   
  9. File inputFile = new File("c:/document.doc");   
  10. File outputFile = new File("c:/document.pdf");   
  11. // connect to an OpenOffice.org instance running on port 8100   
  12. OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);   
  13. connection.connect();   
  14. // convert   
  15. DocumentConverter converter = new OpenOfficeDocumentConverter(connection);   
  16. converter.convert(inputFile, outputFile);   
  17. // close the connection   
  18. connection.disconnect();   
  19. }   
  20. }  


程式說明: 
程式的部份相當簡潔, 特別要注意的地方是第12行連線的port必須與你啟動OpenOffice的Port相同, 
另外JODConverter 預設是用副檔名作文件種類的判斷, 所以副檔名必須要正確才行. 
如果副檔名比較特別的話, 就必須在convert()的時候強制指定Document Type. 

心得: 
JODConverter 使用起來相當方便, 官網也提供War檔讓JODConverter 變成Web Service提供給不同的語言來呼叫.
特別要注意的是, OpenOffice Service並不是ThreadSafe的, 多個Web AP在使用的時候必須要注意. 

參考資料: 
http://www.artofsolving.com/opensource/jodconverter 

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

 

  1. public void convert(String input, String output){   
  2.         File inputFile = new File(input);   
  3.         File outputFile = new File(output);   
  4.         OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);   
  5.         try {   
  6.             connection.connect();   
  7.             DocumentConverter converter = new OpenOfficeDocumentConverter(connection);   
  8.             converter.convert(inputFile, outputFile);   
  9.         } catch(Exception e) {   
  10.             e.printStackTrace();   
  11.         } finally {   
  12.             tryif(connection != null){connection.disconnect(); connection = null;}}catch(Exception e){}   
  13.         }   
  14.     }  


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

 

  1. public void convertSTW(String input, String output){   
  2.         DocumentFormat stw = new DocumentFormat("OpenOffice.org 1.0 Template", DocumentFamily.TEXT, "application/vnd.sun.xml.writer""stw");   
  3.         DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();   
  4.         DocumentFormat pdf = formatReg.getFormatByFileExtension("pdf");   
  5.         File inputFile = new File(input);   
  6.         File outputFile = new File(output);   
  7.         OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);   
  8.         try {   
  9.             connection.connect();   
  10.             DocumentConverter converter = new OpenOfficeDocumentConverter(connection);   
  11.             converter.convert(inputFile, stw, outputFile, pdf);   
  12.         } catch(Exception e) {   
  13.             e.printStackTrace();   
  14.         } finally {   
  15.             tryif(connection != null){connection.disconnect(); connection = null;}}catch(Exception e){}   
  16.         }   
  17.     }  






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

  1. DocumentFormat sxd = new DocumentFormat("OpenOffice.org 1.0 Drawing", DocumentFamily.DRAWING, "application/vnd.sun.xml.sraw""sxd");   
  2.  
  3. 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。