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-06
OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解
這篇文章主要為為大家介紹了OpenTelemetry初識(shí)及調(diào)用鏈Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
SpringBoot整合Spring Data Elasticsearch的過程詳解
這篇文章主要介紹了SpringBoot整合Spring Data Elasticsearch的過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Spring 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-01
SpringBoot啟動(dòng)后立即執(zhí)行的幾種方法小結(jié)
在項(xiàng)目開發(fā)中某些場(chǎng)景必須要用到啟動(dòng)項(xiàng)目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動(dòng)后立即執(zhí)行的幾種方法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05

