如何在不破坏文件的情况下“手动”编辑pdf中的注释?

时间:2011-09-16 20:16:11

标签: php zend-framework pdf

我需要在几千个现有的pdf中插入一个超链接。我正在使用zend_pdf,显然无法设置不可见的边框。我发现使链接边界不可见的唯一方法(在此网站的其他地方找到here, to be precise)是搜索pdf的每个链接“元素”并添加/ Border注释,如下所示:

  

echo str_replace('/ Annot / Subtype / Link','/ Annot / Subtype / Link / Border [0 0 0]',$ pdf-> render());

因为我需要处理驻留在我的文件系统上的文件,所以我使用sed命令进行搜索&更换操作 现在,乍一看这是有效的,因为文档由Acrobat 8​​,osx 10.6的Viewer和Ubuntu的文档查看器正确显示。但是,pdftk(1.41)和pdfinfo(0.12.1)等工具报告结构已损坏。这很烦人,因为它意味着不可能使用pdftk进一步操作pdf,因为该工具因其中存在错误而拒绝处理该文件。 我使用二进制编辑器查看了文件,我发现如果在“/ Link”之后添加两个以上的字节,文件就会被破坏。这让我很困惑,因为根据pdf规范(我使用的是1.4),除了流之外没有校验和,这应该意味着可以添加他想要的字节数,只要他没有这样做。流和插入的字节是有效的pdf语法。 我在这里缺少什么?

这是一个例子:
the original pdf
the processed pdf

1 个答案:

答案 0 :(得分:1)

在文件中添加额外的“/ Border”元素实际上会破坏pdf的外部参照表。外部参照表按位置引用所有对象,以文件的起始字节为单位进行测量。当然,插入附加元素会使后续内容的位置(偏移)移动几个字节 要在编辑后修复外部参照表,我可以使用pdf labs(http://www.pdftk.com)的pdftk来修复外部参照表:

  

$ pdftk corrupted_file.pdf输出fixed_file.pdf

事实上,我无法为php找到全面的Pdf解决方案,我不得不使用几种不同的工具(zend_pdf,pdftk,sed)来实现我的工作流程。