這份指南將詳細介紹如何結合 Python 和 Ghostscript 來實現目前公認效果最強大的 PDF 壓縮。此方法特別適用於包含大量高解析度圖片或掃描件的 PDF 文件。
方法概述
我們將使用 Python 的 subprocess
模組來呼叫 Ghostscript 的命令列工具。Ghostscript 是一個開源的 PostScript 和 PDF 解譯器,它能夠重新處理 PDF,並根據指定的設定(如降低圖片解析度、移除冗餘物件等)來大幅縮小檔案大小。
優點與缺點
優點 ✅ | 缺點 ❌ |
---|---|
壓縮率極高,尤其擅長處理圖片。 | 必須額外安裝 Ghostscript 軟體,步驟較多。 |
提供多種預設壓縮等級,方便調整。 | 處理速度可能比純 Python 函式庫稍慢。 |
技術成熟,被廣泛認為是 PDF 處理的黃金標準。 | 需要確保 Ghostscript 的路徑在系統環境變數中。 |
第一步:安裝 Ghostscript
這是使用此方法最關鍵的前提步驟。
1. 下載與安裝
請根據您的作業系統選擇對應的安裝方式:
- Windows:
- 前往 Ghostscript 官網下載頁面。
- 下載最新的 64-bit (x64) 版本並執行安裝程式。
- 重要:安裝完成後,需要將 Ghostscript 的執行檔路徑加入到系統的
PATH
環境變數中。通常路徑類似於C:\Program Files\gs\gs10.03.1\bin
。這樣,您才能在任何地方的命令列中執行gswin64c
指令。
- macOS:
如果您已安裝 Homebrew,這將是最簡單的方式。打開終端機並執行:brew install ghostscript
- Linux (Debian/Ubuntu):
打開終端機並執行:bash sudo apt-get update sudo apt-get install ghostscript
2. 驗證安裝
安裝完成後,打開您的終端機 (或 Windows 的命令提示字元/PowerShell),輸入以下指令並按 Enter:
# 在 macOS 或 Linux 上
gs --version
# 在 Windows 上,通常是 gswin64c
gswin64c --version
如果您看到 Ghostscript 的版本號(例如 10.03.1
),表示安裝成功且環境變數設定正確。如果提示找不到指令,請回頭檢查您的 PATH
環境變數設定。
第二步:編寫 Python 程式碼
建立一個名為 compress_with_gs.py
的 Python 檔案,並將以下程式碼完整複製進去。
import subprocess
import os
import sys
import shutil
def compress_with_ghostscript(input_file: str, output_file: str, quality: str = 'ebook'):
"""
使用 Ghostscript 命令行工具壓縮 PDF。
:param input_file: 輸入的 PDF 文件路徑。
:param output_file: 輸出的 PDF 文件路徑。
:param quality: 壓縮品質。可選值:'screen', 'ebook', 'printer', 'prepress'。
"""
if not os.path.exists(input_file):
print(f"❌ 錯誤:找不到輸入檔案 {input_file}")
return
# 根據作業系統決定 Ghostscript 的執行指令名稱
gs_command = 'gswin64c' if sys.platform == 'win32' else 'gs'
# 檢查 Ghostscript 是否已安裝並在 PATH 中
if not shutil.which(gs_command):
print(f"❌ 錯誤:找不到 Ghostscript 指令 '{gs_command}'。")
print("請確認您已正確安裝 Ghostscript,並將其執行檔路徑加入到系統環境變數 PATH 中。")
return
# Ghostscript 的壓縮品質設定
# 更多資訊: https://www.ghostscript.com/doc/current/VectorDevices.htm#PDFSETTINGS
quality_settings = {
'screen': '-dPDFSETTINGS=/screen', # 最低品質,最小檔案 (72 dpi images)
'ebook': '-dPDFSETTINGS=/ebook', # 中等品質,較小檔案 (150 dpi images)
'printer': '-dPDFSETTINGS=/printer', # 高品質,用於列印 (300 dpi images)
'prepress': '-dPDFSETTINGS=/prepress' # 最高品質,用於專業印刷 (300 dpi, 保留顏色資訊)
}
if quality not in quality_settings:
print(f"❌ 錯誤:無效的品質選項 '{quality}'。")
print("請從 'screen', 'ebook', 'printer', 'prepress' 中選擇。")
return
print(f"🚀 開始使用 Ghostscript 進行壓縮...")
print(f" - 品質等級: {quality}")
try:
# 組建 Ghostscript 指令
command = [
gs_command,
'-sDEVICE=pdfwrite', # 指定輸出設備為 PDF 寫入器
'-dCompatibilityLevel=1.4', # 設定 PDF 相容性等級
quality_settings[quality], # 應用選擇的品質設定
'-dNOPAUSE', # 處理完畢後不暫停
'-dBATCH', # 處理完畢後自動退出 Ghostscript
f'-sOutputFile={output_file}', # 指定輸出檔案的路徑
input_file # 指定輸入檔案的路徑
]
# 執行指令
subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 計算並顯示壓縮結果
original_size = os.path.getsize(input_file)
compressed_size = os.path.getsize(output_file)
ratio = (1 - compressed_size / original_size) * 100 if original_size > 0 else 0
print("\n" + "="*40)
print("✅ 壓縮成功!")
print(f" - 原始檔案: {input_file} ({original_size / 1024**2:.2f} MB)")
print(f" - 輸出檔案: {output_file} ({compressed_size / 1024**2:.2f} MB)")
print(f" - 檔案大小減少: {ratio:.2f}%")
print("="*40)
except subprocess.CalledProcessError as e:
print("\n❌ Ghostscript 處理失敗。")
print("錯誤訊息:", e.stderr.decode('utf-8', errors='ignore'))
except Exception as e:
print(f"\n❌ 發生未預期的錯誤: {e}")
if __name__ == "__main__":
# 腳本的進入點,處理命令列參數
if len(sys.argv) < 2 or len(sys.argv) > 3:
print("\n" + "使用方式:")
print(f" python {sys.argv[0]} <你的PDF檔案.pdf> [品質選項]")
print("\n範例:")
print(f" python {sys.argv[0]} my_large_doc.pdf")
print(f" python {sys.argv[0]} my_scan.pdf screen")
print("\n品質選項 (可選, 預設為 'ebook'):")
print(" - screen: 最低品質,最大壓縮率")
print(" - ebook: 中等品質,推薦使用")
print(" - printer: 高品質")
print(" - prepress: 印刷級品質")
sys.exit(1)
input_path = sys.argv[1]
# 如果使用者提供了第二個參數,則作為品質等級,否則使用預設值 'ebook'
quality_level = sys.argv[2] if len(sys.argv) == 3 else 'ebook'
# 自動產生輸出檔案名稱
base_name, ext = os.path.splitext(input_path)
output_path = f"{base_name}_compressed{ext}"
compress_with_ghostscript(input_path, output_path, quality=quality_level)
第三步:如何執行指令碼
現在,您可以透過命令列來使用這個 Python 腳本了。
- 準備檔案:
將您想要壓縮的 PDF 檔案(例如my_document.pdf
)與剛剛建立的compress_with_gs.py
檔案放在同一個資料夾中。 - 打開終端機:
打開您的終端機 (或 Windows 的命令提示字元/PowerShell),並使用cd
指令切換到該資料夾目錄。 - 執行壓縮:
根據您的需求,執行以下任一指令。- 使用預設品質 (
ebook
) 進行壓縮:
這是最常用也最平衡的選項。bash python compress_with_gs.py my_document.pdf
- 追求極致壓縮,使用
screen
品質:
這個選項會顯著降低圖片品質,但能得到最小的檔案。bash python compress_with_gs.py my_document.pdf screen
- 指定其他品質:
bash python compress_with_gs.py my_document.pdf printer
- 使用預設品質 (
- 檢查結果:
程式執行時會顯示進度,完成後會列出詳細的壓縮報告。您會在同一個資料夾下找到一個新的、已壓縮的檔案,例如my_document_compressed.pdf
。
這就是使用 Python 和 Ghostscript 進行高效 PDF 壓縮的完整流程。雖然前期設定稍嫌繁瑣,但其出色的壓縮效果絕對值得一試!