如何使用 iText7 覆盖 PDF 中现有的书签树

How to overwrite an existing bookmark tree in a PDF using iText7

我正在开发一个实用程序,它将制表符递增的文本文件作为输入,使用 iText7 在现有 PDF 文件中创建书签树(也称为轮廓)。

显然这不是真正的代码,但这基本上是我构建树的方式:

PdfReader reader = new PdfReader(srcFilePath);
PdfWriter writer = new PdfWriter(targetFilePath);
PdfDocument pdfDoc = new PdfDocument(reader, writer);

PdfOutline rootOutline = pdfDoc.GetOutlines(false);
PdfOutline mainTitleOutline;

(mainTitleOutline = rootOutline.AddOutline("Title 1")).AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(1)));
mainTitleOutline.AddOutline("Sub title 1.1").AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(2)));
mainTitleOutline.AddOutline("Sub title 1.2").AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(3)));

(mainTitleOutline = rootOutline.AddOutline("Title 2")).AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(4)));
mainTitleOutline.AddOutline("Sub title 2.1").AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(5)));
mainTitleOutline.AddOutline("Sub title 2.2").AddDestination(PdfExplicitDestination.CreateFit(pdfDoc.GetPage(6)));

pdfDoc.Close();

当 PDF 还没有任何书签时,这非常有效,但是当有 (pdfDoc.GetOutlines(false).GetAllChildren().Count > 0) 时,我想事先删除整棵树(因此覆盖它们),因为如果我不这样做,我最终会将新大纲添加到旧大纲中。

有办法吗?

这个方便的API确实是现在少了的东西,但是你仍然可以用一行代码在低层次上做到:

 pdfDocument.GetCatalog().GetPdfObject().Remove(PdfName.Outlines);

只需确保在第一次访问它们之前删除轮廓,即:

PdfReader reader = new PdfReader(srcFilePath);
PdfWriter writer = new PdfWriter(targetFilePath);
PdfDocument pdfDoc = new PdfDocument(reader, writer);

// Remove outlines before getting PdfOutline object by calling GetOutlines
pdfDocument.GetCatalog().GetPdfObject().Remove(PdfName.Outlines);
PdfOutline rootOutline = pdfDoc.GetOutlines(false);