承上啟下,可折疊
上一篇說的是:服務器是windows server時,用jacob將msoffice(指的是word,excel,ppt)轉換成pdf。
若被部署項目的服務器是centOS等linux server時,就不能用之前的上述說的那種方式了。
在上一篇說到openoffice將msoffice轉成pdf的時候會存在排版錯位的問題,或者有的內容消失了,這是因為msoffice中的一些特有格式,openoffice不識別解析不了導致的。當然大部分的普通msoffice文檔轉換成pdf時,效果還是令人滿意的。
所以這次說一下怎么用openoffice完成msoffice到pdf的轉換。
PS:本文說的是java如何調用本機(當前服務器)的openoffice服務進行文檔轉換;調用其他服務器上的openoffice進行文檔轉換下一次再說。
1.前提條件
本機測試,本機安裝一個openoffice軟件即可。
若是被部署項目的服務器,可以在服務器本地安裝一個openoffice軟件;也可以在其他服調用其他服務器上的openoffice服務進行文檔轉換。
openoffice的下載地址:http://www.openoffice.org/
我本機的openoffice軟件安裝目錄:D:\software\OpenOffice 4 ,如下圖所示:
2.創建項目,引入jar包
1) maven項目。我本地的pom.xml配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>indi.johnny</groupId> <artifactId>openoffice-convert</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> <dependency> <groupId>com.github.livesense</groupId> <artifactId>jodconverter-core</artifactId> <version>1.0.5</version> </dependency> </dependencies> </project>
2) 普通java項目 將下圖中的jar包從這個地址下載下來引入項目即可: http://www.mvnrepository.com/artifact/com.github.livesense/jodconverter-core/1.0.5 ; guava包也可以在 http://www.mvnrepository.com搜到,下載引入項目即可。
大概的jar包如圖所示:
3.上代碼
package indi.johnny.convert; import java.io.File; import java.io.FileNotFoundException; import org.artofsolving.jodconverter.OfficeDocumentConverter; import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.OfficeManager; //轉換文檔為pdf public class OpenOfficePdfConvert { /** * @param args */ private static OfficeManager officeManager; private static String OFFICE_HOME = "D:/software/OpenOffice 4/"; private static int port[] = { 8100 }; public void convert2PDF(String inputFile, String outputFile) throws FileNotFoundException { startService(); System.out.println("進行文檔轉換轉換:" + inputFile + " --> " + outputFile); OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); converter.convert(new File(inputFile), new File(outputFile)); stopService(); System.out.println(); } // 打開服務器 public static void startService() { DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); try { System.out.println("准備啟動服務...."); configuration.setOfficeHome(OFFICE_HOME);// 設置OpenOffice.org安裝目錄 configuration.setPortNumbers(port); // 設置轉換端口,默認為8100 configuration.setTaskExecutionTimeout(1000 * 60 * 5L);// 設置任務執行超時為5分鍾 configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);// 設置任務隊列超時為24小時 officeManager = configuration.buildOfficeManager(); officeManager.start(); // 啟動服務 System.out.println("office轉換服務啟動成功!"); } catch (Exception ce) { System.out.println("office轉換服務啟動失敗!詳細信息:" + ce); } } // 關閉服務器 public static void stopService() { System.out.println("關閉office轉換服務...."); if (officeManager != null) { officeManager.stop(); } System.out.println("關閉office轉換成功!"); } public static void main(String[] args) throws Exception { String path = "C:/Users/johnny/Desktop/文檔/20170420/test/001/"; OpenOfficePdfConvert opc = new OpenOfficePdfConvert(); opc.convert2PDF(path+"1.docx", path+"1.pdf"); } }
將代碼中的 OFFICE_HOME換成自己的openoffice的安裝路徑,端口8100不用動。
找一個msoffice文檔測試運行一下,應該是可以的。