取消隐藏 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"
)。
前两种情况我不会在这里解释,因为它们不太可能。对于第三种情况,您可以这样进行:
使用qpdf解压尽可能多的压缩在'streams'里面PDF,创建 qpdf
称为 'QDF mode' 的 PDF:
qpdf --qdf --object-streams=disable input.pdf uncompressed.pdf
在好的文本编辑器中打开 uncompressed.pdf
,例如 VIm.
搜索序列 3 Tr
。
(文本呈现模式 3 在 PDF-1.7 规范中被描述为 "Neither fill nor stroke text (invisible).")
将其更改为1 Tr
或2 Tr
并保存文件。
(文本渲染模式1为"stroke text",模式2为"Fill, then stroke text."模式1只会显示轮廓... )
重新压缩文件:
qpdf uncompressed.pdf input-modified.pdf
在您最喜欢的 PDF 查看器中打开新文件 input-modified.pdf
。它现在应该显示 "un-hidden" 文本。
更新
从 OP(通过私人渠道)收到带有 "hidden" 文本的 PDF 文件样本后,我现在可以确认隐藏确实是通过使用白色文本颜色(RGB-白色)实现的。
要使此类文本可见:
解压缩 PDF,使用 qpdf --qdf --object-streams=disable in.pdf unpacked.pdf
搜索所有出现的 1 1 1 rg
和 1 1 1 RG
。这些将 RGB 颜色设置为白色(第一个 非描边 ,第二个用于 描边 操作)。
未压缩 PDF 文件的 QDF 版本中的 %%Contents for page N:
注释将指出颜色设置对哪个页面有效。 (注意,rg
和RG
运算符可能出现多次,每一次为下一次绘图操作设置不同(或相同)的颜色。)
现在用黑色替换白色,方法是用 0 0 0 rg
和 0 0 0 RG
覆盖找到的事件。不要一次全部执行此操作,而是一个接一个地执行,并在保存更改后观察相应页面上的变化。 (如果文本已经在黑色背景上,您可能希望避免将白色文本涂成黑色!)
我有一个 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"
)。
前两种情况我不会在这里解释,因为它们不太可能。对于第三种情况,您可以这样进行:
使用qpdf解压尽可能多的压缩在'streams'里面PDF,创建
qpdf
称为 'QDF mode' 的 PDF:qpdf --qdf --object-streams=disable input.pdf uncompressed.pdf
在好的文本编辑器中打开
uncompressed.pdf
,例如 VIm.搜索序列
3 Tr
。
(文本呈现模式 3 在 PDF-1.7 规范中被描述为 "Neither fill nor stroke text (invisible).")将其更改为
1 Tr
或2 Tr
并保存文件。
(文本渲染模式1为"stroke text",模式2为"Fill, then stroke text."模式1只会显示轮廓... )重新压缩文件:
qpdf uncompressed.pdf input-modified.pdf
在您最喜欢的 PDF 查看器中打开新文件
input-modified.pdf
。它现在应该显示 "un-hidden" 文本。
更新
从 OP(通过私人渠道)收到带有 "hidden" 文本的 PDF 文件样本后,我现在可以确认隐藏确实是通过使用白色文本颜色(RGB-白色)实现的。
要使此类文本可见:
解压缩 PDF,使用
qpdf --qdf --object-streams=disable in.pdf unpacked.pdf
搜索所有出现的
1 1 1 rg
和1 1 1 RG
。这些将 RGB 颜色设置为白色(第一个 非描边 ,第二个用于 描边 操作)。未压缩 PDF 文件的 QDF 版本中的
%%Contents for page N:
注释将指出颜色设置对哪个页面有效。 (注意,rg
和RG
运算符可能出现多次,每一次为下一次绘图操作设置不同(或相同)的颜色。)现在用黑色替换白色,方法是用
0 0 0 rg
和0 0 0 RG
覆盖找到的事件。不要一次全部执行此操作,而是一个接一个地执行,并在保存更改后观察相应页面上的变化。 (如果文本已经在黑色背景上,您可能希望避免将白色文本涂成黑色!)