前言
在现代企业中,文档管理是一项重要的任务,尤其是在需要将多个PDF文件合并成一个文件时。本文将详细介绍如何使用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级)
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("结束添加,添加后,总{}页:{},耗费:{}秒",totalPage,
sourcePdf.getFilePath(), (System.currentTimeMillis() - time1) / 1000);
}
// 设置合并后的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("合并发生异常");
}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();
}总结
1.apache的pdfbox和itextpdf是免费的,e-iceblue的spire.pdf是收费的而且价格不菲,无授权会有水印,虽然e-iceblue有免费的spire.pdf.free但有页数限制。
2.apache的pdfbox和e-iceblue的spire.pdf对pdf文档的容错不高,如果pdf文档是通过三方软件生成或编辑过的(可能会存在一定问题,但是浏览器打开或wps打开会容错显示),在合并时会抛文档的异常。但是itextpdf会进行容错修复并合并成功。
所以个人推荐使用itextpdf。
本文来源于#God_M,由@蜜芽 整理发布。如若内容造成侵权/违法违规/事实不符,请联系本站客服处理!
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/2548.html




















