我正在尝试将两个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();
答案 0 :(得分:0)
这听起来像是个错误。
IIRC,书签可以使用几种不同的格式...它们可以只是“第7页”,也可以是“此页面对象上的此查看区域,而不管它恰好是哪个页码”,以及介于两者之间的几项内容
您的解决方案:
1)为自己获取PDF规范的副本(大概Adobe仍在托管它,尽管我已经有近10年不需要研究它了。
2)查看“书签”和“目的地”部分。
3)导入任何PDF时,请检查其书签,并确保所有目标均属于“页面对象”种类。您可能需要“手动”转换它们,否则iText可能会将其作为功能提供。自从我从事iText工作以来,已经很长时间了,不知道他们从那时开始一直在忙什么。
顺便说一句,页面链接也可以成为目标...因此这些方便的TOC和词汇表链接都可能被破坏了。
您将需要使用基本的对象级PDF操作器... PdfString,PdfDictionary,PdfArray等...我建议使用iText-RUPS。它使您可以在该基本对象级别查看PDF,因此您可以查看其中的内容和匹配的代码。有许多这样的程序,但是那是我唯一记得其名字的程序。