打不开的 PDF 看上去像是全军覆没,但通常并非如此。在绝大多数情况下,页面内容依然完好可读地留在文件里,坏掉的只是那一小块内部记账——它负责告诉阅读器每一页从哪里开始。修复文件的意思是把那份记账重建起来,而不是重新做一份文档。
本指南讲解真正坏掉的是什么、如何分辨可救的文件与真正被毁的文件,以及如何在浏览器中修复 PDF 而无需安装任何东西。
损坏的 PDF 里真正坏掉的是什么
PDF 并不像纯文本文件那样是一条连续的文字流。它是一组编了号的对象——字体、图像、页面描述、元数据——其后在文件的最末尾跟着一张查找表,称为交叉引用表,即 xref。xref 记录着每个对象精确的字节偏移量。阅读器打开 PDF 时会先跳到文件末尾,读取 xref,再据此找到第一页。
这种设计很快,却有一个具体的弱点:索引位于末尾,并且向前回指。只要有什么东西改变了对象的位置,或者文件的尾部根本没有传完,xref 里所有的偏移量就会在同一瞬间全部失准。阅读器跑到第 48,213 字节去找第一页,在那里发现的却不是页面,于是放弃。而页面本身其实毫发无伤。
- 交叉引用表损坏。索引还在,但它记录的偏移量已经与实际不符。这是 PDF 损坏中最常见的一种,而且几乎总能修好。
- 文件被截断。上传、下载或复制中途停止,因此文件的最后一部分——包括 xref——从未抵达。可恢复到文件中断的位置为止。
- 对象流受损。个别对象被改动过,通常是因为某个程序向文件写入时出了错。可以逐页修复;受损的页面可能会丢失排版格式。
- 嵌入字体损坏。文字仍在,但它引用的字体无法读取,于是页面显示为空白或一格格方块。通常替换为标准字体即可解决。
- 文件头无效。文件并非以
%PDF-开头。这往往意味着它其实不是 PDF,或者有别的东西被加在了它前面。
常见错误提示的真实含义
阅读器给出的提示,是判断问题所在的一个相当可靠的线索。最常出现的是这几种:
| 错误提示 | 通常意味着什么 | 能否恢复? |
|---|---|---|
| 「打开此文档时出错。文件已损坏且无法修复。」 | Adobe 自身的修复尝试败在了损坏的 xref 上 | 通常可以,换一个工具即可 |
| 「无法加载 PDF 文档。」 | Chrome 无法解析文件头或 xref | 通常可以 |
| 「此文件不是受支持的文件类型,或已损坏。」 | %PDF- 文件头无效或缺失 | 有时可以——先确认它确实是 PDF |
| 「应为 dict 对象。」/「对象编号无效。」 | 对象流受损 | 部分可以——未受损的页面能恢复 |
| 能打开,但每一页都是空白 | 嵌入字体损坏或缺失 | 通常可以 |
| 能打开,但中途就没有了 | 文件被截断 | 仅能恢复到截断处 |
| 「此文档受保护。」 | 这根本不是损坏:文件是加密的 | 这不是修复能解决的问题 |
最后那一行的分量远超它的外表。人们送到修复工具面前的文件里,有相当一部分根本没有损坏——它们只是设了密码,而阅读器的提示措辞不够清楚而已。如果你知道密码,请用 PDF 加密 来管理该文件的加密设置,而不是试图修复它。
哪些能恢复,哪些不能
在这件事上,如实设定预期比盲目乐观更有价值,因为它能告诉你何时该停止在一个文件上耗时间,转而去找原件。
- 几乎总能恢复:损坏的 xref 表、阅读器拒绝打开但其余部分完整的文件、由写入中途崩溃的程序保存的 PDF,以及因字体问题而显示空白的文件。
- 可部分恢复:被截断的文件。你能拿回截断字节之前的全部内容,之后的则一概没有。一个下载到 80% 的文件,通常能得到大约 80% 的页面,且这些页面是完好的。
- 很少能恢复:对象流本身已被无关数据覆盖的文件,比如硬盘故障或存储卡濒临报废所致。索引可以重建,但它指向的内容是真的已经不在了。
- 根本不是修复的问题:加密文件、本来就不是 PDF 的文件(例如给 Word 文档加了
.pdf后缀),以及 0 字节文件。一个 0 字节的文件里,没有任何东西可供恢复。
动手修复前先试的三件事
每一件都不到一分钟,而且每一件都能解决一类真实存在、却并非「损坏」的问题:
- 换一个阅读器打开。不同阅读器对格式不规范文件的宽容度差别极大。被 Adobe Acrobat 一口回绝的 PDF,往往能在 Chrome 或 Firefox 中打开,后者会默默绕过较小的结构问题。如果在浏览器里能打开,把它重新打印成 PDF,你就得到了一份干净的副本。
- 重新下载一次。如果文件是通过网络传来的,最简单的解释就是传输失败了。重新下载,并在断定问题出在文件本身之前,先把它的大小和来源处对比一下。
- 确认它确实是 PDF。用任意纯文本编辑器打开它,看第一行。真正的 PDF 以
%PDF-1.4或类似内容开头。如果你看到PK,那是后缀写错的 ZIP 或 Office 文件;如果看到<!DOCTYPE html>,说明你下载到的是一张错误页面,而不是文档。
三步修复 PDF
如果文件确实损坏了,用 PdfDocShift 修复它只需三步。无需安装、无需注册,上传的每个文件都会在两小时后从我们的服务器上永久删除。
打开「PDF 修复」工具
前往 pdfdocshift.com/repair-pdf,把损坏的文件拖到上传区域,或点击浏览选择。请原封不动地上传该文件:不要事先改名、不要重新保存、也不要打开后再导出,因为这些动作中的任何一个都可能覆盖掉尚可恢复的结构。
让修复流程跑完
工具不会去信任现有的索引,而是遍历整个文件寻找有效的 PDF 对象,用找到的内容重建页面树,重新生成交叉引用表,并把任何无法读取的嵌入字体替换为标准字体。大多数文件几秒钟即可完成;体积极大或损毁严重的则需要更久。
下载并核对
下载修复好的文件,并认真核对——不要只看第一页。先确认页数与你的预期相符,再抽查中间的某一页和最后一页。如果缺页,说明文件曾被截断,你拿到的就是所有幸存下来的内容。
修复扫描件和图像密集的 PDF
扫描文档的损坏方式与文本文档不同,值得当作单独一类来对待。扫描版 PDF 是一个装满大图的容器,因此文件中图像数据所占的比例要大得多:这意味着截断夺走的是整页内容,而不只是一份坏掉的索引;而不完整的文件往往正好断在某张图像中间,留下半张画到一半的末页。
由此可以得出两点。第一,请在对扫描版 PDF 做任何其他操作之前先修复它;对已损坏的扫描件施加压缩或转换,往往会把损坏永久性地固化下来。第二,如果修复后的文件能打开,但文字已无法选中,说明文本层没能幸存——你可以把修复后的文件送入 OCR PDF 来重建它,该工具会读取图像并在其下方写入一层全新的、可检索的文字。
如果抢救回来的扫描件此后显得过于笨重——修复有时会产出比原件更大的文件,因为它无法复用已经损坏的压缩结构——那么 压缩 PDF 可以在不触碰页面本身的前提下把体积降回来。
PDF 是怎么损坏的,又该如何避免
现实中几乎所有的 PDF 损坏都可以归结到少数几个原因,而其中大多数都是可以避免的:
- 传输中断。下载掉线、复制途中断开的网络共享,或是在写入完成前就被拔掉的 U 盘。请务必以正确方式弹出可移动介质,并在大文件传输后核对文件大小。
- 在云端文件同步时编辑它。当 Dropbox、OneDrive 或 Google Drive 正在上传某个 PDF 时覆盖保存,是产出一个半新半旧文件的可靠方法。请等同步完成后再打开文件。
- 程序在保存过程中崩溃。由意外退出的程序写出的 PDF,通常内容尚在,却没有有效的索引——这正是最典型的可修复情形。
- 通过老旧服务器以内联附件形式发送 PDF。某些老式邮件系统至今仍会对二进制附件施加文本模式编码,从而在传输途中把它们损坏。若面对的是你不太信任的系统,请在发送前先把文件打包成压缩包。
- 存储介质开始失效。坏扇区和濒临报废的存储卡会悄无声息地损坏文件。如果同一个驱动器上不止一个文件出了问题,那问题就出在这个驱动器本身——先把所有数据拷贝出来,再谈其他。
常见问题
并非一定,但大多数可以。交叉引用表损坏是 PDF 打不开的最常见原因,而它几乎总能修好,因为页面内容并未受损,需要重建的只是索引。被截断的文件可以恢复到中断处为止。若文件的实际内容已因磁盘故障被覆盖,通常无法恢复;而 0 字节的文件,任何工具都救不回来。
不应该会。修复重建的是文件的结构索引和页面树,页面内容会被原样复制过去。唯一的例外是嵌入字体:如果某个字体无法读取,修复过程会用标准字体替代,这可能让页面上文字的间距或排布略有变化。文字本身不受影响。
浏览器对格式不规范的 PDF 远比 Acrobat 宽容。Chrome 和 Firefox 会默默绕过损坏的交叉引用表,直接遍历文件寻找页面;而 Acrobat 会校验结构,并拒绝那些不合格的文件。这其实是个有用的信号:如果能在浏览器里打开,说明内容完好,修复几乎肯定会成功。
通常这是字体问题,而非页面受损。页面内容其实存在,只是它引用了一个阅读器无法解码的嵌入字体,因此什么也画不出来。用标准字体替换的修复流程一般能让可见文字重新显示。如果之后页面依然空白,那这份文档可能真的含有空白页——可以试试「删除空白页」,确认究竟有多少页带有内容。
只要该工具在传输过程中加密上传内容并及时删除文件,就是安全的。PdfDocShift 对每次上传均采用 256 位 SSL,并在两小时后将每个文件从服务器上永久删除。对于特别敏感的材料,请先修复文件,再在分享之前用「PDF 加密」工具为其添加密码,该工具采用 256 位 AES 加密。
不能。修复与解密是完全不同的两件事。修复工具重建的是损坏文件的结构,它既不会移除加密,也无法还原密码。如果一个 PDF 打开时弹出的是密码提示而非错误信息,那这份文件并没有损坏——它是受保护的,你需要密码才能打开。