我怎么能“手动”呢?在不损坏文件的情况下编辑PDF中的注释


How can I "manually" edit an annotation in a pdf without corrupting the file?

我需要插入一个超链接到几千个现有的pdf文件。我正在使用zend_pdf,显然无法设置不可见的边界。我发现让链接边框不可见的唯一方法(在这个网站的其他地方找到的,准确地说,在这里)是搜索pdf的每个链接"元素"并添加/Border注释,像这样:

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

因为我需要处理驻留在我的文件系统上的文件,所以我使用sed命令进行搜索&替换操作。
现在,乍一看,这是有效的,因为文档在acrobat8, osx 10.6的查看器和Ubuntu的文档查看器中正确显示。但是,pdftk(1.41)和pdfinfo(0.12.1)等工具会报告该结构已损坏。这很烦人,因为这意味着无法使用pdftk进一步操作pdf,因为该工具拒绝处理文件,因为其中存在错误。我使用二进制编辑器查看文件,我发现如果我在"/Link"后面添加超过两个字节,文件就会损坏。这让我很困惑,因为基于pdf规范(我使用的是1.4),除了流之外没有校验和,这应该意味着一个人可以添加尽可能多的字节,只要他不在流中这样做,并且插入的字节是有效的pdf语法。我遗漏了什么?

下面是一个例子:
原pdf
处理后的pdf

在文件中添加额外的"/Border"元素实际上会破坏pdf的xref表。xref表根据它们的位置引用所有对象,从文件的开始以字节计算。插入额外的元素当然会将后续内容的位置(偏移量)移动几个字节。
为了修复编辑后的xref表,我可以使用pdf实验室(http://www.pdftk.com)的pdftk来修复xref表:

$ PDFTK corrupted_file.pdf output fixed_file.pdf

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

相关文章: