【问题标题】:Add in-document link to PDF将文档内链接添加到 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 甚至不是必需的,但如果不使用另一种语言,就可以将它融入我当前的结构中。

【问题讨论】:

    标签: python pdf pdf-generation pypdf


    【解决方案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 开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2017-11-25
      相关资源
      最近更新 更多