取消隐藏 PDF 中隐藏文本的 PostScript 代码

PostScript code to un-hide hidden text in PDF

我有一个 PDF,里面有一些隐藏的文本。

当我按下 [CTRL+a] 时,我在我的文档查看器中看到了隐藏文本。

我也可以复制文本,我可以通过 pdftotext 提取文本,但我无法为文本重新着色,因此我可以在 PDF 查看器中查看隐藏的文本而无需按 [CTRL+a ].

所以我有了想法,我可以使用 PostScript 并更改此文本对象的颜色。

但是我如何确定是什么函数设置颜色或隐藏文本?

首先,PDF 中的隐藏文本是通过文本渲染模式完成的,而不是颜色。文本渲染模式 3 为 'neither stroke nor fill'。因此,如果这是绘制文本的方式,则更改颜色对您没有帮助。当然,我们无法判断文本是否是这样绘制的(但我怀疑是这样),因为您还没有使 PDF 文件 public 可用。在几乎所有情况下,如果您想讨论特定文件,最好的办法是将其设置为 public.

其次,您不能使用 PostScript 更改 PDF 文件(好吧,您可以编写一个 PostScript 程序来解释 PDF 文件,但这很难...)

您不能使用 PostScript 来实现您想要的。您需要手动编辑 PDF 文件...


"hide"文本基本上有3种方式:

  • 它可以是白色(或任何颜色)文本在白色(或与文本相同的颜色)背景上。
  • 它可能被另一个对象覆盖,例如,白色区域或图像。
  • 它可能正在使用 文本呈现模式 3 ("3 Tr")。

前两种情况我不会在这里解释,因为它们不太可能。对于第三种情况,您可以这样进行:

  1. 使用qpdf解压尽可能多的压缩在'streams'里面PDF,创建 qpdf 称为 'QDF mode' 的 PDF:

    qpdf --qdf --object-streams=disable input.pdf uncompressed.pdf
    
  2. 在好的文本编辑器中打开 uncompressed.pdf,例如 VIm.

  3. 搜索序列 3 Tr
    (文本呈现模式 3 在 PDF-1.7 规范中被描述为 "Neither fill nor stroke text (invisible)."

  4. 将其更改为1 Tr2 Tr并保存文件。
    (文本渲染模式1为"stroke text",模式2为"Fill, then stroke text."模式1只会显示轮廓... )

  5. 重新压缩文件:

    qpdf uncompressed.pdf input-modified.pdf
    
  6. 在您最喜欢的 PDF 查看器中打开新文件 input-modified.pdf。它现在应该显示 "un-hidden" 文本。


更新

从 OP(通过私人渠道)收到带有 "hidden" 文本的 PDF 文件样本后,我现在可以确认隐藏确实是通过使用白色文本颜色(RGB-白色)实现的。

要使此类文本可见:

  1. 解压缩 PDF,使用 qpdf --qdf --object-streams=disable in.pdf unpacked.pdf

  2. 搜索所有出现的 1 1 1 rg1 1 1 RG。这些将 RGB 颜色设置为白色(第一个 非描边 ,第二个用于 描边 操作)。

  3. 未压缩 PDF 文件的 QDF 版本中的 %%Contents for page N: 注释将指出颜色设置对哪个页面有效。 (注意rgRG运算符可能出现多次,每一次为下一次绘图操作设置不同(或相同)的颜色。)

  4. 现在用黑色替换白色,方法是用 0 0 0 rg0 0 0 RG 覆盖找到的事件。不要一次全部执行此操作,而是一个接一个地执行,并在保存更改后观察相应页面上的变化。 (如果文本已经在黑色背景上,您可能希望避免将白色文本涂成黑色!)