将文档链接添加到PDF

2024-10-01 07:47:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我做了一些研究,得出结论认为{a2}可以做到这一点。无论如何,有一个看似简单的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甚至不是一个需求,但是如果能在我当前的结构中使用它而不需要使用其他语言,那就更好了。在


Tags: tofromrect文本importpdf链接方式
1条回答
网友
1楼 · 发布于 2024-10-01 07:47:59

这似乎是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结构中。所以简而言之,这一联系被打破也就不足为奇了。在

为了消除cd6}中的一个错误,{cd6}而不是改变cd6}的顺序。这些更改使示例代码生成有效的输出:

^{pr2}$

Et voilá,链接在输出中完全按照预期工作!我还从/Rect值中删除了神奇的826,因为根据缩放级别,它可能不是一个合法的参数,而且无论如何也不应该硬编码。在


*在得出这个修复如预期的效果后,我发现保留/RectNameObject并传递给它一个看起来像输出应该(例如'[ 400 400 600 600 ]')的字符串也会起作用。这大概是为了允许最大限度的灵活性,但这肯定是出乎意料的。在


更新:我把它放在一起并提交了一个更完整的修复程序(link to the patch供后人使用),因此,从版本1.22开始,上述问题都应该得到修复。在

相关问题 更多 >