最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+Ghostscript實現(xiàn)一個簡單的PDF批量壓縮工具(含進度條)

 更新時間:2025年11月27日 08:57:48   作者:weixin_46244623  
在日常工作中,我們經(jīng)常會遇到 PDF 文件體積過大的問題,手動一個個壓縮不僅麻煩,還容易忘參數(shù),今天分享一個用 Python + Ghostscript 實現(xiàn)的 自動批量壓縮 PDF 腳本,有需要的可以了解下

在日常工作中,我們經(jīng)常會遇到 PDF 文件體積過大的問題:要么發(fā)郵件超出限制、要么上傳系統(tǒng)被拒絕、要么手機查看太慢。

手動一個個壓縮不僅麻煩,還容易忘參數(shù)。今天分享一個用 Python + Ghostscript 實現(xiàn)的 自動批量壓縮 PDF 腳本,支持:

  • 智能推薦壓縮等級
  • 進度條顯示
  • 記憶上次選擇
  • 跨平臺(Windows / macOS / Linux)

一、腳本功能概覽

腳本主要做了以下幾件事:

  • 自動檢測 Ghostscript 是否安裝
  • 掃描指定目錄下所有 PDF 文件
  • 根據(jù)文件總大小 智能推薦 壓縮等級
  • 用戶可手動選擇壓縮模式(共 5 種)
  • 逐個壓縮 PDF 文件并顯示進度條
  • 統(tǒng)計壓縮結果、計算壓縮率、輸出報告

二、Ghostscript 簡介

Ghostscript (gs) 是一款強大的 PDF 與 PostScript 處理工具,幾乎所有 PDF 壓縮軟件(包括 Adobe Acrobat)都基于它。

安裝方式如下:

Windows:官方下載地址

macOS(Homebrew):

brew install ghostscript 

Linux(Debian/Ubuntu):

sudo apt install ghostscript 

安裝完成后,執(zhí)行命令驗證:

gs --version

三、完整 Python 腳本

保存為 pdf_compress.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os, subprocess, sys, platform, shutil, json
from tqdm import tqdm

# ===== 配置 =====
input_dir = "output_pdfs"   # 待壓縮PDF目錄
output_dir = "pdf_output"   # 輸出目錄
config_file = "compress_config.json"  # 保存上次選擇

# ===== 壓縮等級定義 =====
COMPRESSION_LEVELS = {
    "1": { "name": "屏幕 (72dpi)", "level": "/screen",   "desc": "網(wǎng)頁/手機,超小文件" },
    "2": { "name": "電子書 (150dpi)", "level": "/ebook",    "desc": "閱讀,平衡大小" },
    "3": { "name": "打印 (300dpi)", "level": "/printer",  "desc": "打印,高清" },
    "4": { "name": "印刷 (300+dpi)", "level": "/prepress", "desc": "專業(yè)印刷,保真" },
    "5": { "name": "無損優(yōu)化", "level": "/default",   "desc": "僅優(yōu)化結構,不降質量" }
}

# ===== 保存/加載配置 =====
def load_last_config():
    try:
        with open(config_file, 'r') as f:
            return json.load(f).get('level', '2')
    except:
        return '2'

def save_config(level):
    with open(config_file, 'w') as f:
        json.dump({'level': level}, f)

# ===== 工具函數(shù) =====
def get_file_size_mb(path):
    try:
        return os.path.getsize(path) / (1024 * 1024)
    except:
        return 0

def recommend_level(pdf_files):
    total_size = sum(get_file_size_mb(os.path.join(input_dir, f)) for f in pdf_files)
    if total_size > 50:
        return "1"
    elif total_size > 10:
        return "2"
    else:
        return "3"

# ===== 檢測 Ghostscript =====
def find_gs_command():
    system = platform.system()
    candidates = ["gswin64c", "gswin32c", "gs"] if system == "Windows" else ["gs"]
    for cmd in candidates:
        if shutil.which(cmd):
            return cmd
    return None

gs_cmd = find_gs_command()
if not gs_cmd:
    print("? 未找到 Ghostscript!請先安裝。")
    sys.exit(1)

print(f"? Ghostscript: `{gs_cmd}`")
os.makedirs(output_dir, exist_ok=True)

# ===== 獲取 PDF 文件 =====
pdf_files = [f for f in os.listdir(input_dir)
             if f.lower().endswith(".pdf") and os.path.isfile(os.path.join(input_dir, f))]

if not pdf_files:
    print(f"? `{input_dir}` 中未找到 PDF 文件")
    sys.exit(0)

total_size = sum(get_file_size_mb(os.path.join(input_dir, f)) for f in pdf_files)
print(f"?? 發(fā)現(xiàn) {len(pdf_files)} 個 PDF,總大小: {total_size:.1f}MB")

# ===== 選擇壓縮等級 =====
print("\n" + "="*60)
print("?? 請選擇壓縮等級 (上次選擇: {})".format(load_last_config()))
print("="*60)
for key, info in COMPRESSION_LEVELS.items():
    print(f"  {key}. {info['name']} - {info['desc']}")
print("="*60)

recommended = recommend_level(pdf_files)
print(f"?? 智能推薦: {recommended} (基于文件大小)")

while True:
    choice = input("\n請輸入編號 (1-5): ").strip()
    if choice in COMPRESSION_LEVELS:
        compression_level = COMPRESSION_LEVELS[choice]["level"]
        selected_name = COMPRESSION_LEVELS[choice]["name"]
        save_config(choice)
        break
    else:
        print("? 請輸入 1-5")

print(f"\n?? 確認使用: {selected_name}")

# ===== 批量壓縮 =====
failed = []
pbar = tqdm(pdf_files, desc="壓縮進度", unit="文件")

for pdf_file in pbar:
    input_path = os.path.join(input_dir, pdf_file)
    output_path = os.path.join(output_dir, pdf_file)
    pbar.set_postfix({"文件": pdf_file[:30]})

    cmd = [
        gs_cmd, "-sDEVICE=pdfwrite", "-dCompatibilityLevel=1.4",
        f"-dPDFSETTINGS={compression_level}", "-dNOPAUSE", "-dQUIET", "-dBATCH",
        f"-sOutputFile={output_path}", input_path
    ]

    try:
        subprocess.run(cmd, check=True, capture_output=True)
    except subprocess.CalledProcessError:
        failed.append(pdf_file)

# ===== 輸出結果 =====
success = len(pdf_files) - len(failed)
orig_total = sum(get_file_size_mb(os.path.join(input_dir, f)) for f in pdf_files)
comp_total = sum(get_file_size_mb(os.path.join(output_dir, f)) for f in os.listdir(output_dir) if f.lower().endswith('.pdf'))

print("\n" + "="*60)
print("?? 壓縮完成!")
print("="*60)
print(f"?? 成功: {success}/{len(pdf_files)}")
print(f"?? 原始: {orig_total:.1f}MB  →  壓縮后: {comp_total:.1f}MB")
print(f"?? 壓縮率: {((orig_total-comp_total)/orig_total*100):.1f}%")
print(f"?? 輸出目錄: {os.path.abspath(output_dir)}")

if failed:
    print(f"\n? 失敗文件 ({len(failed)}):")
    for f in failed:
        print(f"   - {f}")

print("="*60)

四、壓縮等級說明

等級模式分辨率說明
1/screen72dpi適合網(wǎng)頁、手機端,體積最小
2/ebook150dpi適合電子閱讀,畫質平衡
3/printer300dpi打印清晰,常用推薦
4/prepress300+dpi出版印刷級
5/default無損不降質,僅結構優(yōu)化

五、運行效果

運行:

python3 pdf_compress.py

輸出示例:

? Ghostscript: `gs`
?? 發(fā)現(xiàn) 8 個 PDF,總大小: 42.5MB
?? 智能推薦: 2 (基于文件大小)

?? 確認使用: 電子書 (150dpi)

壓縮進度: 100%|████████████████████| 8/8 [00:12<00:00, 0.65文件/s]
?? 壓縮完成!
?? 原始: 42.5MB → 壓縮后: 15.3MB
?? 壓縮率: 64.0%
?? 輸出目錄: /home/user/pdf_output

到此這篇關于Python+Ghostscript實現(xiàn)一個簡單的PDF批量壓縮工具(含進度條)的文章就介紹到這了,更多相關Python PDF批量壓縮內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python?Bokeh實現(xiàn)實時數(shù)據(jù)可視化

    Python?Bokeh實現(xiàn)實時數(shù)據(jù)可視化

    在數(shù)據(jù)分析和科學計算中,數(shù)據(jù)可視化是不可或缺的一部分,本文將通過簡潔的語言和具體的代碼示例,介紹如何使用Bokeh庫進行實時數(shù)據(jù)可視化,感興趣的可以了解下
    2024-12-12
  • python腳本實現(xiàn)查找webshell的方法

    python腳本實現(xiàn)查找webshell的方法

    這篇文章主要介紹了python腳本實現(xiàn)查找webshell的方法,是很實用的一個功能,需要的朋友可以參考下
    2014-07-07
  • Python基于scapy實現(xiàn)修改IP發(fā)送請求的方法示例

    Python基于scapy實現(xiàn)修改IP發(fā)送請求的方法示例

    這篇文章主要介紹了Python基于scapy實現(xiàn)修改IP發(fā)送請求的方法,涉及Python網(wǎng)絡編程中使用scapy操作IP的相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • 解決Shell執(zhí)行python文件,傳參空格引起的問題

    解決Shell執(zhí)行python文件,傳參空格引起的問題

    今天小編就為大家分享一篇解決Shell執(zhí)行python文件,傳參空格引起的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python中pyc、?pyd文件及生成使用完整實例代碼

    python中pyc、?pyd文件及生成使用完整實例代碼

    這篇文章主要介紹了python中pyc、?pyd文件及生成使用的相關資料,重點講解了如何使用Python解釋器編譯.py文件為.pyc文件,以及如何使用Cython和distutils工具將C/C++代碼編譯為.pyd文件,需要的朋友可以參考下
    2025-04-04
  • 使用keras內置的模型進行圖片預測實例

    使用keras內置的模型進行圖片預測實例

    這篇文章主要介紹了使用keras內置的模型進行圖片預測實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python中web錯誤處理與異常捕獲示例詳解

    Python中web錯誤處理與異常捕獲示例詳解

    在任何編程語言中,異常(Exception)都是一種不可避免的現(xiàn)象,它們通常是由程序運行時的錯誤或意外情況引起的,這篇文章主要介紹了Python中web錯誤處理與異常捕獲的相關資料,需要的朋友可以參考下
    2025-07-07
  • Python制作一個WiFi密碼測試工具

    Python制作一個WiFi密碼測試工具

    這篇文章主要為大家詳細介紹了Python如何通過字典攻擊方式幫助用戶測試 Wi-Fi 網(wǎng)絡的安全性,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-01-01
  • python沒有gpu,如何改用cpu跑代碼

    python沒有gpu,如何改用cpu跑代碼

    這篇文章主要介紹了python沒有gpu,如何改用cpu跑代碼?今天小編就為大家分享一下解決方案。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python中np是做什么的

    python中np是做什么的

    在本篇內容里小編給大家整理的是一篇關于python中np的作用的相關文章,有興趣的朋友們跟著學習下。
    2020-07-07

最新評論

香河县| 齐河县| 兰考县| 镇雄县| 桃源县| 青州市| 平遥县| 山东省| 曲阜市| 广饶县| 沽源县| 扎囊县| 朝阳区| 会东县| 离岛区| 绥中县| 洞口县| 岑巩县| 廊坊市| 灵寿县| 社会| 阿拉善左旗| 星座| 积石山| 封丘县| 南和县| 同仁县| 固安县| 观塘区| 江安县| 福鼎市| 池州市| 都兰县| 贺兰县| 山阳县| 石门县| 晋中市| 岗巴县| 睢宁县| 峨眉山市| 定襄县|