知识库 · 图片与文件
为什么我的 PDF 文件这么大?
简短回答
大多数体积超标的 PDF 都是图片造成的:全分辨率照片,或压缩不足的扫描页。其他原因还有完整嵌入的字体(尤其是中文、日文、韩文字体)、增量保存留下的编辑历史、重复的图片以及附件。把图片降采样到适合屏幕阅读的 150 PPI、重新压缩,再另存一份干净的副本,通常能把体积减半甚至更多。
打开压缩 PDFPDF 里到底是什么在占空间
PDF(标准为 ISO 32000)是一组对象的集合:页面描述、字体、图像和元数据,每个对象都可以选择压缩。文字和矢量图形非常小,一整页文字往往只要几 KB。体积问题都出在那些「重」对象上。
| 原因 | 典型影响 | 产生原因 |
|---|---|---|
| 相机原始分辨率的照片 | 每张 1–10 MB | 一张 1200 万像素的照片被放到只需要其中一小部分像素的页面上 |
| 扫描页 | 每页 0.5–5 MB | 每页都是一张全彩图像,哪怕上面只有黑色文字 |
| 嵌入字体 | 几十 KB 到 20 MB 以上 | 嵌入了整个字体文件,而不只是用到的字符 |
| 增量保存 | 每编辑一次就变大一点 | 修改内容追加在文件末尾,旧版本对象仍留在文件里 |
| 重复图片 | 图片体积成倍增加 | Logo 每页存一份,而不是共享同一份 |
| 附件、图层、表单 | 不一定 | 嵌入的文件、隐藏图层和表单脚本 |
扫描页:算一笔账
一页 A4 以 300 PPI 扫描,是 2480 × 3508 = 8,699,840 像素。彩色每像素 3 字节,未压缩时每页约 26.1 MB。
- 灰度(每像素 1 字节)时,同一页未压缩约 8.7 MB。
- 黑白(每像素 1 位)时降到约 1.09 MB,再用 CCITT Group 4 或 JBIG2 等二值压缩,一页文字通常只有几十 KB。
- 彩色版本用 JPG 压缩后通常每页 1–3 MB,所以 20 页的彩色扫描件轻松超过 20 MB。
扫描文字文档时,用 300 PPI 的灰度或黑白模式,而不是 600 PPI 彩色,是扫描件最大的节省手段。
PDF 压缩的原理
PDF 的数据流会声明一个过滤器(filter),说明它的压缩方式。压缩工具就是通过换用更好的过滤器,或用更强的参数重新压缩来缩小文件的。
| 过滤器 | 方式 | 用于 |
|---|---|---|
FlateDecode | 无损(zlib/deflate,与 PNG 和 ZIP 相同) | 文字、矢量图形、无损图像 |
DCTDecode | 有损 JPEG | 照片 |
JPXDecode | JPEG 2000 | 高质量图像、存档扫描件 |
JBIG2Decode | 二值,无损或有损 | 黑白扫描件 |
CCITTFaxDecode | 二值传真压缩 | 较老的黑白扫描件 |
PDF 1.5 还引入了对象流和交叉引用流,可以压缩文件的内部结构。用较新的 PDF 版本保存即可启用。
如何让 PDF 变小
- 图片降采样:屏幕阅读和邮件发送用 150 PPI 就够了,打印用 300 PPI。
- 照片以中等质量重新压缩为 JPG;文字扫描件转为灰度或黑白。
- 用「另存为」或优化命令代替「保存」,这样会重写文件,丢掉旧的增量更新。
- 嵌入字体子集(只包含用到的字符),而不是完整字体。
- 删除不需要的附件、隐藏图层、缩略图和无用的表单数据。
- 如果单个文件还是太大,就拆分成几部分,或只发送需要的页面。
计算示例:一份 30 页的报告,含十张 4 MB 的手机照片,大约 40 MB。按照片实际打印宽度约 6 英寸(900 像素)以 150 PPI 降采样,并以 80% 质量存为 JPG 后,每张通常不到 200 KB,整个文件约为 2–3 MB。
需要注意什么
过度压缩是有代价的。降采样到 150 PPI 以下,图片中的小字会难以辨认;有损 JBIG2 过去还发生过把扫描件中外形相似的数字替换掉的问题,所以发票和合同用无损模式更安全。
很多邮箱服务的附件上限在 20–25 MB 左右,有些上传表单只接受 2–5 MB,决定压缩力度前先查清限制。
常见问题
压缩 PDF 会降低质量吗?
删除旧对象、压缩结构等无损优化不会。图片降采样和重新压缩确实会减少图像细节,但在屏幕上以 150 PPI 查看时通常看不出来。
为什么只有几页的 PDF 也这么大?
几乎可以肯定里面有大图、以全彩保存的扫描页,或完整嵌入的字体。纯文字占用的空间非常小。
为什么我的 PDF 每保存一次就变大一些?
很多编辑器采用增量保存,把修改追加到文件末尾,同时保留旧对象。用「另存为」或优化选项保存一份新副本即可清除。
PDF 中的图片应该用多大分辨率?
屏幕阅读或邮件发送的文档用 150 PPI 左右,专业印刷用 300 PPI。更高的数值基本只会增加体积。