怎麼把 PDF 壓到規定大小以內(2 MB、5 MB、10 MB)而不把它壓壞

PDF 的體積到底在哪、壓縮能去掉什麼不能去掉什麼、為什麼掃描檔比打字稿重四十倍,以及該按什麼順序試。

一句話

一個很重的 PDF,幾乎全部體積都在圖片裡。一頁打字的文字是 20–50 KB;一頁 300 dpi 彩色掃描是 1–3 MB。壓縮 PDF 的意思就是把這些圖片按更低的解析度或品質重新編碼——檔案裡其它東西都不值得去縮。如果檔案主要是文字卻仍然太大,那是它的生成方式出了問題,解決辦法是另一回事。

位元組在哪

開啟一個 PDF 的結構,裡面是三類內容:

  • 文字和向量圖形:以緊湊的指令存放(“在這裡畫這個字形”),已經用和 ZIP 一樣的演演算法壓過。一本 100 頁的小說不到 1 MB。這裡沒什麼可省。
  • 字型:嵌進去,檔案到哪都長一樣。一套完整的中日韓字型 5–15 MB,但 PDF 生成器通常只嵌用到的字形(“子集化”),壓到幾十 KB。一個因為字型而重的 PDF,是匯出時關掉了子集化——重新匯出,不是壓縮。
  • 圖片:照片、掃描檔、logo,以及最常見的罪魁——掃描的一頁,不管頁上有什麼,都是一整張圖。

一份用手機掃的 12 頁租房合同,就是 12 張 300–400 萬畫素的 JPEG。25 MB 就是這麼來的,上傳表單卡住的也是它。

“壓縮 PDF”做的是什麼

PDF 壓縮器做一件有用的事:找到每張圖片,解碼,再以更小的方式編碼——更低的 JPEG 品質、更低的解析度,或兩者都要。文字層、連結、書籤原樣不動。三個設定要緊:

  1. 解析度。 300 dpi 的掃描是 OCR 和列印需要的。在螢幕上看,150 dpi 看起來一模一樣,畫素只有四分之一。一份只會在螢幕上看的表單可以到 100–120 dpi。解析度減半,圖片體積變四分之一;這是最大的槓桿,沒有之一。
  2. JPEG 品質。 從 95 到 75 大約省 60%,檔案上幾乎看不出變化。低於 60,文字邊緣開始糊。
  3. 顏色。 一份黑白表單的掃描檔存成 RGB,是用三個通道裝一個通道的內容。轉灰度省三分之一;乾淨的文字頁轉成真正的黑白(1 位,CCITT 或 JBIG2 編碼)能省 90%。

PDF 壓縮在瀏覽器裡做這件事——檔案在你的機器上用 PDF.js 解碼,每張圖重新編碼,再用 pdf-lib 重建檔案——下載之前就顯示結果大小。如果結果反而比原件大,它保留原件:這說明圖片本來就小,壓縮不是這份檔案的答案。

壓縮到不了的時候

  • 限制很小而檔案很長。 40 頁掃描檔不可能以可讀的品質塞進 2 MB。把它拆分成表單真正要的那幾頁;多數“上傳合同”的欄位要的是簽字頁,不是附件。
  • 已經壓過了。 壓縮器跑兩遍除了讓圖片再糊一點什麼都不會發生。工具報告只省了幾個百分點,就停。
  • 重在字型或內嵌檔案。 有些 PDF 帶附件、3D 模型或完整字型。從源檔案(Word、Google 檔案、設計軟體)用“標準”或“最小體積”設定重新匯出。
  • 本該是文字的掃描檔。 一封打字的信列印出來再掃描,比原信重一百倍。有原件就重新匯出;只有掃描檔的話,OCR 不會減小體積——圖片留著,文字加在上面。

按這個順序試

  1. 先看裡面是什麼:掃描檔,就準備壓縮;打字稿,就準備重新匯出。
  2. 150 dpi、品質 75 壓一次。光這一步就解決多數“25 MB → 5 MB 以內”的情況。
  3. 還大:轉灰度,再到 120 dpi。
  4. 還大:拆分——只發要求的那幾頁。
  5. 最後手段:PDF 轉圖片用適中的解析度匯出,再圖片轉 PDF。這把一切壓平成每頁一張 JPEG,畫素數完全由你控制;文字層沒了,所以只對沒人需要搜尋或複製的檔案這麼做。

之後檢查兩樣東西

開啟結果,放大最小的文字——簽名、腳註、印章上的字。過度壓縮最先在那裡露餡。另外,如果這個 PDF 帶憑證數位簽章,任何重編碼都會讓簽名失效,收件人會看到“簽名後被修改”。這類檔案,拆分是唯一安全的減重方式,而且連拆分也會破壞簽名——發原件,去談那個限制。

本文用到的工具