我需要以编程的方式分析和组合几个(数百)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甚至不是一个需求,但是如果能在我当前的结构中使用它而不需要使用其他语言,那就更好了。在
这似乎是
addLink
实现中的一个错误,或者可能该方法只是针对一个旧的或不同的链接语法。在任何情况下,检查问题中示例代码的输出PDF的结构可以发现以下一点:这有几个问题。最明显的是,
RectangleObject
和IndirectObject
是Python库的构造,不是有效的PDF结构。/Dest
似乎还有一个神秘的魔法参数,我没有要求。此外,/P
将是多余的(对包含此链接的页面的引用),即使它的实现方式没有将Python对象放入PDF结构中。所以简而言之,这一联系被打破也就不足为奇了。在为了消除cd6}中的一个错误,{cd6}而不是改变cd6}的顺序。这些更改使示例代码生成有效的输出:
^{pr2}$Et voilá,链接在输出中完全按照预期工作!我还从
/Rect
值中删除了神奇的826
,因为根据缩放级别,它可能不是一个合法的参数,而且无论如何也不应该硬编码。在*在得出这个修复如预期的效果后,我发现保留
/Rect
为NameObject
并传递给它一个看起来像输出应该(例如'[ 400 400 600 600 ]'
)的字符串也会起作用。这大概是为了允许最大限度的灵活性,但这肯定是出乎意料的。在更新:我把它放在一起并提交了一个更完整的修复程序(link to the patch供后人使用),因此,从版本1.22开始,上述问题都应该得到修复。在
相关问题 更多 >
编程相关推荐