PDF文件压缩:从体积诊断到Ghostscript/qpdf参数化实操
PDF文件压缩这件事,听起来像个不值一提的小操作,但我这两年帮人处理过的文件里,至少有三成是被体积卡住的——复试材料上传系统限制10MB、单位办公系统限制5MB、邮件附件限制20MB,而手里那份带扫描件的PDF动辑七八十兆。很多人第一反应是找个在线站点丢进去点一下,下回来一个糊到看不清表格线的版本,然后再回头找原文件,来回折腾半小时。其实PDF文件压缩的难点从来不是"点哪个按钮",而是你得先判断这份文件到底是被什么撑大的,再用对应的手段去动那一块。同一套参数,用在纯文字排版的讲义上几乎没效果,用在300dpi彩扫的证书上能砍掉九成体积。这篇内容我把日常在办公和备考两类场景里反复验证过的路线整理出来,从判断文件类型、选工具、算参数到踩坑排查,一条条讲清楚。零基础的人照着做能立刻出结果,有经验的人大概能在参数那一节拿到点新东西。适合需要提交材料、发资料、存档、打印的各类读者,也适合经常帮别人"救文件"的人。
1. PDF为什么"看着不大却传不出去":先搞懂压缩的底层逻辑
1.1 三类把PDF撑大的元凶
PDF本质上是个容器,里面装着文字、字体、矢量图形、位图、表单、书签、注释、附件,还有一堆交叉引用表和对象描述。它体积大,九成情况下跑不出三个原因。
第一类是整页位图。扫描仪扫出来的、手机拍的、截图拼的PDF,每一页其实是一张大图片,页面里没有一个真正的文字对象。这类文件的体积几乎等于图片体积之和,是最容易被压缩、也是压缩收益最大的一类。一页A4彩扫在300dpi下原始数据接近25MB,经过扫描软件内部JPEG压缩后也有1.5到3MB,300页就是几百兆。
第二类是字体没有子集化。有些导出工具会把整套中文字体嵌进去,一套思源黑体全字重动辄十几兆,而你文档里其实只用了八百个字。这种文件体积大得莫名其妙,打开一看内容才几页。它的特征是:页数少、没有图片、体积却上兆。
第三类是冗余对象和历史残留。反复编辑、多次合并、从别的文档复制页面带进来的隐藏图层、被删除但仍留在文件里的对象、每页都重复嵌入的同一个页眉logo、缩略图预览、元数据、修订记录。这些东西单看不显眼,累加起来能占到两三成。
判断方法很简单,用开源工具集里的三条命令就能体检:
pdfinfo in.pdf # 看页数、页面尺寸、是否加密、生成工具 pdffonts in.pdf # 看字体是否 embedded、是否 subset pdfimages -list in.pdf # 逐页列出图片的分辨率、色彩空间、编码方式pdfimages -list的输出最有用,如果每一页都对应一到两张大图,且 x-ppi/y-ppi 在 200 以上、色彩空间是 DeviceRGB,那基本可以确定这是图像型PDF,走降采样路线;如果列表几乎是空的,字体列表却排了十几行而且 subset 列全是 no,那就走字体子集化和对象流优化路线。这一步花两分钟,能省掉后面半小时的无效尝试。
注意:体检前先复制一份原件。后面所有操作都在副本上做,原文件永远不动,这是处理别人交付文件的基本习惯。
1.2 有损压缩和无损压缩,到底该牺牲什么
压缩手段分两派。无损派动的是结构和冗余:对象流合并、字体子集化、删除重复图像、清理元数据、重新线性化。它不改变任何一个像素和字形,压缩率通常在5%到30%,个别臃肿文件能到50%。有损派动的是图像采样:降DPI、转JPEG、降质量、灰度化、二值化。它能把几百兆压到几兆,代价是清晰度。
选择逻辑不是"哪个压得多选哪个",而是看这份文件后面要干什么。要打印归档、要作为凭证留存、要提交给审核方核对细节的,优先无损,不够再轻度有损,把DPI守在200以上、JPEG质量守在75以上。只是自己看、只是传阅、只是在手机屏幕上翻的,可以放开手压到150dpi甚至120dpi。有一条底线值得记住:正文文字如果是矢量的,降图像DPI完全不影响文字清晰度,只有图片会变糊;而如果整页是扫描图,降DPI就是在降文字清晰度,这两种情况的容忍度完全不一样。
另一个容易被忽略的点是颜色。很多扫描件是彩色的,但内容其实是黑白文档,只是纸有底色、扫描时有色偏。把这类页面转成灰度,体积直接掉到三分之一,视觉上几乎没损失。真正需要保留彩色的,是带彩色图表、印章、照片的页面。混合型文档可以分页处理:彩色页单独保留,纯文字页转灰度,最后合并。
1.3 压缩前必做的三件事
第一件,确认文件没有加密和权限限制。带打开密码的文件任何工具都读不了,带权限密码(禁止编辑、禁止打印)的文件在部分工具里也会被拒绝处理。这类文件得先拿到授权再用对应密码解除,没有捷径。
第二件,确认内容有没有需要保留的交互元素。表单域、可填写字段、书签目录、内部超链接、注释批注,这四样在"打印到PDF"和部分转换流程里会丢失。如果是给别人填的表单,压完发现填不了,那就白干了。这类文件建议只做图像降采样,不做整体重排。
第三件,想清楚目标体积。这一步最容易被跳过,但它决定了参数。上传系统写10MB,那你的目标应该是9MB左右留余量,而不是压到3MB然后画质白白牺牲。反过来,如果压完是10.4MB,系统照样拒,等于没做。算一下:目标体积除以页数,得到每页可用预算,再对照后面的参数表选档位,比盲目试参数高效得多。
2. 按场景选工具:五条压缩路线怎么挑
2.1 零门槛路线:系统打印另存
所有主流操作系统都内置了"打印到PDF"的能力。打开文件,选打印,打印机选"另存为PDF"或"打印到文件",输出一份新的PDF。这条路线的原理是把原文件重新"渲染一遍再写出来",所以它能顺手干掉大量历史残留对象,对那种编辑过几十次的臃肿文件效果意外地好。
它的优点是零安装、零学习成本、不会上传到任何地方,隐私上最安全。缺点是损失控制差:不同系统的打印驱动对图像重采样的策略不一样,有的会把300dpi的图降到150dpi,有的干脆不降,你没法指定;书签、链接、表单域、图层基本都会丢;页面尺寸可能被强行套上纸张大小,原本的非标准尺寸页面会被缩放或加白边。我实测过一份40页的产品手册,打印另存后从28MB降到11MB,文字依然锐利,但目录书签全没了。
适合谁:手头没有工具、文件不含交互元素、只是要发出去看的场景。不适合:表单、合同、需要保留目录的技术文档。
2.2 批量路线:虚拟打印机加批处理
如果手上有几十份文件要一起处理,一份份打印太慢。可以装一个虚拟打印机驱动,配合系统的批处理或脚本能力,把整个文件夹拖进去批量输出。思路是:虚拟打印机负责渲染输出,批处理负责循环。
这条路线比单份打印多了一个好处——可以在打印机属性里固定一套输出配置,比如统一150dpi、统一灰度、统一A4,输出结果一致性很好,适合做资料归档。坑在于虚拟打印机驱动的质量参差不齐,有的对中文嵌入字体处理有问题,输出后个别生僻字变方框。所以批量跑完必须抽检,尤其是包含公式、特殊符号、古籍字形的文档,至少翻三页看看。
适合谁:需要归档大量同类文件、追求输出规格统一的场景。不适合:单份精细处理的场景,配置成本划不来。
2.3 精准路线:办公套件与商业编辑器的"减小文件大小"
主流办公套件和商业PDF编辑器都提供"压缩""减小文件大小""优化PDF"这类功能,通常会给一个画质档位滑块或者几个预设。它的价值在于可视化——你能一边调一边看预览,不用记参数。对不熟悉DPI概念的人,这是最友好的入口。
这类功能内部做的事其实也是那几样:降采样、转JPEG、子集化字体、清理对象。不同的是它做了封装,并且通常能保留书签和链接。实测下来,中档预设一般能把彩扫文档压到原来的15%到25%,画质在屏幕上看着没什么问题,打印出来字边缘会有点软。
使用要点有三个。一是别一次拉到最低档,先选中档看结果,不满意再往下走一档,拿到"刚好够用"的那个点。二是有"保留书签""保留表单""保留注释"这类选项的,按需勾上,不然压完发现目录没了。三是注意版本兼容选项,有些工具默认输出较新的PDF版本,老旧的阅读器或上传系统可能不认,选1.4或1.5兼容性更稳。
适合谁:不想碰命令行、文件里有需要保留的目录和链接、对画质有一定要求的场景。不适合:需要极限压缩、或者要批量脚本化的场景。
2.4 极客路线:命令行工具参数化压缩
这条路线的核心是一个开源命令行工具(社区里最常用的是 Ghostscript),它的强项是每一个参数你都能控制。降采样算法、目标DPI、JPEG质量、字体处理、图像编码方式、兼容级别,全部可调。批量处理、CI 集成、参数固化,都靠它。
它的学习曲线不陡但也不平,难点不在命令本身,而在"选哪组参数"。好在常用组合就那么几套,记住四档预设就够了:
| 预设 | 图像DPI | 适用场景 | 典型压缩率 |
|---|---|---|---|
| /screen | 72 | 只在屏幕上看、预览 | 原体积 5%~10% |
| /ebook | 150 | 传阅、手机阅读、备考资料 | 原体积 10%~20% |
| /printer | 300 | 需要打印、细节要看清 | 原体积 30%~50% |
| /prepress | 300 且保留色彩细节 | 印刷、存档 | 原体积 50%~70% |
命令行路线的最大优势是可以精准"打补丁":预设不合适,就拿自定义参数覆盖其中某几项,比如预设用 /ebook,但把黑白页的分辨率单独提到300,只压彩色页。这种颗粒度是图形界面给不了的。
适合谁:要批量、要固化流程、要精细控制、愿意花二十分钟学一次的人。不适合:只想点一下就完事的人。
2.5 在线路线:上传即压缩的取舍
在线压缩站点的体验确实好,拖进去、等几秒、下载。但用它之前得想清楚一件事:文件会离开你的设备。成绩单、身份证复印件、合同、体检报告、内部资料,这些东西上传到一个不知道归属的服务器上,风险不是"可能泄露"这么轻,而是你根本无法追溯。我一般只在两种情况下用:内容完全公开无敏感信息,或者文件太大本地工具跑不动(很少见)。
真要用,挑有明确"文件定时删除"说明的、挑不需要注册的、挑能选画质档位的。压完下载后顺手把本地浏览器缓存里的上传记录清一下。另外注意,部分站点会在输出文件里加页脚水印或者元数据标记,压完打开看一眼首页和末页。
适合谁:临时应急、内容公开、设备上没有可用工具。不适合:任何含个人信息、商业信息、证件信息的文件。
3. 核心实操:手把手做一次可控的压缩
3.1 参数计算:先把预算算清楚再动手
动手之前先算账,这一步能让后面少走一半弯路。算法是:目标体积 ÷ 页数 = 每页平均预算。
举个真实场景:一份240页的彩色扫描讲义,原文件186MB,上传系统限制20MB。预算就是 20MB ÷ 240页 ≈ 85KB/页。85KB一页能装什么?对照经验值:彩色150dpi JPEG(质量75)单页约150~250KB,超了;彩色120dpi约90~140KB,还是紧;灰度150dpi约60~100KB,勉强;黑白二值300dpi约25~50KB,富余。结论很明确:这份文件要么降成灰度,要么分成两个文件交。如果讲义里有彩色图表必须保留,那就得接受"分成两册"或者"再压到100dpi"的取舍。
再给一组可复用的估算依据。A4纸是 210×297mm,换算成英寸约 8.27×11.69。像素数 = 边长英寸 × DPI:
| DPI | A4 像素尺寸 | 约合百万像素 | 彩色JPEG(q75)单页估计 | 灰度JPEG(q75)单页估计 |
|---|---|---|---|---|
| 100 | 827×1169 | 0.97 | 70~110KB | 40~60KB |
| 150 | 1240×1753 | 2.17 | 150~250KB | 80~130KB |
| 200 | 1654×2339 | 3.87 | 280~450KB | 150~240KB |
| 300 | 2480×3508 | 8.70 | 600~1000KB | 320~520KB |
黑白二值(只有纯黑纯白两种像素)走的是传真类编码,压缩率比JPEG高一个数量级,300dpi单页通常只有25~50KB,这是压扫描文档性价比最高的方案,前提是内容确实是纯文字、没有灰阶图。
按这个表倒推:目标85KB/页,彩色路线要降到100dpi以下,字会糊;灰度150dpi刚好卡在线上;黑白300dpi非常轻松。所以最优解往往是"纯文字页转黑白、图页保留灰度",而不是整份文件一刀切。
3.2 一条完整的命令行流程
下面这套流程我用了很久,从体检到输出,四步。
第一步,体检并确认没有加密:
pdfinfo in.pdf | grep -E "Pages|Page size|Encrypted" pdfimages -list in.pdf | head -20第二步,跑一次标准压缩,先看效果再调参:
gs -sDEVICE=pdfwrite \ -dCompatibilityLevel=1.5 \ -dPDFSETTINGS=/ebook \ -dNOPAUSE -dBATCH -dQUIET \ -dDetectDuplicateImages=true \ -dCompressFonts=true \ -dSubsetFonts=true \ -sOutputFile=out_ebook.pdf in.pdf几个参数的作用值得说清楚。-dDetectDuplicateImages=true会检测并在文件里只存一份重复图像,对那些每页都贴同一个页眉logo、同一个印章的文档,收益非常明显,我见过一份120页文件靠这一项从48MB掉到31MB。-dSubsetFonts=true保证字体只嵌入用到的字,这是解决"页数少体积大"的关键。-dCompatibilityLevel=1.5是兼容性和压缩率的平衡点,1.4 更保守,1.7 支持对象流但老阅读器可能不认。
第三步,预设不够用时,用自定义参数覆盖。比如想让彩色图走150dpi、灰度图走150dpi、黑白图保持300dpi不降,同时JPEG质量压到70:
gs -sDEVICE=pdfwrite \ -dCompatibilityLevel=1.5 \ -dNOPAUSE -dBATCH -dQUIET \ -dDownsampleColorImages=true \ -dColorImageResolution=150 \ -dColorImageDownsampleType=/Bicubic \ -dDownsampleGrayImages=true \ -dGrayImageResolution=150 \ -dGrayImageDownsampleType=/Bicubic \ -dDownsampleMonoImages=true \ -dMonoImageResolution=300 \ -dAutoFilterColorImages=false \ -dColorImageFilter=/DCTEncode \ -dJPEGQ=70 \ -dDetectDuplicateImages=true \ -dSubsetFonts=true -dCompressFonts=true \ -sOutputFile=out_custom.pdf in.pdf-dColorImageDownsampleType=/Bicubic用的是三次卷积插值,降采样后比默认的均值采样更锐,代价是慢一点。-dAutoFilterColorImages=false配合-dColorImageFilter=/DCTEncode强制走JPEG编码,否则工具可能自动选无损编码,体积下不来。-dJPEGQ=70是质量,低于60会出现明显块状伪影,文档类不建议低于65。
第四步,结构层优化。压缩完再跑一次对象流合并,能再挤掉5%到20%,尤其是对象数量很多的文档:
qpdf --object-streams=generate --compress-streams=y \ --recompress-flate --compression-level=9 \ out_custom.pdf out_final.pdf我实测过一份68页的混合文档:原始52.4MB,/ebook预设后 14.8MB,自定义参数后 9.6MB,再跑对象流优化后 8.2MB。整体压到原来的15.6%,文字仍然锐利(因为是矢量),只有内嵌的彩色照片变软了。这个结果拿去上传10MB限制的系统刚好够用。
3.3 扫描件和纯图片PDF的专项处理
扫描件是另一个物种,得单独对待。这类文件里没有矢量文字,每一页都是一张位图,压缩就是纯粹的图像处理。
第一步判断是彩扫还是黑白扫。pdfimages -list看色彩空间,DeviceRGB 是彩色,DeviceGray 是灰度,DeviceCMYK 是印刷四色(这种最占体积,建议先转RGB)。第二步判断内容本身是不是黑白文档。如果是一份打印在纸上的文字合同,扫描时因为纸张偏黄、灯光偏暖被扫成了彩色,那直接转灰度几乎没有视觉损失。
灰度化之后,如果确认内容只有文字和线条、没有照片和灰阶图,可以进一步二值化。二值化会让纸张底色变成纯白、字变成纯黑,看起来反而更干净,体积掉到原来的十分之一甚至更低。但要注意,二值化会吃掉浅色水印、底纹、印章的渐变层次,带公章的扫描件别二值化,印章会变成一个黑块。
对于彩扫文档里"彩色页少、黑白页多"的情况,我的做法是先拆分再合并:
# 按页拆分成单页文件 qpdf --split-pages in.pdf page.pdf # 对纯文字页批量走黑白高压缩 for f in page-*.pdf; do gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook \ -dDownsampleMonoImages=true -dMonoImageResolution=300 \ -sOutputFile="opt-$f" "$f" done # 合并回来 qpdf --empty --pages opt-page-*.pdf -- merged.pdf这套流程麻烦,但对几百页的混合扫描件是值得的,压出来的体积比一刀切能再省一半。
注意:很多扫描软件会顺手做一层文字识别,把识别结果作为不可见的文字层压在图片下面。这个层几乎不占体积,但一旦你把PDF重新栅格化(比如截图再生成PDF、或者用打印另存并勾了"作为图像打印"),文字层就没了,文件就变成不可搜索、不可复制的死图。压扫描件前,先用阅读器试试能不能选中文字,能选中的就别走会丢文字层的路线。
3.4 矢量、字体、表单这些"小体积大麻烦"
纯文字排版的PDF往往只有几百KB,压不动也不需要压。真遇到"几页纸却有二十兆"的,基本都是字体没子集化。解决办法就是用命令行带上-dSubsetFonts=true -dCompressFonts=true重写一遍,通常能从二十兆掉到一兆以内。
矢量图形多的文件(工程图、流程图、地图、图表手册)要小心。这类文件的体积大头是矢量路径数据,降图像DPI对它毫无作用,反而可能在重写过程中把复杂路径简化掉,导致线条变形。这类文件压缩前必须对比原图和压缩后的同一页局部。真正能减体积的手段是对象流合并和清理无用对象,别指望有损压缩。
表单文件(PDF Form)和有数字签名的文件,处理原则是"能不重写就不重写"。任何整体重写都可能让表单域失效、让数字签名校验失败。签名失效是不可逆的,原签名文件压完就废了。这类文件如果非要减体积,只能清理附带的图片资源,或者用编辑器提供的"优化但不重排"选项,并且压完立刻验证:表单能不能填、签名状态是不是仍然有效。
还有一类是嵌入附件和多媒体。有些PDF里藏着一整个Excel附件、一段视频、一堆高分辨率缩略图。这些东西用常规压缩动不了,得用能编辑对象树的工具把它们显式删掉。删之前确认对方确实不需要这些附件——有些人发过来的PDF里附件才是正文。
4. 备考与办公两类高频场景的落地方案
4.1 备考资料:几百页讲义怎么压到能发
备考资料的典型特征是:页数多、来源杂(有电子版教材、有拍的照片、有扫描的真题)、彩印的少黑白的多、需要在手机和平板上翻、经常要在群里传。这类文件的最优解几乎永远是"灰度加150dpi",偶尔对纯文字页上黑白300dpi。
我处理过一套320页的复习资料合集,原始是三个来源拼起来的,合计412MB。处理流程是这样:先统一页面尺寸到A4(有些拍照页尺寸乱七八糟,不统一的话阅读器翻页会跳),再逐页判断类型,纯文字页走黑白300dpi,有图的页走灰度150dpi,最后合并。结果67MB,还是超了群文件限制。第二轮把有图页从150降到120,黑白页保持300,结果48MB。这个体积在手机上看完全够用,文字边缘锐利,只有图表里的细线略软。
这里有个反直觉的经验:文字页降DPI的损失,远大于黑白页保持不变。因为人眼对文字边缘的锯齿极其敏感,对照片的柔和反而不敏感。所以正确策略是黑白文字页守住300dpi(反正二值编码后体积本来就小),彩色图片页大胆降到120到150。很多人反过来做,把整份文件统一降到100dpi,结果文字糊成一片,图片还是不清楚。
还有一个实用技巧:如果只是自己看,把大文件按章节拆成几个小的。移动端打开一个80MB的PDF和解开三个25MB的PDF,体验差别很大,而且不用每次从头加载。拆分用qpdf --pages按页码范围切就行,几十秒的事。
4.2 办公提交:卡着体积上限怎么过
办公场景的难点不在压缩本身,而在"卡线"。系统限制10MB,你压到9.8MB能过,压到10.2MB就白干,而且很多系统不告诉你超了多少,只说"上传失败"。
我的做法是留出10%到15%的余量,并且压完立刻用ls -lh或者文件属性确认实际大小(注意有些系统按1000进制算,有些按1024进制算,10MB可能指10×10⁶字节也可能指10×2²⁰字节,差了近5%)。卡在边界的时候,直接多压一档更省事。
另一个坑是提交系统的兼容性。有些老系统对PDF版本敏感,1.7及以上可能解析失败;有些系统会拒绝带表单或带注释的文件;有些系统内部还会再压一遍,压完清晰度二次损失。所以提交前最好用系统自带的预览功能看一眼,或者干脆按"最保守配置"输出:PDF 1.4、不含表单、不含注释、图像150dpi、灰度优先。
含公章的正式文件要特殊照顾。公章是红色实心图形,压缩过度会边缘发虚、颜色偏移,审核方可能因此质疑。这类文件建议把彩色图像DPI守在200以上、JPEG质量守在80以上,如果因此超体积,那就拆分成"正文"和"附件"两个文件分别上传,或者在正文里删掉不必要的插图。宁可多传一个文件,也别把公章压花。
4.3 手机端和跨设备的应急处理
人在外面,手上只有手机,这种情况很常见。手机上的可行路线有两条:一是用办公类App打开文件,找"另存""导出""压缩"选项,本质是调用了App内置的处理引擎;二是用系统文件管理器自带的"压缩"能力,但它通常只做打包不做PDF重写,对PDF无效,别在这上面浪费时间。
手机端的现实是精细控制能力弱,只能选档位。所以策略要调整:在手机上只做"应急降体积",把文件压到能发出去就行,等回到电脑上再按前面的流程做一次正式处理。另外手机处理大文件容易因为内存不足闪退,文件超过80MB建议别在手机上折腾,或者先按页码范围拆一半再处理。
跨设备还有个小细节:不同系统对文件大小的显示口径不一致,手机上显示"9.8 MB"传到电脑上可能是"10.03 MB",上传就失败了。所以留余量这件事在跨设备场景下要留得更多,建议留20%。
5. 常见问题与排查技巧实录
5.1 压完变小了,但糊了、花了、字断笔了
这是最高频的抱怨。原因基本是两个:DPI降过头,或者JPEG质量压太低。
判断方法很简单,把压缩后的页面放大到200%看两处:文字边缘有没有出现一圈灰色的"毛边",笔画转折处有没有断开;图片里的大面积纯色区域(比如表格底色)有没有出现方块状的斑块。毛边说明降采样太狠或者用了双线性插值,斑块说明JPEG质量低于60。
解决方式是分层处理:图像DPI不低于150(需要打印的按200),JPEG质量不低于70,降采样算法指定为三次卷积。如果体积还是超,优先降彩色页而不要降黑白文字页,原因在上一节说过。极端情况下,把文档里那些可有可无的装饰性大图直接删掉,比压糊整份文件划算得多。
还有一种"花了"是颜色偏移。CMYK色彩空间的文件经过某些转换会整体发暗发绿,尤其是带红色公章的文件。处理时先把CMYK转成RGB再加压,或者干脆用保留色彩的预设。
5.2 压完体积没变,甚至变大了
这情况不罕见,原因有四个。
一是文件本来就是矢量文字,没有可压的图像,重写一遍只是重新打包,体积几乎不变。这种情况不必纠结,它本来就不该被压。
二是压缩工具把低分辨率图"上采样"了。有些预设会强制把图片统一到某个DPI,原本72dpi的图被拉到150dpi,体积反而涨。解决办法是关掉上采样,只允许向下采样。
三是输出时用了无损图像编码。工具判断图片有很多纯色,自动选了无损压缩,结果比原来的JPEG还大。强制指定编码方式就能解决。
四是文件本身已经压过了,再压是把有损结果再损一次,体积降不了多少但画质在掉。压过的文件看元数据里的生成工具名,如果已经是压缩工具产出的,基本没有二次压缩空间。
5.3 打不开、乱码、页面错乱、表单失效
打不开通常是PDF版本问题。压完把兼容级别降到1.4重试,或者换一个阅读器验证——有些文件在A阅读器打不开,B能打开,说明是阅读器对新特性支持不全,不是文件坏了。
乱码集中在中文和特殊符号上,根因是字体子集化时把某些字形丢了,或者字体没嵌入只做了引用。处理时关掉字体子集化试一次,如果乱码消失,说明是子集化工具的兼容问题,那就换工具或者保留完整字体后再压(体积会大一些,但字不能丢)。
页面错乱多发生在非标准尺寸的文档上。有些工具会强行把页面套进A4,导致内容被缩放或者被裁掉一部分。处理时明确关掉"缩放以适应页面"选项。带横竖混排的文档尤其容易出问题,压完必须逐页翻一遍,或者至少检查横向页的那几页。
表单失效的排查顺序是:先用阅读器点一下字段能不能编辑,不能编辑说明字段被扁平化成了图形;能编辑但内容显示异常,说明字体资源丢了。这两种都没法事后修复,只能回退到原文件,改用不重写结构的压缩方式。
5.4 一张速查表,遇到问题照着对
| 现象 | 最可能原因 | 优先动作 |
|---|---|---|
| 体积没降 | 矢量文档或已压过 | 看pdfimages -list是否有大图 |
| 体积反而涨 | 上采样或无损编码 | 关掉上采样,强制JPEG编码 |
| 文字糊、毛边 | DPI过低或插值算法差 | 提到150以上,改三次卷积 |
| 色块斑驳 | JPEG质量低于60 | 提到70以上 |
| 中文变方框 | 字体子集化丢字 | 关闭子集化重压 |
| 红色公章发黑 | 二值化或灰度化 | 该页保留彩色,单独处理 |
| 书签目录消失 | 打印另存或重排 | 换保留结构的工具,或用编辑器优化 |
| 表单填不了 | 字段被扁平化 | 回退原件,只做资源压缩 |
| 部分页面空白 | 版本兼容或字体缺失 | 降到PDF 1.4重试 |
| 上传仍失败 | 体积口径差异 | 多留20%余量,按字节数确认 |
5.5 几个只有踩过才知道的细节
第一,先备份,再做任何事。压缩是不可逆的,尤其是批量脚本跑错参数的时候,一条命令能覆盖整个文件夹。我第一次批量处理时把输出文件名写成了输入名,三百多份原件直接没了,只能从备份盘里捞。
第二,压完一定要抽检三处:第一页、中间随机一页、最后一页。首末页最容易出问题(封面常是大图,末页常有落款和印章),中间页用来验证整体一致性。
第三,处理别人发来的文件时,别改原文件名。用原名_compressed.pdf这种命名,对方一眼知道哪个是压过的,也方便出问题时回退。
第四,体积卡在临界值时优先删内容而不是降画质。去掉重复的空白页、去掉广告页、把附录里的高清插图换成低清版,这些操作对阅读体验的伤害远小于把整份文件压到100dpi。
第五,给固定流程做一份参数备忘录。哪个系统限制多少MB、对应的目标DPI是多少、用哪条命令,写下来贴在便签上。下次遇到同类文件,一分钟出结果,不用重新试参数。我个人在实际操作中的体会是,压缩这件事的效率提升,九成来自"把判断前置",而不是"把参数调优"。先花两分钟看清文件是由什么构成的,后面所有动作都是顺理成章的;跳过判断直接压,十次里有六次要返工。