有没有办法丢弃以前的pdfmark元数据?

问题描述

我试图自动为我需要的一些 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 包(用于 qpdffix-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