Как переписать существующее дерево закладок в PDF с помощью iText7 - PullRequest
0 голосов
/ 20 января 2020

Я разрабатываю утилиту, которая использует текстовый файл с вкладками в качестве входных данных для создания дерева закладок (или контуров) в существующем файле PDF с использованием iText7.

Очевидно, что это не настоящий код, но это в основном то, как я строю дерево:

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), я хотел бы удалить все дерево перед рукой (следовательно, перезаписать их), потому что, если я этого не сделаю, я добавлю новые контуры к старым.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 21 января 2020

Эта часть удобного 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...