Java合并PDF文檔的三種常用方式總結(jié)
前言
Java常用的三種合并pdf的方式
合并PDF
1.pdfbox合并pdf
apache的pdfbox
pom.xml
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.26</version> </dependency>
代碼示例
// 添加待合并文件 for (ZipUtil.RelativeFile sourcePdf : fileRefers) { long time1 = System.currentTimeMillis(); log.info("開始添加{}, 大小:{}MB, 路徑:{}", (++index), FileUtils.newFile(sourcePdf.getFilePath()).length() / 1024 / 1024, sourcePdf.getFilePath()); try (PDDocument document = PDDocument.load(FileUtils.newFile(sourcePdf.getFilePath()), MemoryUsageSetting.setupTempFileOnly()); ) { // 頁面大綱(1級(jí)) String newName = FileUtils.newFile(sourcePdf.getRelativePath()).getName(); newName = StringUtils.trimToEmpty(newName).replace("." + FilenameUtils.getExtension(newName), ""); PdfBoxBookmark boxData = new PdfBoxBookmark(newName, totalPage); PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline(); if (outline != null) { buildBookMark(outline, boxData, totalPage); } / allBookList.add(boxData); mergePdf.addSource(sourcePdf.getFilePath()); // 更新總頁碼 totalPage += document.getNumberOfPages(); } catch (IOException e) { e.printStackTrace(); log.error("合并pdf失敗:{}",e); throw new BaseException("文件不存在:" + sourcePdf.getFilePath()); } log.info("結(jié)束添加,添加后,總{}頁:{},耗費(fèi):{}秒",totalPage, sourcePdf.getFilePath(), (System.currentTimeMillis() - time1) / 1000); } // 設(shè)置合并后的pdf文件路徑 mergePdf.setDestinationFileName(destFilePath); // 合并pdf try { mergePdf.setDocumentMergeMode(PDFMergerUtility.DocumentMergeMode.OPTIMIZE_RESOURCES_MODE); mergePdf.mergeDocuments(MemoryUsageSetting.setupTempFileOnly()); } catch (IOException e) { e.printStackTrace(); throw new BaseException("合并發(fā)生異常"); }
2.spire.pdf
e-iceblue的spire.pdf
pom.xml
<dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf</artifactId> <version>9.5.6</version> </dependency>
代碼示例:
String[] files = new String[] { "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\error-file.pdf", "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\111.pdf"}; //Merge documents and return an object of PdfDocumentBase PdfDocumentBase pdf = PdfDocument.mergeFiles(files); //Save the result to a PDF file pdf.save("C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\MergedPDF222.pdf", FileFormat.PDF);
3.itextpdf
itextpdf
pom.xml
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.4</version> </dependency>
代碼示例:
String[] pdfs = new String[] { "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\0001.pdf", "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\0002.pdf"}; String outputPdf = "C:\\Users\\test\\Desktop\\tmp\\001\\20241014-001\\MergedPDF333-.pdf"; // 合并后的PDF文件 try { Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputPdf)); document.open(); for (String pdf : pdfs) { PdfReader reader = new PdfReader(pdf); for (int i = 1; i <= reader.getNumberOfPages(); i++) { document.newPage(); copy.addPage(copy.getImportedPage(reader, i)); } reader.close(); } document.close(); System.out.println("PDFs merged successfully."); } catch (Exception e) { e.printStackTrace(); }
總結(jié)
1.apache的pdfbox和itextpdf是免費(fèi)的,e-iceblue的spire.pdf是收費(fèi)的而且價(jià)格不菲,無授權(quán)會(huì)有水印,雖然e-iceblue有免費(fèi)的spire.pdf.free但有頁數(shù)限制。
2.apache的pdfbox和e-iceblue的spire.pdf對(duì)pdf文檔的容錯(cuò)不高,如果pdf文檔是通過三方軟件生成或編輯過的(可能會(huì)存在一定問題,但是瀏覽器打開或wps打開會(huì)容錯(cuò)顯示),在合并時(shí)會(huì)拋文檔的異常。但是itextpdf會(huì)進(jìn)行容錯(cuò)修復(fù)并合并成功。
所以個(gè)人推薦使用itextpdf。
到此這篇關(guān)于Java合并PDF文檔的三種常用方式的文章就介紹到這了,更多相關(guān)Java合并PDF文檔方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名
這篇文章主要介紹了Java實(shí)現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名,本文把代碼組織成了一個(gè)模塊,可以很方便的使用,需要的朋友可以參考下2015-06-06OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解
這篇文章主要為為大家介紹了OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12SpringBoot整合Spring Data Elasticsearch的過程詳解
這篇文章主要介紹了SpringBoot整合Spring Data Elasticsearch的過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Spring Boot中的SpringSecurity基礎(chǔ)教程
Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架。它實(shí)際上是保護(hù)基于spring的應(yīng)用程序的標(biāo)準(zhǔn)Spring Security是一個(gè)框架,側(cè)重于為Java應(yīng)用程序提供身份驗(yàn)證和授權(quán),這篇文章主要介紹了Spring Boot中的SpringSecurity學(xué)習(xí),需要的朋友可以參考下2023-01-01SpringBoot啟動(dòng)后立即執(zhí)行的幾種方法小結(jié)
在項(xiàng)目開發(fā)中某些場(chǎng)景必須要用到啟動(dòng)項(xiàng)目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動(dòng)后立即執(zhí)行的幾種方法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05