PDFNOTED:压缩 PDF 救不了你的文件,反而可能带来新问题
"文件太大传不上去,压缩一下吧。"
这是处理 PDF 时最常见的操作之一。但压缩解决的是体积问题,而你真正想解决的往往是安全问题。这两件事经常被混为一谈。
这篇文章讲清楚:压缩到底做了什么、没做什么,以及在什么情况下压缩反而会让事情变糟。
一、压缩做了什么
PDF 压缩主要作用在三个地方:
- 图片重编码 —— 降低分辨率、提高压缩率(JPEG 质量下降)
- 字体子集化 —— 只保留文档里实际用到的字形
- 对象流压缩 —— 把内容流用 Flate 等算法压一遍
这三项的共同点是:都在减小体积,都不改变内容的可读性。
一份 20MB 的合同压完可能是 3MB,但里面该有的字一个不少,批注也还在,元数据也还在。
二、压缩没做什么
| 你以为的 | 实际情况 |
|---|---|
| 压缩后乱码就看不见了 | 乱码是字体映射问题,压缩不会修复 |
| 压缩能去掉水印 | 水印是独立对象,压缩不影响 |
| 压缩后批注没了 | 批注在 /Annots,压缩不动它 |
| 压缩等于脱敏 | 压缩不改变任何文本内容 |
| 压缩会清掉元数据 | 元数据不在压缩范围 |
一句话:压缩是"打包",脱敏是"移除",这两个动作在 PDF 里完全是两条路径。
三、压缩可能带来的新问题
压缩不总是无害的,有三个常见副作用:
1. 有损压缩降低可读性
图片重编码用有损算法时,扫描件上的小字、印章、手写签名会变糊。如果这份文件是要存档或者作为证据的,这个损失不可逆。
2. 字体子集化导致提取异常
字体被裁剪成子集后,pdftotext 提取可能出现缺字或乱码。这会让你后续的验证工作出现误判——提取不出关键词,你以为删干净了,其实只是提取坏了。
这一条特别危险,因为它会让验证失效。
3. 增量更新叠加导致文件反而变大
这是最反直觉的一点:反复编辑再保存的 PDF,有时候越压越大。
原因是 PDF 的增量更新机制——每次修改不重写整个文件,而是在末尾追加变更记录。修改次数多了,文件里就堆着多个版本的数据。这时候压缩只是把新数据压一遍,历史数据还在。
四、正确的处理顺序
如果你的目标是"把文件处理到可以安全对外发出",顺序应该是:
1. 扫描:找出批注 / 元数据 / 隐藏文字 / 水印 / 敏感信息
↓
2. 清理:对象级移除(不是遮盖)
↓
3. 修改:需要保留的内容做编辑或批注
↓
4. 压缩:这一步才轮到体积优化
↓
5. 导出 + 复检
压缩放在第 4 位,不是第 1 位。先压缩再清理,等于先打包再找东西——白做。
五、验证:压缩不能替代脱敏
跑一遍就知道:
# 压缩后,敏感词照样能搜出来
pdftotext 压缩后.pdf - | grep -i "报价\|身份证\|内部"
# 元数据照样在
pdfinfo 压缩后.pdf
# 批注照样在
strings 压缩后.pdf | grep -c "/Annots"
如果这三条还能输出结果,说明压缩没有起到任何脱敏作用。

六、什么时候该压缩,什么时候该清理
| 场景 | 该做什么 |
|---|---|
| 邮件附件超大小限制 | 压缩 |
| 网站上传有体积限制 | 压缩 |
| 发给外部客户 | 清理 + 压缩 |
| 对外发布/公示 | 清理 + 压缩 |
| 内部存档 | 可选压缩 |
| 作为证据提交 | 不压缩,只清理 |
规则很简单:涉及对外,先清理;涉及体积,再压缩。
利益相关说明
PDFnoted(pdfnoted.com)是我自己在做的产品,做的是文档安全工作流:上传 → 检测 → 修改/批注 → 脱敏 → 导出 → 复检。压缩是这条流程里的一个可选环节,不是安全手段。
免费且不需要登录的部分:文字水印清理、元数据清理、批注清理。可以先拿手上的文件试一遍,再用上面的命令验证效果。
浙公网安备 33010602011771号