将文档内链接添加到 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
>>
这有几个问题。最明显的是 RectangleObject
和 IndirectObject
是 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的主要内容,如果未能解决你的问题,请参考以下文章