将文档内链接添加到 PDF

Posted

技术标签:

【中文标题】将文档内链接添加到 PDF【英文标题】:Add in-document link to PDF 【发布时间】:2014-07-13 03:00:45 【问题描述】:

我需要以编程方式分析和组合几个(数百个)PDF 文档,并以专门的方式将页面链接在一起。每个 PDF 在链接所属的每个位置都包含文本,指示它应该链接到什么。我正在使用pdfminer 来提取链接应该在的位置和文本;现在我只需要实际创建这些链接。

我做了一些研究并得出结论,PyPDF2 应该可以做到这一点。无论如何,有一个看似简单的addLink 方法声称可以完成工作。我就是无法让它工作。

from PyPDF2 import PdfFileWriter
from PyPDF2.pdf import RectangleObject

out = PdfFileWriter()

out.insertBlankPage(800, 1000)
out.insertBlankPage(800, 1000)

# rect = [400, 400, 600, 600] # This doesn't seem to work either
rect = RectangleObject([400, 400, 600, 600])
out.addLink(0, 1, rect) # link from first to second page

with open(r'C:\temp\test.pdf', 'wb') as outf:
    out.write(outf)

上面的代码生成了一个漂亮的两页 PDF,其中没有任何内容,至少据我所知。有谁知道这可能是如何实现的?或者至少表明我哪里出错了?

只要库是免费许可的,解决方案就不必使用 PyPDF2。严格来说,Python 甚至不是必需的,但如果不使用另一种语言,就可以将它融入我当前的结构中。

【问题讨论】:

【参考方案1】:

这似乎是addLink 实现中的一个错误,或者该方法可能只是用于较旧或不同的链接语法。无论如何,从问题中的示例代码中检查输出 PDF 的结构会发现这个小宝石:

6 0 obj
<<
/Dest [ 4 0 R /FitV 826 ]
/Type /Annot
/Rect RectangleObject([400, 400, 600, 600])
/Border [ 0 0 0 ]
/P IndirectObject(5, 0)
/Subtype /Link
>>

这有几个问题。最明显的是 RectangleObjectIndirectObject 是 Python 库的构造,不是有效的 PDF 结构。 /Dest 上面似乎还有一个我没有要求的神秘魔法参数。此外,/P 将是多余的(对包含此链接的页面的引用),即使它是以没有将 Python 对象插入 PDF 结构的方式实现的。所以简而言之,这个链接坏了也就不足为奇了。

稍微弄乱源代码以消除崩溃错误,事实证明需要进行两项更改*才能使链接正常工作:将/Rect的内部表示从NameObject更改为@ 987654330@,并将/P 引用更改为指向页码,而不是实际对象。这些更改让示例代码产生有效的输出:

6 0 obj
<<
/Dest [ 4 0 R /FitV ]
/Type /Annot
/Rect [ 400 400 600 600 ]
/Border [ 0 0 0 ]
/P 0
/Subtype /Link
>>

Et voilà,该链接在输出中完全按照预期工作!我还从 /Rect 值中删除了魔术 826,因为它可能不是一个合法的参数,具体取决于缩放级别,而且它真的不应该被硬编码。


*在确定此修复程序按预期工作后,我确实发现将/Rect 保留为NameObject 并将其传递给看起来像输出应该的字符串(例如'[ 400 400 600 600 ]' ) 也可以。这大概是为了提供最大的灵活性,但肯定是出乎意料的。


更新:我整理并提交了一个更完整的修复(link to the patch 为后代),所以上述问题应该都得到修复,从 版本 1.22 开始。

【讨论】:

以上是关于将文档内链接添加到 PDF的主要内容,如果未能解决你的问题,请参考以下文章

网站内链优化策略

网站内链优化

如何在PDF格式文档中添加文字超链接!

六六seo基础入门第五讲:seo基础术语之网站内链

网站内部链接应该如何进行优化

SEO之网站内链优化策略