首页 > 解决方案 > 有没有办法丢弃以前的 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可以删除(或覆盖)以前的元数据。

标签: pdfpdf-generationpostscript

解决方案


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

qpdf手册:

在 QDF 模式下,qpdf 以我们所说的 QDF 形式创建 PDF 文件。QDF 格式的 PDF 文件,有时称为 QDF 文件,是完全有效的 PDF 文件,%QDF-1.0其第三行(在 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 格式以进行编辑
  • sedobj通过将它们植根于不存在的0 ,在 QDF 文件中孤立轮廓
  • fix-qdf编辑后修复 QDF
  • 2ndqpdf将 QDF 转换并压缩为 PDF
  • qpdf输入不能流水线化,它需要seek

sed命令将包含缩进文本的行中的数字更改为零/Outlines。请注意,GNUsed用于非标准--binary选项,以避免操作系统在区分文本和二进制文件时出现意外。同样,要去除上面的注释替换/Outlines/Annots-e或将其插入到第二个-e选项中以同时执行这两种操作。另一个补丁实用程序sed;通常只需更改一个字节。

快速去除所有非页面数据(docinfo,outline ao but not annotations)qpdf--empty选项可能有用:

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

推荐阅读