如何使用 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);
我正在开发一个实用程序,它将制表符递增的文本文件作为输入,使用 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);