我试图自动向我需要的一些 PDF 添加标题、书签等。我想出的方法是创建一个简单的
pdfmark
脚本,如下所示:
% pdfmark.ps
[ /Title (My document)
/Author(Me)
/DOCINFO pdfmark
[ /Title (First chapter)
/Page 1
/OUT pdfmark
然后使用 Ghostscript 生成一个新的 PDF:
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 文件)是一个完全 第三行包含
的有效 PDF 文件(在 pdf 之后) 标头和二进制字符)并具有某些其他特征。 QDF 表单的目的是使编辑 PDF 文件成为可能, 有一些限制,在普通文本编辑器中。%QDF-1.0
(对于非 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
0fix-qdf
编辑后修复QDFqpdf
将 QDF 转换并压缩为 PDFqpdf
输入无法流水线化,需要seek
sed
命令将包含以下内容的行中的数字更改为零
缩进文本/Outlines
。
请注意,GNU sed
用于非标准 --binary
选项
以避免操作系统在区分文本文件和二进制文件时发生错误。
同样,要删除注释,请将 /Outlines
替换为 /Annots
上面的 -e
,或将其插入第二个 -e
选项中以执行这两项操作。
sed
之外的另一个补丁实用程序也可以;通常只有一个字节
要改变。
快速剥离所有非页面数据(docinfo、outlines a.o.,但不 注释)
qpdf
的 --empty
选项可能有用:
qpdf --coalesce-contents --compression-level=9 \
--object-streams=generate \
--empty --pages in.pdf 1-z -- out.pdf
首先,我使用命令将 pdf 转换为 ps:
gswin32c.exe -q -dNOPAUSE -dBATCH -sDEVICE=ps2write -sOutputFile=file.ps file_with_bookmark_to_remove.pdf
文件转换后,我再次转换为pdf并添加pdfmark_file.ps
gswin32c.exe -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=file_with_pdfmark.pdf file.ps pdfmark_file.ps
第一个命令使用打印机“ps2write”将 pdf 转换为 ps。 Ps 文件没有 pdfmark。所有 pdfmarks 均已删除。
当您使用 pdf 打印机“pdfwrite”再次转换时,将创建没有 pdfmarks 的文件,并使用 pdfmark_file.ps 添加新的 pdfmarks
祝你好运! 乌比拉贾拉