您好,登錄后才能下訂單哦!
最近項目需要實現PDF下載的功能,由于沒有這方面的經驗,從網上花了很長時間查找了相關的資料。整理之后,發現有幾個框架可以實現這個功能。
1. 開源框架支持
2. 實現方案
比較了一番后,采用了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文檔對應的word(docx)制作出來
2 把word文檔另存為xml文件
另存為xml
3 將xml文件制作為freemarker模版(ftl)文件
制作模版文件
4 將數據和ftl文件組裝為xml文本
Map<String, Object> map = new HashMap<>(); map.put("name", "小明"); map.put("address", "北京市朝陽區"); 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文檔轉存為pdf文檔
String outputfilepath = "/Users/xiaoming/簡歷.pdf"; Docx4J.toPDF(wordMLPackage, new FileOutputStream(new File(outputfilepath)));
7 使用Apache PDFbox將多個pdf文檔合為一個
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());
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。