壓縮 PDF 時,實際上發生了什麼事
PDF123 壓縮以 qpdf 進行串流重壓縮與物件串流打包,不對影像降取樣,也不做有損 JPEG 重新編碼或字型子集化。線性化幾乎不改變檔案大小。

兩份 PDF 在螢幕上看起來一模一樣,體積卻可能差上三個數量級:50 KB 對 50 MB。差距幾乎從不出在文字運算子。一份二十頁的合約,文字運算子通常只有幾十 KB,其餘全是影像取樣資料、整份嵌入的字型程式,以及串流與物件打包得有多鬆。
這帶出一個值得先講清楚的結果:「壓縮 PDF」不是一個動作,而是四個。它們縮小的對象不同、代價也不同;把它們當成同一件事,經驗就會自相矛盾:壓過了卻沒變小,或者變小了但畫面變糊。
檔案大小是從哪裡來的
多數「這份 PDF 為什麼這麼大」的案例,起點都是仍以拍攝尺寸嵌入的高解析度掃描件或照片。這個算術值得算一次:一頁 letter 尺寸、8.5 × 11 英吋、300 DPI 的彩色頁面約是 2550 × 3300 像素,每像素三個位元組的話,未壓縮大約就是 25 MB。二十頁這樣的內容,往往在任何人碰壓縮之前就已經來到 60 到 80 MB。
第二個來源是字型。PDF 可以把整套字型程式嵌進檔案,讓任何機器都描繪出一樣的文字;這筆成本是按字形表的大小計價,而不是按實際被讀到的文字量。這就是為什麼字型子集化是另一個獨立的體積槓桿。
第三個來源是打包本身。同樣的內容,可以用浪費的壓縮設定儲存,物件也可以散落在檔案各處、各自帶著一份管理開銷。這些都不改變任何一個像素或字形,而這正是串流重壓縮能著力的部分。
「壓縮」其實是四件不同的事
能動的體積槓桿有四個,作用在不同層次,代價幾乎不重疊。選錯槓桿,正是壓縮跑完卻像什麼都沒做的最常見原因。
| 槓桿 | 動到什麼 | 體積收益 | 代價 |
|---|---|---|---|
| 串流重壓縮與物件串流 | 內容串流的壓縮方式、物件的存放與打包 | 取決於原始檔有多鬆 | 頁面外觀不變 |
| 影像降取樣 | 像素數量,也就是解析度 | 大 | 解析度永久降低 |
| 有損影像重新編碼 | 點陣圖的位元組表示 | 大 | 畫質降低 |
| 字型子集化 | 嵌入的字形表 | 中 | 未使用的字形不再可編輯 |
| 線性化 | 物件的排列順序 | 幾乎為零 | 換來的是首頁載入時間 |
前四列常被籠統地叫成「壓縮」,但只有第一列不碰內容。它也是最容易被誤判收益的一列:一份體積主要來自原始影像取樣的掃描件,沒有多少冗餘可以移除;真要大砍,靠的是降取樣與有損重新編碼,代價是永久失去那份解析度與畫質。
PDF123 壓縮只做了四者之一
壓縮 PDF(POST /api/v1/misc/compress-pdf)只做第一列。它讓 qpdf 壓縮未壓縮的串流(--compress-streams=y)、對已用 Flate 壓縮過的串流再跑一遍(--recompress-flate),並把物件收進物件串流(--object-streams=generate)。
它不對影像降取樣、不把點陣圖重新編碼成更低的 JPEG 品質,也不子集化字型。頁面外觀應該維持一致,省下來的空間來自 Flate 重壓縮與物件串流打包。
失效條件也該講得一樣清楚。當檔案體積主要來自已經以 JPEG 壓縮過的影像資料時,Flate 沒有什麼可以再擠,因為那些影像位元組落在上述三個開關的作用範圍之外。這就是為什麼一包掃描件可能只小幾個百分點,而體積相近、以文字為主的 PDF 卻明顯縮得更多。
反方向的路徑是解壓縮 PDF,它把串流展開以供檢查(--qdf,物件串流停用),同樣不改變頁面外觀。
什麼時候該走別條路
| 你的需求 | 該走的路徑 |
|---|---|
| 外觀完全相同,只想移除打包開銷 | 壓縮 |
| 掃描件確實太大,且可接受畫質損失 | 降取樣或有損重新編碼,不是這裡的壓縮 |
| 還要能編輯,但下一個字打不出來 | 換匯出設定或來源檔,見字型子集化 |
| 想讓瀏覽器早一點看到第一頁 | 線性化處理的是首次繪製,不是體積 |
| 檔案根本打不開 | 修復,那是結構問題,不是體積問題 |
最後一列藏著一個陷阱:本站的線性化 PDF不是獨立實作,而是壓縮的別名。兩者指向同一個操作,正規 id 是 misc/compress-pdf,linearize-pdf 只是別名;入口網站對這個工具一律送出 linearize=true 與 optimizeLevel=1,伺服器兩個欄位都不讀,qpdf 也從不被傳入 --linearize。真正會讓檔案線性化的操作是保護,在它加密的時候。
所以,如果你要的是外觀不變、檔案更小,壓縮就是完整答案。如果你要的是有損影像縮小或字型子集化,這條路徑就是錯的槓桿。檔案會直接回傳,不需要帳號。想看清楚物件、串流與交叉參照表實際落在檔案哪裡,請接著讀PDF 裡面有什麼。