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

Is there a way discard previous pdfmark metadata?

我试图自动将标题、书签等添加到我需要的一些 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 数据,它工作正常,但是如果它有,事情就不会很好地进行:例如 title/author 没有被修改并且书签被附加而不是被替换。

因为我不想修改 PDF 的相应后记,所以我试图找到是否有一些命令可以添加到 pdfmark.ps 可以删除(或覆盖)以前的元数据。

我将把 PostScript 留给其他人,并展示如何使用 qpdf 包(针对 qpdffix-qdf)和 GNU sed 删除 PDF 大纲。

来自 qpdf 手册:

In QDF mode, qpdf creates PDF files in what we call QDF form. A PDF file in QDF form, sometimes called a QDF file, is a completely valid PDF file that has %QDF-1.0 as its third line (after the pdf header and binary characters) and has certain other characteristics. The purpose of QDF form is to make it possible to edit PDF files, with some restrictions, in an ordinary text editor.

(对于 non-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 通过在不存在的 obj 0
  • 处生成 QDF 文件中的孤立轮廓
  • fix-qdf编辑后修复QDF
  • 第 2 qpdf 将 QDF 转换并压缩为 PDF
  • qpdf 输入无法流水线化,需要 seek

sed 命令将包含以下内容的行中的数字更改为零 缩进的文本 /Outlines。 请注意,GNU sed 用于非标准 --binary 选项 以避免在 OS 区分文本文件和二进制文件时发生意外。 同样,要删除注释,请将 /Outlines 替换为 /Annots 上面的 -e,或将其插入第二个 -e 选项以执行这两项操作。 sed 之外的另一个补丁实用程序就可以了;通常只有一个字节 待更改。

快速删除所有非页面数据(文档信息、大纲 a.o。但不是 注释)qpdf--empty 选项可能有用:

qpdf --coalesce-contents --compression-level=9 \
     --object-streams=generate \
     --empty --pages in.pdf 1-z -- out.pdf