itext7 pdf与书签合并

时间:2019-07-08 11:28:44

标签: java itext pdf-generation bookmarks itext7

我正在尝试将两个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();

1 个答案:

答案 0 :(得分:0)

这听起来像是个错误。

IIRC,书签可以使用几种不同的格式...它们可以只是“第7页”,也可以是“此页面对象上的此查看区域,而不管它恰好是哪个页码”,以及介于两者之间的几项内容

您的解决方案:

1)为自己获取PDF规范的副本(大概Adobe仍在托管它,尽管我已经有近10年不需要研究它了。

2)查看“书签”和“目的地”部分。

3)导入任何PDF时,请检查其书签,并确保所有目标均属于“页面对象”种类。您可能需要“手动”转换它们,否则iText可能会将其作为功能提供。自从我从事iText工作以来,已经很长时间了,不知道他们从那时开始一直在忙什么。

顺便说一句,页面链接也可以成为目标...因此这些方便的TOC和词汇表链接都可能被破坏了。

您将需要使用基本的对象级PDF操作器... PdfString,PdfDictionary,PdfArray等...我建议使用iText-RUPS。它使您可以在该基本对象级别查看PDF,因此您可以查看其中的内容和匹配的代码。有许多这样的程序,但是那是我唯一记得其名字的程序。