这是我第一次在这个级别上使用PDF。所以请耐心地回答我的问题。我理解基本层次上PDF文件的逻辑和物理结构。
我有一个PDF,其中包含一个虚拟的ID,需要更换。为了检查,如果有这样的方法,我使用qpdf来扩展PDF
qpdf --qdf -对象流=禁用orig.pdf expanded.pdf
使用十六进制编辑器,我在expanded.pdf中定位了虚拟ID,并通过简单地交换两位数字更改了值
<001800180017> Tj => <001700170018> Tj
并拯救了它。在Acrobat中打开expanded.pdf没有显示修改。原来的ID 443仍然呈现,但搜索"443“找不到它。在搜索"334“(修改后的内容)时,我会高亮显示呈现的原始ID 443。
PDF由文本和矢量图形组成。当我插入额外的数字(这显然使xref中的偏移无效)时,我会收到一条关于缺少字体的错误消息,所有的数字都显示为点,但是矢量图形仍然存在。这似乎表明ID不是图形的一部分。
我错过了什么?
编辑1:在mkl的评论之后,我对我的PDF做了更深入的分析,发现除了明显的图形内容之外,所有文本都是由BT/ET部分遵循的一系列m/l/c命令呈现的。在BT/ET部分,笔画和非笔画的颜色均为0,0,0。
这是因为用过的嵌入式非标准字体吗?带有嵌入式字体的PDF通常是这样做的吗?图形部分用于视觉表示,而透明(隐藏)文本部分只是为了获得搜索和高亮显示功能?
回顾过去,当我第一次修改内容时,我想知道我做了什么来得到这些点。我似乎不可能,我也不能复制它。
谢谢汤姆
发布于 2019-12-14 14:47:48
首先,以下只是猜测,因为你不能分享有关的pdf。受过教育的猜测,但仍然是猜测。
您报告说,您只需在文本绘图指令参数中交换两位数字,就可以更改该值,现在可以成功地使用交换数字搜索该值,但Acrobat没有显示修改。
此外,您还注意到,所有文本都由一系列m/l/c命令呈现,后面是BT/ET部分。
观察文本被呈现为任意矢量图形(一系列m/l/c命令)的主要情况是pdfs中,生产者不希望文本提取成为可能,并将文本绘制指令替换为任意矢量图形指令。
这显然不是在你的pdf中的情况,因为文字绘图说明没有被取代,而仅仅是由矢量图形的补充。
假设这个构造是出于某种原因而不是偶然使用的,我只能假设pdf生产者不愿意或不允许嵌入有关字体,而是希望显示特定的字体外观,而不必依赖在查看pdf的计算机上安装的字体。
因此,文本外观是使用任意矢量图形指令绘制的,下面的文本绘图指令实际上没有绘制任何内容,只是使文本可以搜索和提取。这样就没有必要将外观字体作为字体程序嵌入。(可以通过使用带有所有空白字形的字体或使用文本呈现模式“不可见”,使文本绘图指令不进行任何绘制。)
如果这个假设是正确的,那么替换虚拟id的任务不仅需要编辑文本绘图指令的参数,还需要用显示实际id的其他指令替换显示虚拟id外观的任意矢量图形指令。
如果您碰巧有问题的字体,并且愿意并能够嵌入它,您实际上可以用字体的文本绘图指令来替换任意的矢量图形指令。否则,也要准备将实际id绘制为任意矢量图形。
https://stackoverflow.com/questions/59290751
复制相似问题