WhatsInMyPDF
← 文章

PDF 里文字可以藏在的 10 个地方

2026年7月7日

一份 PDF 不是单一的文档。它是铺在一大堆数据之上的可见页面,这层页面和底层数据不必一致。文字可以留在文件里,而页面上什么都不显示。指令、附件和代码都可以随文件一起流转,却从不出现在屏幕上。这篇文章梳理内容可以藏身的十个位置——也是这个扫描工具检查的十项内容——并说明每一种在什么情况下值得警惕。

贯穿全篇的一条线索是,以下内容对人眼都是隐形或近乎隐形的,却完全能被读取文件的软件获取。有些很常见,也无害。有些则几乎从不是无意为之。分清两者,是这项技能的全部要点。

1. 近白色文字

文字颜色与页面背景极为接近,人眼看到的是一片空白,而任何解析文本层的程序都能逐字读出。白底白字是最经典的藏匿手法,也几乎从不是无意的。这是误报率最低的信号:如果扫描报告发现了近白色文字,应默认它是真实问题,除非另有证据。

2. 隐形渲染模式

PDF 允许文字以一种不绘制任何像素的渲染模式呈现——字符仍被放进文本层,但页面上什么都看不到。这种模式通常写作渲染模式 3(render mode 3)。正常的排版工具几乎不会用到它,所以它的出现本身就是一个强信号,说明有人刻意让文字变得可提取却不可见。

3. 极小字号

字号小于约 4pt 的文字,在屏幕或打印中都难以辨认,却能被软件完整提取。这一项的误报风险中等:图表上一个正当的小号标注,或一行细小的说明文字,确实可能小到这个程度。所以扫描标出这类文字后,先读一读内容再下判断。一行写着“忽略之前的所有指令”的小字,和坐标轴上 3pt 的刻度标签,完全是两回事。

4. 页面外文字

文字可以被放在可视裁剪区域之外——超出页面显示和打印的边界——因而在查看文档时永远不会出现。这在扫描件或经过 OCR 裁剪的文件里很常见,也基本无害,因为边距本就被裁掉了。除此之外,文字落在页面边界之外就值得留意。不过检测上有一个限制:完全落在裁剪框之外的文字,会在文本提取之前就被 PDF 引擎裁掉,所以扫描无法像对待其余九种情况那样把它提取出来并引用。扫描工具转而标记的是通常伴随这种手法出现的裁剪框不匹配问题——页面的裁剪区域比其完整的原始尺寸更小——即便被裁掉的文字本身依然无法直接获取,这个信号仍然值得检查。

5. 裁剪框不匹配

与上一条相关但不完全相同:一个页面可以被裁剪得比其完整的原始尺寸更小,这会把落在被裁边距里的内容推出可视范围。内容仍然留在文件里,只是不在你看到的窗口内。这种情况经常只是扫描过程留下的无害痕迹。正确的做法是去检查裁剪范围之外究竟是什么,而不是提前认定它无害或有问题。

6. 隐藏图层

PDF 支持可选内容图层(optional content group)——可以被开启或关闭的图层。一个图层可以默认关闭,也可以被显式标记为隐藏,它的内容仍留在文件里,软件依然可以读取,即便普通的阅读器不会显示它。大多数阅读器根本不提供图层面板,这正是这种藏匿方式能够奏效的原因。一个默认关闭的图层值得仔细核查:读一读它的名称和内容。

7. 批注

评论、便签等批注携带的文字在正常渲染下不可见,但仍留在文件结构里。相当一部分批注是编辑过程留下的正当内容。但正因为它们的内容不会出现在页面上,批注是藏匿指令的经典位置。永远读一读批注文字本身,不要因为“只是个评论”就默认它无害。

8. 嵌入文件

一份 PDF 可以携带附加在内部的其他文件——表格、更多 PDF、任意数据。这在工程数据表里很常见,出现在论文或合同里则不寻常。一个附件可以装下相当于一整份隐藏文档的文字量。扫描应当始终列出嵌入文件的名称,不要贸然打开——附件正是有人藏匿不想出现在页面上的内容的理想位置。

9. 嵌入 JavaScript

PDF 可以携带 JavaScript 代码,部分阅读器打开文件时会执行它。这在交互式表单里是预期行为,出现在静态的论文或合同里就不寻常。撇开代码具体做什么不谈,它的存在本身就是文档携带的、超出可见页面的内容。一个好的扫描工具只报告 JavaScript 的存在,从不执行它——它只是告知你这里有代码,由你决定如何处理。

10. 提示词注入模式

第十种更像是一种用途,而非具体的藏身位置。文件里任何地方的文字——可见的,或者更常见的,通过上述方法隐藏起来的——都可能匹配已知的、试图操纵 AI 审阅者或摘要工具的模式:让它忽略原有指令、给出正面结论,或附加某个特定的结语。这本身是提示性的,不是定论。一篇讨论提示词注入(prompt injection)的论文完全可能合理地引用这类文字,所以上下文才是最终的判断依据。但注入式表述如果出现在原本不可见的文字里,这个组合就值得认真对待。

如何解读结果

注意这十项如何分成两组。有几项——近白色文字、隐形渲染模式——是强信号,几乎总是意味着刻意藏匿。其余大多数则取决于上下文:页面外文字、裁剪框不匹配、极小字号或一条批注,在扫描件或经过编辑的文件里都可能完全无害,只有读了实际隐藏的内容之后才能判断是否需要担心。面对一条发现,正确的反应从来不是恐慌,也不是耸耸肩,而是读一读被标记的文字,结合它所在的页面,自己做出判断。

结构扫描之所以是做这件事的合适工具,是因为它能读取肉眼无法判断的属性:精确的填充颜色、字号、相对裁剪框的坐标、渲染模式、图层归属,以及文件中不参与渲染的部分——附件、脚本、批注内容。它一次性把十个位置全部检查一遍,并引用找到的内容。

有两个诚实的局限值得说明。第一,干净的扫描结果并不能证明文件安全:烘焙进图片里的文字没有文本层可供检查,而一段负载也可能被措辞得足够隐晦,以至于绕过了模式列表,却依然能被模型理解。第二,发现是证据,不是定论——文件结构告诉你藏在哪里、内容是什么,判断则由你来做。

这十项里有两项值得单独细看。近白色文字是白字简历套路背后的机制,提示词注入模式则是一篇专门讨论针对 AI 审阅者的隐藏指令的文章的主题。如果你更想先动手逐项检查再决定要不要用扫描工具,如何检查 PDF 里的隐藏文字讲的就是手动方法。

想知道某个具体文件里藏着什么?在首页把它交给扫描工具试试。 它在浏览器本地检查全部十项内容,把发现的一切都引用出来,文件不会被上传。