一、概述 生成PDF文檔通常涉及使用模板引擎、PDF庫以及數據填充。常見以下幾種方法: iText:iText是一個強大的PDF庫,支持創建和操作PDF文檔。使用場景: 您可以使用iText來直接構建PDF文檔,也可以將其與模板引擎結合使用,通過數據填充來生成PDF。 Apache PDFBox: ...
一、概述
生成PDF文檔通常涉及使用模板引擎、PDF庫以及數據填充。常見以下幾種方法:
iText:
iText是一個強大的PDF庫,支持創建和操作PDF文檔。
使用場景: 您可以使用iText來直接構建PDF文檔,也可以將其與模板引擎結合使用,通過數據填充來生成PDF。
Apache PDFBox:
PDFBox是Apache軟體基金會的一個項目,提供創建和處理PDF文檔的功能。
使用場景: PDFBox可用於構建PDF文檔,您可以將其用於模板生成PDF。
Apache FOP (Formatting Objects Processor):
FOP是Apache XML Graphics項目的一部分,用於將XML文檔轉換為PDF、PS、PNG等格式。
使用場景: FOP通常與XSL-FO(可擴展樣式語言 - 格式化對象)一起使用,通過XSL-FO模板生成PDF。
Thymeleaf:
Thymeleaf是一個用於Web和獨立環境的現代伺服器端Java模板引擎。
使用場景: Thymeleaf可以用於生成HTML模板,然後通過轉換庫(如Flying Saucer)將HTML轉換為PDF。
Freemarker和Velocity:
Freemarker和Velocity是兩個常見的模板引擎,可以用於生成文本模板。
使用場景: 您可以使用這些引擎生成包含占位符的文本模板,然後使用PDF庫將其轉換為PDF。
JasperReports:
簡介: JasperReports是一個用於生成報表的開源報表引擎。
使用場景: JasperReports支持定義報表模板,將數據與模板結合生成PDF報表。
Flying Saucer(XHTMLRenderer):
Flying Saucer是一個基於Java的渲染引擎,可將XHTML和CSS轉換為PDF。
使用場景: 您可以使用Flying Saucer來渲染HTML模板,並將其轉換為PDF。
二、使用
1、word 轉 PDF ,使用aspose工具包
引入jar包:可以通過maven,或者項目本地路徑指定
<!--word轉PDF mvn install:install-file -DgroupId=com.aspose -DartifactId=aspose.slides -Dversion=15.9.0 -Dpackaging=jar -Dfile=e:/test/jar/aspose.slides-15.9.0.jar mvn install:install-file -DgroupId=com.aspose -DartifactId=aspose-cells -Dversion=8.5.2 -Dpackaging=jar -Dfile=e:/test/jar/aspose-cells-8.5.2.jar mvn install:install-file -DgroupId=com.aspose -DartifactId=aspose-words -Dversion=18.6 -Dpackaging=jar -Dfile=e:/test/jar/aspose-words-18.6-jdk16.jar --> <dependency> <groupId>com.aspose</groupId> <artifactId>aspose.slides</artifactId> <version>15.9.0</version> <!-- <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/src/main/lib/aspose.slides-15.9.0.jar</systemPath>--> </dependency> <dependency> <groupId>com.aspose</groupId> <artifactId>aspose-cells</artifactId> <version>8.5.2</version> <!-- <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/src/main/lib/aspose-cells-8.5.2.jar</systemPath>--> </dependency> <dependency> <groupId>com.aspose</groupId> <artifactId>aspose-words</artifactId> <version>18.6</version> <!-- <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/src/main/lib/aspose-words-18.6-jdk16.jar</systemPath>--> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>View Code
linux伺服器中文亂碼解決,導出的PDF亂碼如圖:
解決方案
方案1: 環境解決:親測可行,記得安裝後重啟項目
安裝字型檔,將win的c:\windows\fonts下的全部文件拷貝到生產伺服器字體安裝目錄下。
#查看linux目前的所有字體
fc-list
#查看Linux目前的所有中文字體
fc-list :lang=zh
#拷貝到linux下的字體目錄
mkdir /usr/share/fonts/win
#更新系統中字體緩存
cd /usr/share/fonts
sudo fc-cache -fv
執行命令讓字體生效
source /etc/profile
方案2: 代碼解決(推薦)
a.將window中字體放到linux的/usr/shared/fonts/chinese目錄
b.在aspose代碼中添加:
//linux環境需要配置中文字體:
OsInfo osInfo = SystemUtil.getOsInfo();
if(osInfo.isLinux()){
FontSettings.getDefaultInstance().setFontsFolder("/usr/share/fonts", true);
}
//新建一個空白pdf文檔,byteArrayInputStream為word的輸入流
com.aspose.words.Document pdf = new com.aspose.words.Document(byteArrayInputStream);
pdf.save(os, SaveFormat.PDF);
os.flush();
示例
/** * * @param docxPath E:\test\docment\c.docx * @param pdfPath E:\test\docment\a.pdf * @return */ public static String convertDocToPdf(String docxPath, String pdfPath) { if (!getLicense()) { // 驗證License 若不驗證則轉化出的pdf文檔會有水印產生 return "PDF格式轉化失敗"; } try { // 新建一個空白pdf文檔 FileOutputStream os = new FileOutputStream(new File(pdfPath)); Document doc = new Document(docxPath); // Address是將要被轉化的word文檔 doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, os.close(); return pdfPath; } catch (Exception e) { e.printStackTrace(); } return "PDF格式轉化失敗"; } public static boolean getLicense() { boolean result = false; try { // license.xml應放在..\WebRoot\WEB-INF\classes路徑下 // InputStream is = PdfUtil.class.getClassLoader().getResourceAsStream("license/license.xml"); InputStream is = PdfUtil.class.getResourceAsStream("license/license.xml"); License aposeLic = new License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } return result; }
2、word 轉 PDF ,使用pdf-gae工具包
缺點:會與itext.jar產生衝突,如果你的項目中已有部分業務使用了itext.jar裡面的內容,則推薦上一種方式。
導入jar包:
<!--convert doc to pdf--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!--此種轉換方式會與itext衝突:嘗試多次後無法解決--> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId> <version>2.0.2</version> <exclusions> <exclusion> <artifactId>org.apache.poi</artifactId> <groupId>poi-ooxml</groupId> </exclusion> </exclusions> </dependency>View Code
示例:
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter; import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions; import org.apache.poi.xwpf.usermodel.XWPFDocument; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Date; /** * 參考:https://www.cnblogs.com/h-w-b/p/17352151.html */ public class WordUtils { /** * 方式一:會與itext.jar產生衝突,如果你的項目中已有部分業務使用了itext.jar裡面的內容,則推薦其他方式。 */ public static void convertDocxToPdf() { String pdfFilePath = "E:\\test\\docment\\a.pdf"; String docxFilePath = "E:\\test\\docment\\c.docx"; String targetPaht = "E:\\test\\docment\\" + new Date().getTime()+".pdf"; try{ InputStream inputStream = new FileInputStream(docxFilePath); FileOutputStream outputStream = new FileOutputStream(targetPaht); XWPFDocument xwpfDocument = new XWPFDocument(inputStream); PdfOptions pdfOptions = PdfOptions.create(); PdfConverter.getInstance().convert(xwpfDocument, outputStream, pdfOptions); outputStream.flush(); outputStream.close(); System.out.println("==========="); } catch (Exception e) { e.printStackTrace(); } } }