PDF 页面整理

把页面排到正确的顺序,把歪着的转正,把空白页丢掉 —— 看着实际的页面来做,而不是靠页码猜。

🔒 你的 PDF 不会离开浏览器。缩略图在你自己的机器上渲染,什么都不上传。

🗂️

把一个 PDF 拖到这里看它的页面

这里的旋转是相对的 —— 这不是一个无关紧要的细节

扫描件与手机拍的页面很常见地自带一个旋转:PDF 里存着 /Rotate 270,每个阅读器都会先转正再显示给你看。一个设定旋转角度而不是叠加角度的工具会把这层信息丢掉——你点一次「向右转」,一张本来就是正的页面就悄无声息地歪掉了。在这里,「向右转」永远是指从你眼前看到的样子顺时针转一格,而缩略图在你保存之前就会显示结果。

拖动,或者用按钮 —— 两种都特意支持

有鼠标的时候,拖放是移动页面最快的办法;没有鼠标,它就没用了。每张卡片同样带着 ◀ 和 ▶ 按钮,所以整个工具靠键盘、在手机上也能用。页码会随着你的操作重新编号,而被移动过的页面会留一个小小的「原第 7 页」标签,方便你还能找到它。

保存之前什么都不会被真的销毁

删除一页会把卡片变灰,原地留一个 ↺ 按钮 —— 在你下载之前,这一页其实还在。这也是为什么你拿回的是一份新文档:本工具从不覆盖你给它的原文件。页面内容、图片、批注与表单字段都会带过去;书签不会,而工具会当场说清楚这一点,不让你事后才发现。

需要反过来的操作?拆分能把一段页码区间抽成单独的文件,合并能把几份完整的文档接到一起。

本工具执行的全部检查(共 26 条规则)

PDFI-001 没有 PDF 文件头

开头一千字节里没有 %PDF 标记 —— 这个文件要么不是 PDF,要么开头已经没了。改了扩展名的 Office 文件、被存成 ".pdf" 的 HTML 报错页,都会落到这里。

修复: 重新导出或重新下载;顺便确认它真实的格式是什么。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFI-002 文件被截断

接近末尾处没有 %%EOF 标记。PDF 以 %%EOF 结束;缺了它意味着下载或复制中断过。这一份通常修不回来。

修复: 从源头重新下载或重新导出。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFI-003 加密的 PDF

文件带着 /Encrypt 字典。本工具不移除密码、也不处理受保护的文件 —— 这是有意划下的边界,不是缺陷。

修复: 用任意阅读器输入密码打开它,再导出一份不加密的副本。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFI-004 交叉引用表损坏

末尾附近没有 startxref 指针。有些阅读器会重建这张表并照样打开文件;但处理过程仍可能失败。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFR-001 页码选择读不懂

选择的写法是页码与区间:3、1-5、7-(到最后一页)、-4(从第一页起)、last。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFR-002 区间写反了

像 9-3 这样的区间是倒着写的。区间从小到大;修复建议会告诉你对调后的写法。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFR-003 页码超出范围

选择指向了最后一页之后。消息里会写出这份文档真实的页数。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFR-004 选择结果为空

这个选择一页都没有命中。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFO-001 坏文件被跳过,合并继续

诊断没通过的文件会被跳过,并把它的诊断结论一并附上 —— 绝不无声丢弃 —— 合并则带着其余文件继续。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFO-002 结构看着没问题,引擎却读不了

字节层面的检查都过了,解析器却在更深处失败。引擎的报错会原样引出来,这个文件被跳过。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFC-001 没有可重压的东西

本工具靠重新压缩 PDF 里的 JPEG 来给图片多的文件瘦身。纯文字文件没有图片可处理 —— 这一点会如实报告,而不是含糊带过。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFC-002 保留原件 —— 它本来就已经很省了

如果重新编码并不会让文件更小,就把原始字节原样返回。不造假节省量,也不做无谓的重存。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFC-003 每一处改动都列出来

每张被重压的图片都报出它压缩前后的体积、分辨率与 PSNR(用分贝衡量像素与原图有多接近)。没有任何改动是悄悄做掉的。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFC-004 处理不了的图片原样保留

色彩空间或编码方式超出编解码器能力的图片(某些 CMYK 印刷文件、带遮罩的图片)会被逐字节保留 —— 错误的重新编码会把这一页毁掉。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFC-005 有图片,但没有一张适合重压

文件里有图片,但每一张都属于本工具有意不碰的形态(黑白传真扫描件、模板遮罩、透明通道、少见的色彩空间)。每张图片都会说明自己属于哪一种 —— 明明有图片却谎称「没有图片」,这个工具不做。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFU-001 没有加密 —— 没有什么可解锁的

文件里没有 /Encrypt 字典,也就没有密码。什么都没有被改动。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFU-002 需要密码

加密的 PDF 是用你自己提供的密码来解密的。本工具从不破解、不猜测、不绕过任何保护 —— 权限密码(所谓 owner 密码)同样如此,而有些站点是不问一声就把它去掉的。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFU-003 密码不对

提供的密码打不开这份文档。一个 PDF 可以带两个密码;这里需要的是能打开文件的那一个。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFU-004 已在本地解密

文档是在你的浏览器里用你的密码解密的,保存时不再加密。什么都没有上传。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFU-005 无法重建文档

引擎在密码这一步之后失败了;底层的报错会原样引出来,而不是藏起来。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFG-001 不是 90 度的整数倍

PDF 把页面旋转存为 /Rotate,而格式规定它必须是 90 的倍数。任意角度需要把页面内容重画一遍,本工具不做这件事 —— 所以它选择拒绝,而不是悄悄四舍五入。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFG-002 所有页面都被删掉了

零页的 PDF 不是一份有效文档,所以这个方案被拒绝,而不是写出一个打不开的文件。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFG-003 这一页不存在

请求了文档之外的页码。整个方案被拒绝:与合并不同,重排里被悄悄丢掉的一页,在结果里是看不出来的。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFG-004 这个方案什么都没改

页面方案与原文档完全相同,所以产物只会是一次重建。直说这一点,而不是把它当成做了活。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFG-005 页面重建之后什么会留下

页面内容、图片、批注与表单字段都会被复制。文档大纲(书签)在合并时会带过去 —— 目的地会被重映射到新的页码位置 —— 但重排或删页的页面重建并不会重映射它们,因为一个指向已经不存在的页面的大纲条目没有正确答案。这一点先说清楚,而不是让你事后发现。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

PDFO-003 没有产物

每一个输入都失败了 —— 没有结果文件。

来源: 这是本工具引擎的规则,写出来是为了让你确切看到它做了什么。结构层面的事实(文件头、%%EOF、/Encrypt、startxref)遵循 PDF 文件格式(ISO 32000);诊断用的启发式判断是本项目自己的。

结构性事实依据 PDF 文件格式标准(ISO 32000);页面方案规则(PDFG-*)——拒绝而不是静默丢页、只接受 90 度整数倍——是本工具自己的规则,并如实标注。

关于这些规则。 每一条都有编号、严重级别和通俗解释。每个来源链接都已登记在案,并对线上页面实际复验过,而不是凭印象写上去的. 规则如何编写、测试与保持更新 →