java - itext7 pdf与书签合并
问题描述
我正在尝试将两个 pdf src1 ad src2 与书签合并,我使用 itext7 来合并 pdf。pdf 正确合并但书签无法正常工作,来自 scr1 pdf 的书签始终分别指向合并文档中的 scr2 pdf。
scr1 书签1 ==> 指向 src2 书签1
dfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
PdfMerger merger = new PdfMerger(pdfDoc);
PdfDocument srcDoc1 = new PdfDocument(new PdfReader(SRC1));
PdfOutline rootOutline = pdfDoc.getOutlines(false);
PdfOutline srcOutline = srcDoc1.getOutlines(false);
PdfDocument srcDoc2 = new PdfDocument(new PdfReader(SRC2));
merger.merge(srcDoc1, 1, srcDoc1.getNumberOfPages());
merger.merge(srcDoc2, 1, srcDoc2.getNumberOfPages());
merger.close();
srcDoc1.close();
srcDoc2.close();
pdfDoc.close();
源 1 pdf 的书签始终指向源 2 pdf,源 2 pdf 书签在合并的 pdf 文档中正常工作。
任何人请帮我解决这个问题,我已经尝试了几种方法来重新指向目标并覆盖合并文档中的目标点,注意没有正确解决。
dfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
PdfMerger merger = new PdfMerger(pdfDoc);
PdfDocument srcDoc1 = new PdfDocument(new PdfReader(SRC1));
PdfOutline rootOutline = pdfDoc.getOutlines(false);
PdfOutline srcOutline = srcDoc1.getOutlines(false);
PdfDocument srcDoc2 = new PdfDocument(new PdfReader(SRC2));
merger.merge(srcDoc1, 1, srcDoc1.getNumberOfPages());
merger.merge(srcDoc2, 1, srcDoc2.getNumberOfPages());
for(PdfOutline o : rootOutline.getAllChildren()) {
o.addDestination(PdfDestination.makeDestination(new PdfString(o.getTitle().toString())));
}
merger.close();
srcDoc1.close();
srcDoc2.close();
pdfDoc.close();
解决方案
这听起来非常像一个错误。
IIRC,书签可以使用几种不同的格式……它们可能只是“第 7 页”,或“此页面对象上的此查看区域,无论它碰巧是哪个页码”,以及介于两者之间的几件事。
您的解决方案:
1) 为自己获取一份 PDF 规范的副本(大概是 Adobe 仍然托管它,尽管我已经有近 10 年没有需要查看它了。
2)查看“书签”和“目的地”部分。
3) 当您导入任何 PDF 时,请浏览其书签,并确保所有目的地都是“页面对象”类型。您可能必须“手动”转换它们,或者 iText 可能会将其作为一项功能提供。自从我在 iText 上工作以来已经有很长时间了,不知道从那时起他们在做什么。
顺便说一句,页面链接也可以是目的地……所以那些方便的目录和词汇表链接都可能被破坏。
您需要使用基本的对象级 PDF 操纵器...PdfString、PdfDictionary、PdfArray 等...我建议使用 iText-RUPS。它使您可以在该基本对象级别查看 PDF,因此您可以查看其中的内容和要匹配的代码。有许多这样的程序漂浮在周围,但这是我脑海中唯一记得的名字。
推荐阅读
- postgresql - 如何更改 PGDATA potsgres docker 的物理卷?
- csv - AWS CLI 输出到 CSV 以包含列标题
- laravel - 将条件放在第一个数组中有很多 laravel
- sql-server - 将临时表中的数据插入到永久表中
- oauth-2.0 - Oauth2 授权路由在 Ktor 中不起作用
- python-3.x - 标记 df 中时间范围重叠的条目
- python-3.x - 在 vSphere 6.5 中使用 pyvmomi 获取虚拟机标签
- vcpkg - 自动生成的补丁无法应用(路径错误)
- sql - 如何在 postgres 中返回类型表?
- javascript - 函数完成后如何从函数返回变量