我使用pdftk更改了与PDF相关联的“Info”元数据。我目前有几个带有无关页面标签的PDF,我无法弄清楚如何删除它们。这就是我目前正在做的事情:
$ pdftk example_orig.pdf dump_data output page_labels.orig
$ grep -v PageLabel page_labels.orig > page_labels.new
$ pdftk example_orig.pdf update_info page_labels.new output example_new.pdf
这不会删除可以通过以下方式验证的PageLabel*
元数据:
$ pdftk example_orig.pdf dump_data | grep PageLabel
如何以编程方式从PDF中删除此元数据?使用pdftk会很好,但是如果有其他工具或方法在GNU / Linux上执行此操作,那对我也有用。
我需要这个,因为我正在使用LaTeX Beamer生成带有\setbeameroption{show notes on second screen}
选项的演示文稿,该选项会生成一个双倍宽度的PDF,用于在第二个屏幕上显示注释。不幸的是,似乎a bug in pgfpages会导致这些文件中出现错误且无关的PageLabel(example)。如果我只生成幻灯片PDF,它将生成正确的PageLabels(example)。由于我可以生成一组正确的PageLabel,因此一种解决方案是将第一个示例中的页面标签替换为第二个示例中的页面标签。也就是说,由于第一个例子中有额外的页面标签,我需要先删除它们。
答案 0 :(得分:6)
如果是第一次编辑PDF,请先制作备份副本。
使用可处理二进制blob的文本编辑器打开PDF。 vim -b
没问题。
找到/Info
字典。使用空格覆盖您不再需要的所有条目(条目包含/Key
个名称以及跟随它们的(some values)
。
小心不要使用比最初字符更多的空格。否则,您的xref
表格(PDF对象的ToC将失效,一些观看者会将PDF指示为已损坏)。
有关其他措施,请在PDF中找到/XML
字符串。它应该显示您的XMP / XML元数据部分的位置(并非所有PDF都有它们)。找到要删除的所有键值(不是<something keys>
!)。再次,只需用空白覆盖它们,并注意不要改变总长度(既不长也不短)。
如果您的PDF无法访问/Info
字典,请在qpdf
的帮助下对其进行转换。
使用此命令:
qpdf --qdf --object-streams=disable orig.pdf qdf---orig.pdf
应用上述程序。 (qdf---orig.pdf
现在应该更适合
重新压缩您编辑的文件:
qpdf qdf---orig.pdf edited---orig.pdf
完成!享受你的edited---orig.pdf
。检查是否已删除所有数据:
pdfinfo -meta edited---orig.pdf
在查看提供的示例PDF文件后,我清楚地知道/PageLabel
密钥不是/Info
字典的一部分(PDF&#39; 文档信息字典),但/Root
对象。
可能 一个 的原因pdftk
无法使用OP描述的方法更新它。
其他 原因如下:PDF which the OP quoted as containing the correct page labels确实包含不正确的内容!
Logical Page No. | Page Label
-----------------+------------
1 | 1
2 | 2
3 | 2
4 | 2
5 | 2
6 | 4
其他PDF(supposedly contains extraneous page labels)以不同的方式不正确:
Logical Page No. | Page Label
-----------------+------------
1 | 1
2 | 1
3 | 2
4 | 2
5 | 2
6 | 4
关于如何手动编辑PDF的经典元数据的原始建议仍然有效。对于编辑页面标签的情况,您可以应用相同的方法,但略有不同。
对于OP的示例文件,复杂性起作用:/Root
对象无法直接访问,因为它隐藏在压缩对象流中(PDF对象类型{{1 }})。这意味着必须首先在/ObjStm
的帮助下解压缩它:
使用qpdf
:
qpdf
使用qpdf --qdf --object-streams=disable example_presentation-NOTES.pdf q-notes.pdf
:
vim
找到vim -b q-notes.pdf
对象开头的1 0 obj
标记,其中包含名为/Root
的字典。
(a)要完全禁用网页标签,只需将/PageLabels
字符串替换为/PageLabels
,使用小写字母&#39; l&#39; (PDF区分大小写,并且不再识别关键字;如果需要,您自己可以在其他时间恢复原始版本。)
(b)要编辑页面标签,首先要看第1-6页的连续标签是如何被称为
/Pagelabels
(这些值在BOM标记的十六进制中,表示1,2,2,2,3,4 ......)
编辑这些值以阅读:
<feff0031>
[....]
<feff0032>
[....]
<feff0032>
[....]
<feff0032>
[....]
<feff0033>
[....]
<feff0034>
保存文件并再次运行 <feff0031>
[....]
<feff0032>
[....]
<feff0033>
[....]
<feff0034>
[....]
<feff0035>
[....]
<feff0036>
以重新压缩PDF:
qpdf
现在希望这些是OP正在寻找的页面标签....
由于OP似乎熟悉编辑qpdf q-notes.pdf notes.pdf
输出的pdftk
输出,他可以编辑输出并使用dump_data
将修复应用于PDF无需诉诸update_data
和qpdf
。
用户@Iserni发布了一个非常好的,简短且有效的答案,它将自己限制为一个命令vim
,OP似乎已经熟悉了这个命令,加上pdftk
- 不需要使用文本编辑器打开PDF,而不像我的回答那样引入额外的实用程序sed
。
不幸的是@Iserni在我发表评论后再次将其删除。我认为他的回答应该得到赏金,我打电话给你投票给#34;取消删除&#34;他的回答!
暂时,我会在这里附上一份@ Iserni的答案,直到他再次取消删除:
不确定我是否正确理解了这个问题。您可以尝试使用屠夫的解决方案:强力将/ PageLabels块替换为另一个无法识别的块。
qpdf
答案 1 :(得分:6)
不确定我是否正确理解了这个问题。您可以尝试使用屠夫的解决方案:强力将/PageLabels
块替换为另一个无法识别的块。
# Get a readable/writable PDF
pdftk file1.pdf output temp.pdf uncompress
# Mangle the PDF. Keep same length
sed -e 's|^/PageLabels|/BageLapels|g' < temp.pdf > mangled.pdf
# Recompress
pdftk mangled.pdf output final.pdf compress
rm -f temp.pdf mangled.pdf