问题描述
我试图自动为我需要的一些 PDF 添加标题、书签等。我想出的方法是创建一个简单的 pdfmark
脚本,如下所示:
% pdfmark.ps
[ /Title (My document)
/Author(Me)
/DOCINFO pdfmark
[ /Title (First chapter)
/Page 1
/OUT pdfmark
gs -q -dnopAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in.pdf pdfmark.ps
如果 in.pdf
没有任何 pdfmark
数据,它可以正常工作,但是,如果它没有很好地工作:例如,标题/作者没有被修改,而是附加了书签被替换了。
由于我不想修改 PDF 的相应附言,我试图找出是否有一些命令可以添加到 pdfmark.ps
中,可以删除(或覆盖)以前的元数据。
解决方法
我会将 PostScript 留给其他人,并展示如何使用 qpdf 包(用于 qpdf
和 fix-qdf
)和 GNU sed
删除 PDF 大纲。>
来自 qpdf
手册:
在 QDF 模式下,qpdf 以我们所说的 QDF 形式创建 PDF 文件。
QDF 格式的 PDF 文件,有时称为 QDF 文件,是一个完全
以 %QDF-1.0
作为第三行的有效 PDF 文件(在 pdf 之后
标头和二进制字符)并具有某些其他特征。
QDF 表单的目的是使编辑 PDF 文件成为可能,
有一些限制,在普通的文本编辑器中。
(对于非 GNU/Linux 系统,请调整以下命令。)
qpdf --qdf --compress-streams=n --decode-level=generalized \
--object-streams=disable -- in.pdf - |
sed --binary \
-e '/^[ ][ ]*\/Outlines [0-9][0-9]* [0-9] R/ s/[1-9]/0/g' |
fix-qdf > tmp.qdf
qpdf --coalesce-contents --compression-level=9 \
--object-streams=generate -- tmp.qdf out.pdf
哪里:
- 第一个
qpdf
命令将 PDF 文件转换为 QDF 格式进行编辑 -
sed
通过将 QDF 文件中的轮廓置于不存在的obj
0 -
fix-qdf
编辑后修复 QDF - 第二个
qpdf
将 QDF 转换并压缩为 PDF -
qpdf
输入无法流水线化,需要seek
sed
命令将包含以下内容的行中的数字更改为零
缩进的文本 /Outlines
。
请注意,GNU sed
用于非标准 --binary
选项
以避免在操作系统上区分文本文件和二进制文件时发生意外。
类似地,要去除注释,将 /Outlines
替换为 /Annots
上面的 -e
,或将其插入到第二个 -e
选项中以同时执行这两项操作。
另一个比 sed
更有用的补丁工具;通常只有一个字节
有待改变。
快速剥离所有非页面数据(docinfo,概述 a.o. 但不
annotations) qpdf
的 --empty
选项可能有用:
qpdf --coalesce-contents --compression-level=9 \
--object-streams=generate \
--empty --pages in.pdf 1-z -- out.pdf