0

这是我第一次在这个级别上使用 PDF。所以请耐心等待我的菜鸟问题。我基本了解 PDF 文件的逻辑和物理结构。

我有一个包含需要替换的虚拟 ID 的 PDF。为了检查,如果有办法做到这一点,我使用 qpdf 来扩展 PDF 使用

qpdf --qdf --object-streams=禁用 orig.pdf 扩展.pdf

使用十六进制编辑器,我在 expand.pdf 中找到了虚拟 ID,并通过简单地交换两位数来更改值

<001800180017> Tj => <001700170018> Tj

并保存了它。在 Acrobat 中打开扩展的.pdf 没有显示修改。原始 ID 443 仍然呈现,但搜索“443”没有找到它。当搜索修改后的内容“334”时,我会突出显示呈现的原始 ID 443。

PDF由文本和矢量图形组成。当我插入额外的数字(这显然会使外部参照中的偏移量无效)时,我收到一条关于缺少字体的错误消息,并且所有数字都显示为点,但矢量图形仍然存在。这似乎表明 ID 不是图形的一部分。

我错过了什么?

编辑 1:在 mkl 的评论之后,我对我的 PDF 进行了更深入的分析,发现除了明显的图形内容之外,所有文本都是由一系列 m/l/c 命令呈现的,后面是 BT/ET 部分。在 BT/ET 部分,中风和非中风的颜色均为 0,0,0。

这是因为使用了嵌入的非标准字体吗?带有嵌入字体的 PDF 通常是这样完成的吗?用于视觉表示的图形部分和透明(隐藏)文本部分只是为了获得搜索和突出显示功能?

回想起来,我想知道当我第一次修改内容时我做了什么来得到这些点。我似乎不可能,我也无法重现它。

谢谢汤姆

4

1 回答 1

0

首先,以下只是猜测,因为您无法共享有问题的 pdf。受过教育的猜测,但仍然是猜测。

您报告说您通过简单地交换文本绘制指令参数中的两位数字来更改值,现在可以成功搜索交换数字的值,但Acrobat 没有显示修改。

此外,您观察到所有文本都由一系列 m/l/c 命令呈现,然后是 BT/ET 部分。

观察到文本呈现为任意矢量图形(一系列 m/l/c 命令)的主要情况是在 pdf 中,制作者不希望文本提取成为可能,并用任意向量替换文本绘制指令图形说明。

这显然不是您的 pdf 中的情况,因为文本绘图说明没有被替换,而只是由矢量图形说明进行补充。

假设使用此构造是有原因的而不是偶然的,我只能假设 pdf 制作者不愿意或不允许嵌入有问题的字体,但希望显示特定的字体外观而不必指望字体正在安装在查看pdf的电脑上。

因此,文本外观是使用任意矢量图形指令绘制的,而后面的文本绘制指令实际上什么也没,只是使文本可搜索和可提取。这样就不需要将明显的字体嵌入为字体程序。(可以通过使用带有所有空白字形的字体或使用文本渲染模式“不可见”来使文本绘制指令不绘制任何内容。)

如果这个假设被证明是正确的,那么替换虚拟 id的任务不仅需要编辑文本绘制指令的参数,还需要用显示实际 id 的其他指令替换显示虚拟 id 外观的任意矢量图形指令。

如果您碰巧有问题的字体并且愿意并且能够嵌入它,您实际上可以将任意矢量图形指令替换为使用该字体的文本绘制指令。否则准备将实际 id 也绘制为任意矢量图形。

于 2019-12-14T14:47:48.863 回答