Java 生成PDF文檔的示例代碼
最近項(xiàng)目需要實(shí)現(xiàn)PDF下載的功能,由于沒有這方面的經(jīng)驗(yàn),從網(wǎng)上花了很長時(shí)間查找了相關(guān)的資料。整理之后,發(fā)現(xiàn)有幾個(gè)框架可以實(shí)現(xiàn)這個(gè)功能。
1. 開源框架支持
- iText,生成PDF文檔,還支持將XML、Html文件轉(zhuǎn)化為PDF文件;
- Apache PDFBox,生成、合并PDF文檔;
- docx4j,生成docx文檔,支持轉(zhuǎn)換為PDF格式。
2. 實(shí)現(xiàn)方案
比較了一番后,采用了FreeMarker+docx4j+Apache PDFBox的方案:
maven依賴
<!-- pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.11</version>
</dependency>
<!-- docx4j -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>3.3.7</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-util</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-export-fo</artifactId>
<version>3.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- image -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
步驟
1 把pdf文檔對應(yīng)的word(docx)制作出來

2 把word文檔另存為xml文件

另存為xml
3 將xml文件制作為freemarker模版(ftl)文件

制作模版文件
4 將數(shù)據(jù)和ftl文件組裝為xml文本
Map<String, Object> map = new HashMap<>();
map.put("name", "小明");
map.put("address", "北京市朝陽區(qū)");
map.put("email", "xiaoming@abc.com");
StringWriter stringWriter = new StringWriter();
BufferedWriter writer = new BufferedWriter(stringWriter);
template.process(map, writer);
String xmlStr = stringWriter.toString();
5 使用docx4j將xml文本加載為word文檔對象
ByteArrayInputStream in = new ByteArrayInputStream(xmlStr.getBytes()); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(in);
6 使用docx4j將word文檔轉(zhuǎn)存為pdf文檔
String outputfilepath = "/Users/xiaoming/簡歷.pdf"; Docx4J.toPDF(wordMLPackage, new FileOutputStream(new File(outputfilepath)));
7 使用Apache PDFbox將多個(gè)pdf文檔合為一個(gè)
String folderName = "/Users/xiaoming/pdfs";
String destPath = "/Users/xiaoming/all.pdf";
PDFMergerUtility mergePdf = new PDFMergerUtility();
String[] filesInFolder = getFiles(folderName);
Arrays.sort(filesInFolder, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
for (int i = 0; i < filesInFolder.length; i++) {
mergePdf.addSource(folderName + File.separator + filesInFolder[i ]);
}
mergePdf.setDestinationFileName(destPath);
mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring File Storage文件的對象存儲(chǔ)框架基本使用小結(jié)
在開發(fā)過程當(dāng)中,會(huì)使用到存文檔、圖片、視頻、音頻等等,這些都會(huì)涉及存儲(chǔ)的問題,文件可以直接存服務(wù)器,但需要考慮帶寬和存儲(chǔ)空間,另外一種方式就是使用云存儲(chǔ),這篇文章主要介紹了Spring File Storage文件的對象存儲(chǔ)框架基本使用小結(jié),需要的朋友可以參考下2024-08-08
詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟
本文就在項(xiàng)目中來集成 UidGenerator這一工程來作為項(xiàng)目的全局唯一 ID生成器。接下來通過實(shí)例代碼給大家詳解詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟,感興趣的朋友一起看看吧2018-10-10
不寫mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問題分析
這篇文章主要為大家介紹了不寫mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
JAVA基于Slack實(shí)現(xiàn)異常日志報(bào)警詳解
這篇文章主要為大家介紹了JAVA基于Slack實(shí)現(xiàn)異常日志報(bào)警詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
RabbitMQ通過延遲插件實(shí)現(xiàn)延遲消息
在RabbitMQ中,使用延遲消息插件比死信隊(duì)列更優(yōu)化的實(shí)現(xiàn)消息的延遲發(fā)送,本文介紹了延遲插件的下載、安裝、以及如何通過設(shè)置消息頭x-delay實(shí)現(xiàn)消息的延遲投遞,特別指出,使用延遲消息可能會(huì)損耗性能,適合短時(shí)間的延遲場景2024-10-10

