#java #itext #pdf-generation #tableofcontents
Вопрос:
У меня есть куча PDF-файлов, которые я объединил на этом этапе кода. В начале объединенного PDF-файла есть раздел содержимого, который я создаю. Теперь TOC действует как закладка, и, нажав на нее, я должен перейти на нужную страницу. Однако, если я нажму на ссылку , она переместится между нижней частью страницы и следующей страницей.
У меня есть этот код:
action = PdfAction.gotoLocalPage("p" entry.getKey(), false); link = new PdfAnnotation(copydoc, 36, ct.getYLine(), 559, y, action); stamp.addAnnotation(link);
Тем не менее, я также создал закладку в PDF, которая отлично работает .
Пример закладок
Document document = new Document();
PdfCopy copydoc = new PdfCopy(document, baos);
//some other codes here
HashMap<String, Object> bookmark = new HashMap<>();
bookmark.put("Title", toc_value);
bookmark.put("Action", "GoTo");
bookmark.put("Page", String.format("%d Fit", entry.getKey()));
outlines.add(bookmark);
//other codes here
copydoc.setOutlines(outlines);
Пожалуйста, помогите мне с этим.
Комментарии:
1. Пожалуйста, поделитесь примером файла результатов, иллюстрирующего проблему.
2. Привет, это очень короткая версия фактического PDF-файла. Пожалуйста , загрузите это в свой локальный компьютер и откройте его в Chrome или Adobe, вы увидите, что это происходит . [ drive.google.com/file/d/1XuDBbU69kqosaAtwb7Zh3y9rGikgtmFw/…
3. Я получаю «отказ в доступе» по вашей ссылке
4. не могли бы вы, пожалуйста, попробовать еще раз? Возникла проблема с разрешением. [ drive.google.com/file/d/1XuDBbU69kqosaAtwb7Zh3y9rGikgtmFw/…
5. Хорошо, я мог бы загрузить файл прямо сейчас, но, очевидно, вы сами узнали, как исправить и решить проблему.
Ответ №1:
Итак, короче говоря, я нашел решение своей проблемы. Чтобы объяснить решение, позвольте мне объяснить, что было написано ранее.
for (Map.Entry<String, PdfReader> entry : filesToMerge.entrySet()) {
n = entry.getValue().getNumberOfPages();
toc.put(pageNo 1, entry.getKey());
for (int i = 0; i < n; ) {
pageNo ;
page = copy.getImportedPage(entry.getValue(), i);
stamp = copy.createPageStamp(page);
chunk = new Chunk(String.format("Page %d/ %d", pageNo 1,totalPage));
if (i == 1)
chunk.setLocalDestination("p" pageNo);
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_RIGHT, new Phrase(chunk),
250, 10, 0);
stamp.alterContents();
copy.addPage(page);
}
}
Вот , что я делал , я создавал Chunk
страницу, содержащую номер страницы, и прорисовывал фрагмент ColumnText
в нижней части страницы.Насколько я понимаю, в этом и заключается проблема. Поэтому, когда вы нажимаете на ссылки TOC, они переходят в нижнюю часть страницы, и страница не подходит для окна.
Чтобы решить эту проблему, я добавил пустой текст, заполненный Chunck
где-то в верхней части страницы. И добавляю его как LocalDestination
. Вот обновленный код:
for (Map.Entry<String, PdfReader> entry : filesToMerge.entrySet()) {
n = entry.getValue().getNumberOfPages();
toc.put(pageNo 1, entry.getKey());
for (int i = 0; i < n; ) {
pageNo ;
page = copy.getImportedPage(entry.getValue(), i);
stamp = copy.createPageStamp(page);
chunkBlank = new Chunk(" ");
chunk = new Chunk(String.format("Page %d/ %d", pageNo 1,totalPage));
if (i == 1) {
chunk.setLocalDestination("p" pageNo);
chunkBlank.setLocalDestination( "p" pageNo );
}
ColumnText.showTextAligned( stamp.getOverContent(),Element.ALIGN_RIGHT,new Phrase(chunkBlank),20,1000,0 );
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_RIGHT, new Phrase(chunk),
250, 10, 0);
stamp.alterContents();
copy.addPage(page);
}
}