iTextPDF(版本 5)超链接未链接到正确的位置

Posted

技术标签:

【中文标题】iTextPDF(版本 5)超链接未链接到正确的位置【英文标题】:iTextPDF (Version 5) hyperlink not linking to the right place 【发布时间】:2021-10-29 17:01:27 【问题描述】:

我有一堆我在这个代码点合并的 PDF。在合并 PDF 的开头,我正在生成一个目录部分。现在,目录充当书签,单击它应该会带我到正确的页面。但是,如果我点击链接,它会跳转到页面底部和下一页之间。

我有这个代码:

action = PdfAction.gotoLocalPage("p" + entry.getKey(), false); link = new PdfAnnotation(copydoc, 36, ct.getYLine(), 559, y, action); stamp.addAnnotation(link);

不过,我还在 PDF 中创建了可以正常工作的书签。Bookmarks example

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

请帮我解决这个问题。

【问题讨论】:

请分享一个说明问题的示例结果文件。 您好,这是实际 PDF 的高度缩短版本。请在本地下载并在 chrome 或 Adob​​e 中打开它,您会看到正在发生这种情况。 [drive.google.com/file/d/1XuDBbU69kqosaAtwb7Zh3y9rGikgtmFw/… 我的链接被“拒绝访问” 你能再试一次吗?存在权限问题。 [drive.google.com/file/d/1XuDBbU69kqosaAtwb7Zh3y9rGikgtmFw/… 好的,我现在可以下载文件了,但显然你自己找到了解决问题的方法。 【参考方案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 对齐块。我的理解是这就是问题所在。因此,当点击目录链接时,它会进入页面底部并且页面不适合窗口。

为了解决这个问题,我在页面顶部的某处添加了一个空白文本填充 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);
        
    

【讨论】:

以上是关于iTextPDF(版本 5)超链接未链接到正确的位置的主要内容,如果未能解决你的问题,请参考以下文章

请教一个HTML超链接锚点的问题

超链接不适用于Android OS 5及更高版本

跳转至设置项的各种url链接,在5.1系统给禁止了吗?

JLabel 超链接以正确的 URL 打开浏览器

ajax 响应未在单击的超链接的父 div 中呈现

Java操作PDF之iText超入门