iTextPDF (версия 5) гиперссылка, не указывающая на нужное место

#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);
        }
    }