pdf - 有没有办法丢弃以前的 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包(for qpdf
and 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 格式以进行编辑 sed
obj
通过将它们植根于不存在的0 ,在 QDF 文件中孤立轮廓fix-qdf
编辑后修复 QDF- 2nd
qpdf
将 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
推荐阅读
- typo3 - MenuProcessor 配置包含无效参数
- r - ggplot2 - 根据 y 数字重新排序 aes 填充,但针对因子 x 的每个实例进行计算。这可能吗?
- javascript - Javascript 为多个元素设置 CSS 类(一个元素集,其余元素未设置)
- python - 在 NetworkX 中绘制孤立节点
- android - 设置 StreamVolume 时可抛出
- python - 07002这个程序参数太少怎么解决?
- excel-formula - Excel - 在一列中用特定数字乘以不同的间隔
- c# - 在 ML.NET 中向 IDataView 添加自定义列
- python-3.x - Dropna By Column by 多索引中的级别并交换非 na 值
- assembly - 演示处理器环 - 运行环 0 指令的汇编代码