Java開發(fā)中Word轉(zhuǎn)PDF文件5種方案橫向評測
前段時間接了個項目,需要各種處理Word模板、轉(zhuǎn)PDF、簽章等等,非常頭疼,其中光是一個word轉(zhuǎn)PDF就折磨我好久,實現(xiàn)轉(zhuǎn)換很簡單,但是效果總是達不到滿意,于是我把市面上能找到的word轉(zhuǎn)pdf方法都試了個遍。現(xiàn)在把這些方案來做個橫向?qū)Ρ?,希望對大家能有幫助?/p>
對比的時候我選擇了兩個指標(biāo)來進行對比。
- 格式保真
- 經(jīng)過對比我發(fā)現(xiàn)對于一些比較簡單的word文檔,各種方法差別比較小,但一些復(fù)雜的word文檔差別就太大了,甚至有的轉(zhuǎn)換之后根本就不能用。所以格式保真是最重要的,就是指是否能夠100%保留word文檔的格式,分為五個等級
- 五星:肉眼看不出差別,轉(zhuǎn)換方法也不需要特殊的處理
- 四星:不影響頁面呈現(xiàn),但細節(jié)地方或特殊情況下會出現(xiàn)細微差異,通過程序的特殊處理可以解決。
- 三星:不影響頁面呈現(xiàn),出現(xiàn)明顯的跳頁的情況。轉(zhuǎn)換的時候word中的表格是最容易跳頁了。
- 二星:影響頁面呈現(xiàn),影響閱讀,格式出現(xiàn)明顯偏差,已經(jīng)影響正常閱讀。
- 一星:嚴重影響閱讀和頁面呈現(xiàn),格式混亂、字體錯亂、文檔內(nèi)容丟失等。
- 相素差異度
- 使用diffimage圖片相似度對比工具進行對比,最后得出diff百分比,軟件應(yīng)該是逐相素對比的,拿這個來做為參考不是很科學(xué),不過在同一尺度下還是能提供一定的格式保真度的數(shù)據(jù)參考
- 測試方法是把原版WORD文檔用PDF打印的方式導(dǎo)出PDF文件,再把原版PDF和各種不同技術(shù)方案生成的PDF全部轉(zhuǎn)成JPG文件進行對比。
- 兼容性
- 說起word編程不得不提到依賴于office的方法,但是現(xiàn)在服務(wù)器一般都是linux兼容也是需要考慮的指標(biāo)
- 性能
- 一般系統(tǒng)用到轉(zhuǎn)換的時候往往對性能也是有一定的要求的,所以這個也是很重要的參考指標(biāo)。
- 價格
- 這一點主要是開源和收費兩種,商用的話肯定也是重要參考指標(biāo)
- 文件大小
- 不算太重要,好吧,好像我是拿這個來湊數(shù)的。
關(guān)于Word轉(zhuǎn)PDF網(wǎng)上能找到的方案大概有六七種,我選了其中的5種,分別是:
aspose-words、docx4j、openoffice、poi、spire.doc
下面先來簡單介紹一下這五種方案
aspose-words
Aspose公司旗下的最全的一套office文檔管理方案,公司設(shè)在澳大利亞。
公司差不多是專做各種文件格式處理插件的,產(chǎn)品系列挺多,有興趣可以到官網(wǎng)上看看:
https://www.aspose.com/
收費價格
許可 | ||
---|---|---|
Developer Small Business - 1 Developer and 1 Deployment Location | 開發(fā)人員小型企業(yè)- 1個開發(fā)人員和1個部署位置 | 29,291 元 |
Developer OEM - 1 Developer and Unlimited Deployment Locations | 開發(fā)人員OEM - 1開發(fā)人員和無限部署地點 | 87,874 元 |
Site Small Business - Up to 10 Developers and up to 10 Deployment Locations | 站點小型企業(yè)-多達10個開發(fā)人員和多達10個部署地點 | 146,456元 |
Site OEM - Up to 10 Developers and Unlimited Deployment Locations | 站點OEM -多達10個開發(fā)人員和無限部署地點 | 410,077 元 |
技術(shù)支持服務(wù) | ||
Developer Small Business 1 Year Developer Support License - up to 3 incidents per year | 開發(fā)人員小型企業(yè)1年開發(fā)人員支持許可證-每年最多3起事故 | 2,923 元 |
Aspose Business Support 商業(yè)服務(wù) | ||
Developer Small Business 1 Year Business Support License - up to 6 incidents per year | 開發(fā)商小型企業(yè)1年業(yè)務(wù)支持許可證-每年最多6起事故 | 4,387 元 |
Developer OEM 1 Year Business Support License - up to 6 incidents per year | 開發(fā)人員OEM 1年業(yè)務(wù)支持許可證-每年最多發(fā)生6起事故 | 13,162 元 |
企業(yè)支持 | ||
Site Small Business 1 Year Enterprise Support License - up to 6 incidents per year | 網(wǎng)站小型企業(yè)1年企業(yè)支持許可證-每年最多6起事故 | 29,262 元 |
Site OEM 1 Year Enterprise Support License - up to 6 incidents per year | 站點OEM 1年企業(yè)支持許可證-每年最多發(fā)生6起事故 | 87,786 元 |
兼容性
不需要依賴任何組件,不依賴操作系統(tǒng)。
poi
大名鼎鼎的apache的開源組件,應(yīng)用非常廣泛,我想主要原因可能是開源吧。
官網(wǎng):https://poi.apache.org/
兼容性
組件拆分較細,引用一些類庫,但都問題不大,不依賴操作系統(tǒng)。
OpenOffice
Apache旗下又一開源組件,前身是1998年一家德國公司StarDivision所研發(fā)出來的一個辦公室軟件,稱之為StarOffice。1999年8月被sun公司收購。2010年團隊成員分家,分出來的一批成立了新團隊做一個LibreOffice。2011年6月Oracle將其捐贈給Apache基金會。
官網(wǎng):https://www.openoffice.org/
兼容性
OpenOffice本身就是一套Office軟件,該方案需要使用jodconverter組件配合OpenOffice完成轉(zhuǎn)換,當(dāng)然也可以使用LibreOffice進行轉(zhuǎn)換,這次并沒有測試這個方案
jodconverter:https://sourceforge.net/projects/jodconverter/files/
spire.doc
搜到的時候剛剛打開官網(wǎng)猛一看以為是國外的公司,沒想到一切到中文版網(wǎng)頁才發(fā)現(xiàn)是成都冰藍科技有限公司出品的,真正的國產(chǎn)。剛剛查到官網(wǎng)的時候是非常期待他的表現(xiàn)的。
官網(wǎng):https://www.e-iceblue.com/ https://www.e-iceblue.cn/
兼容性
不需要依賴任何組件,不依賴操作系統(tǒng)。
價格
只截圖了spire.doc組件的價格,其它還有很多組件。用公司名和郵箱可以申請一個月的試用license。
docx4j
澳大利亞一公司贊助的開源組件,一查資料才知道作者是這家公司的CEO。剛剛打開官網(wǎng)的時候就一個感覺,官網(wǎng)做的太爛,不太相信這組件能有什么好的表現(xiàn)。下面的圖就是官網(wǎng)截圖,相信你會有一樣的感覺。
有一個開源版,還有一個Docx4j Enterprise Edition。沒有仔細研究,只測試了開源版。
官網(wǎng):https://www.docx4java.org/
兼容性
不依賴其它組件,不依賴操作系統(tǒng)
除了以上幾種方案以外,還查到有其它幾乎方案,比如IText、document4j等。像IText是依賴于poi的,document4j是依賴于office軟件的,所以不測試了。
測試的word文檔我選取的是我項目中用到的一個文檔,正好是遇到比較容易出現(xiàn)跳頁的情況。拿來做橫向測試非常合適,先來欣賞一下word文檔吧。
文檔中標(biāo)題、表格、頁眉頁腳、圖片、文本框幾乎都用到了,準(zhǔn)備就緒,開始測試。。
各種組件的代碼編寫方法
aspose.words
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>22.11</version>
<classifier>jdk17</classifier>
</dependency>
package com.hawkon.aspose;
import com.aspose.words.*;
public class WordToPdfTest_Aspose {
public static void wordToPdf(String wordFile, String pdfFile) throws Exception {
Document wordDoc = new Document(wordFile);
PdfSaveOptions pso = new PdfSaveOptions();
wordDoc.save(pdfFile, pso);
}
}
aspose這個組件是商用的,正常的寫上如上所示,但是試用版導(dǎo)出的PDF文件是閹割版的,沒法進行測試對比,所以我用了網(wǎng)上留傳(po jie)的版本,有需要的朋友可以關(guān)注我的公眾號(姚Sir面試間),回復(fù)aspose就可以得到。
本地jar包導(dǎo)入方法
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>19.5.0</version>
<scope>system</scope>
<systemPath>D:/Code/PdfTest/lib/aspose-words-19.5jdk.jar</systemPath>
</dependency>
docx4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-Internal</artifactId>
<version>8.2.4</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>8.2.4</version>
</dependency>
package com.hawkon.docx4j;
import org.docx4j.Docx4J;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
public class WordToPdfTest_Docx4j {
public static void wordToPdf(String docFile,String pdfFile) throws Exception {
final Logger logger = LoggerFactory.getLogger(Docx4J.class);
WordprocessingMLPackage pkg = Docx4J.load(new File(docFile));
Mapper fontMapper = new IdentityPlusMapper();
fontMapper.put("隸書", PhysicalFonts.get("LiSu"));
fontMapper.put("宋體", PhysicalFonts.get("SimSun"));
fontMapper.put("微軟雅黑", PhysicalFonts.get("Microsoft Yahei"));
fontMapper.put("黑體", PhysicalFonts.get("SimHei"));
fontMapper.put("楷體", PhysicalFonts.get("KaiTi"));
fontMapper.put("新宋體", PhysicalFonts.get("NSimSun"));
fontMapper.put("華文行楷", PhysicalFonts.get("STXingkai"));
fontMapper.put("華文仿宋", PhysicalFonts.get("STFangsong"));
fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
fontMapper.put("幼圓", PhysicalFonts.get("YouYuan"));
fontMapper.put("華文宋體", PhysicalFonts.get("STSong"));
fontMapper.put("華文中宋", PhysicalFonts.get("STZhongsong"));
fontMapper.put("等線", PhysicalFonts.get("SimSun"));
fontMapper.put("等線 Light", PhysicalFonts.get("SimSun"));
fontMapper.put("華文琥珀", PhysicalFonts.get("STHupo"));
fontMapper.put("華文隸書", PhysicalFonts.get("STLiti"));
fontMapper.put("華文新魏", PhysicalFonts.get("STXinwei"));
fontMapper.put("華文彩云", PhysicalFonts.get("STCaiyun"));
fontMapper.put("方正姚體", PhysicalFonts.get("FZYaoti"));
fontMapper.put("方正舒體", PhysicalFonts.get("FZShuTi"));
fontMapper.put("華文細黑", PhysicalFonts.get("STXihei"));
fontMapper.put("宋體擴展", PhysicalFonts.get("simsun-extB"));
fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
pkg.setFontMapper(fontMapper);
Docx4J.toPDF(pkg, new FileOutputStream(pdfFile));
}
}
這個組件按官方提供的寫法不行,出來的漢字全成了麻將里的白板,還是得用網(wǎng)上的示例,加上字體映射之后可以了。不知道放到linux服務(wù)器上會是什么樣。
OpenOffice
該方案的思路其實是OpenOffice提供軟件支持,Java代碼又利用jodconverter組件調(diào)用OpenOffice,其實和以前的程序調(diào)用 com組件是一個思路。而OpenOffice還提供了web服務(wù)版本,可以用類似tcp的方式調(diào)用來完成生成的工作。
本次測試就采用的是這種方法,因此需要安排OpenOffice軟件,安裝后在安裝目錄執(zhí)行以下命令:
soffice.exe -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
<dependency>
<groupId>org.apache.directory.studio</groupId>
<artifactId>org.apache.commons.io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>juh</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.openoffice</groupId>
<artifactId>unoil</artifactId>
<version>3.0.0</version>
</dependency>
package com.hawkon.openoffice;
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;
import java.io.File;
import java.net.ConnectException;
public class WordToPdfTest_openoffice {
public static void wordToPdf(String docFile,String pdfFile) throws ConnectException {
// 源文件目錄
File inputFile = new File(docFile);
// 輸出文件目錄
File outputFile = new File(pdfFile);
if (!outputFile.getParentFile().exists()) {
outputFile.getParentFile().exists();
}
// 連接openoffice服務(wù)
OpenOfficeConnection connection = new SocketOpenOfficeConnection(
"127.0.0.1", 8100);
connection.connect();
// 轉(zhuǎn)換word到pdf
DocumentConverter converter = new OpenOfficeDocumentConverter(
connection);
converter.convert(inputFile, outputFile);
// 關(guān)閉連接
connection.disconnect();
}
}
poi
poi雖然很強大,但用起來越是最痛苦的,用的組件多,各種版本沖突,各種缺少組件。不知道網(wǎng)上發(fā)貼子的那些大神是怎么研究出來哪個版本對應(yīng)哪個版本的,非常佩服他們。測試的時候我就在想,有沒有什么能查詢各種Jar包版本依賴關(guān)系的網(wǎng)站。如果有,請看客們告訴我一場。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10.1</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.core</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.itext.extension</artifactId>
<version>2.0.1</version>
</dependency>
package com.hawkon.poi;
import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.*;
public class WordToPdf_Poi {
public static void wordToPdf(String docFile,String pdfFile) throws IOException {
XWPFDocument document;
InputStream doc = new FileInputStream(docFile);
document = new XWPFDocument(doc);
PdfOptions options = PdfOptions.create();
OutputStream out = new FileOutputStream(pdfFile);
PdfConverter.getInstance().convert(document, out, options);
doc.close();
out.close();
}
}
spire
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>10.11.6</version>
<scope>system</scope>
<systemPath>D:/Code/PdfTest/lib/Spire.Doc.jar</systemPath>
</dependency>
package com.hawkon.spire;
import com.spire.doc.*;
public class WordToPdf_spire {
public static void wordToPdf(String docFile,String pdfFile){
com.spire.license.LicenseProvider.setLicenseFile("D:\\Code\\PdfTest\\license.elic.xml");
//實例化Document類的對象
Document doc = new Document();
//加載Word
doc.loadFromFile(docFile);
//保存為PDF格式
doc.saveToFile(pdfFile,FileFormat.PDF);
}
}
測試結(jié)果
測試的時候有性能指標(biāo),所以我覺得還是把我電腦的硬件參數(shù)發(fā)一下,大家可以作為參考。
處理器 Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz
機帶 RAM 16.0 GB (15.8 GB 可用)
系統(tǒng)類型 64 位操作系統(tǒng), 基于 x64 的處理器
轉(zhuǎn)換結(jié)果與原版對比
下面依次放出5種方案的轉(zhuǎn)換結(jié)果對比,左邊為原版,右邊為五種方案的轉(zhuǎn)換結(jié)果,并且我也給出我的格式保真度評價
aspose.words對比圖
從圖中可以看出,除表格處有一點錯位以外,看出不明顯的差別,已經(jīng)非常厲害了。我給4星。
docx4j
有點慘不忍睹呀,表格嚴重錯位,甚至有7頁變8頁的趨勢。與原版格式嚴重失真。但勉強能閱讀。我給2星
OpenOffice
格式基本保留住了,但是位置錯的比較離譜。好在基本不影響閱讀。我給3星。
poi
頁眉錯亂嚴重,影響閱讀,這有跳頁的情況出現(xiàn)。我給1星。
spire
和aspose一樣,除表格處有一點錯位以外,看出不明顯的差別,國產(chǎn)軟件能做到這種程序非常NICE了。我給4星。
評測結(jié)果
最后的評測結(jié)果如下,從轉(zhuǎn)換效果的角度來說,比較滿意的是aspose和spire.doc,而開源的轉(zhuǎn)換一些比較簡單的文章還可以,但企業(yè)開發(fā)的時候很多時候是要求PDF格式和WORD文檔高度保持一致的。其它三種方案的表現(xiàn)肯定是不夠的。
值得一提的是,沒想到國產(chǎn)軟件spire.doc表現(xiàn)還不錯,除性能稍差一點,其它都不錯,最重要的是價格還是比較親民的。
而且這家公司的產(chǎn)品應(yīng)該是已經(jīng)走出國門了,希望國產(chǎn)軟件可以做出更多的精品,也希望大家多多支持國產(chǎn)軟件。文章來源:http://www.zghlxwxcb.cn/news/detail-780681.html
最后聲明兩點:文章來源地址http://www.zghlxwxcb.cn/news/detail-780681.html
- 文中測試樣本文檔中的公司名、電話純屬虛構(gòu),如有累同純屬巧合,如果發(fā)生意外涉及到他人隱私,請聯(lián)系我修改文章,謝謝。
- 我沒有收spire.doc一分錢,確實是沒想到國產(chǎn)中間件已經(jīng)這么優(yōu)秀了,如果文章起到廣告效果了,spire.doc的公司愿意贊助我一點,我絲毫不介意,誰能跟錢有仇呢,哈哈。。。。
到了這里,關(guān)于Java開發(fā)中Word轉(zhuǎn)PDF文件5種方案橫向評測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!