前言
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。
到此这篇关于java合并pdf文档的三种常用方式的文章就介绍到这了,更多相关java合并pdf文档方式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论