Python 腳本,用于將 PDF 文件高質量地轉換為 PNG 圖像

import os
import fitz  # PyMuPDF
from PIL import Image
import argparse
import logging
from tqdm import tqdm# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger('PDF2PNG')def convert_pdf_to_png(pdf_path, output_dir, dpi=300, zoom_factor=4.0, image_format='PNG', grayscale=False, crop_to_content=False, quality=95):"""將PDF文件轉換為高質量的PNG圖像參數:pdf_path (str): PDF文件路徑output_dir (str): 輸出目錄dpi (int): 輸出圖像DPI (默認300)zoom_factor (float): 縮放因子,提高圖像質量 (默認4.0)image_format (str): 輸出格式 ('PNG', 'JPEG', 'TIFF')grayscale (bool): 是否轉換為灰度圖像crop_to_content (bool): 是否裁剪到內容區域quality (int): 輸出質量 (1-100)"""try:# 驗證輸入路徑if not os.path.isfile(pdf_path):raise FileNotFoundError(f"PDF文件不存在: {pdf_path}")# 創建輸出目錄os.makedirs(output_dir, exist_ok=True)# 打開PDF文件pdf_document = fitz.open(pdf_path)total_pages = len(pdf_document)logger.info(f"開始轉換: {os.path.basename(pdf_path)}")logger.info(f"總頁數: {total_pages}")logger.info(f"輸出DPI: {dpi}, 縮放因子: {zoom_factor}, 格式: {image_format}")# 創建進度條pbar = tqdm(total=total_pages, desc="轉換進度", unit="頁")for page_num in range(total_pages):page = pdf_document.load_page(page_num)# 計算縮放矩陣zoom_matrix = fitz.Matrix(zoom_factor, zoom_factor)# 獲取頁面內容邊界(用于裁剪)if crop_to_content:content_rect = page.get_textpage().boundrectif not content_rect.is_empty:clip_rect = content_rect * zoom_matrixelse:clip_rect = page.rect * zoom_matrixelse:clip_rect = page.rect * zoom_matrix# 渲染頁面為像素圖pix = page.get_pixmap(matrix=zoom_matrix, clip=clip_rect, alpha=False)# 轉換為PIL圖像img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)# 轉換為灰度if grayscale:img = img.convert("L")# 生成輸出文件名base_name = os.path.splitext(os.path.basename(pdf_path))[0]output_path = os.path.join(output_dir, f"{base_name}_page_{page_num+1:03d}.{image_format.lower()}")# 保存圖像if image_format == 'PNG':img.save(output_path, format='PNG', compress_level=2)elif image_format == 'JPEG':img.save(output_path, format='JPEG', quality=quality, subsampling=0)elif image_format == 'TIFF':img.save(output_path, format='TIFF', compression='tiff_lzw')else:raise ValueError(f"不支持的圖像格式: {image_format}")pbar.update(1)pbar.close()pdf_document.close()logger.info(f"轉換完成! 輸出目錄: {output_dir}")except Exception as e:logger.error(f"轉換過程中出錯: {str(e)}")raisedef main():parser = argparse.ArgumentParser(description='將PDF文件轉換為高質量PNG圖像')parser.add_argument('input_pdf', type=str, help='輸入PDF文件路徑')parser.add_argument('output_dir', type=str, help='輸出目錄路徑')parser.add_argument('--dpi', type=int, default=300, help='輸出圖像DPI (默認300)')parser.add_argument('--zoom', type=float, default=4.0, help='縮放因子 (默認4.0)')parser.add_argument('--format', type=str, default='PNG', choices=['PNG', 'JPEG', 'TIFF'], help='輸出圖像格式 (默認PNG)')parser.add_argument('--grayscale', action='store_true', help='轉換為灰度圖像')parser.add_argument('--crop', action='store_true', help='裁剪到內容區域')parser.add_argument('--quality', type=int, default=95, choices=range(1, 101), metavar="[1-100]", help='輸出質量 (默認95)')args = parser.parse_args()try:convert_pdf_to_png(pdf_path=args.input_pdf,output_dir=args.output_dir,dpi=args.dpi,zoom_factor=args.zoom,image_format=args.format,grayscale=args.grayscale,crop_to_content=args.crop,quality=args.quality)except Exception as e:logger.error(f"轉換失敗: {str(e)}")exit(1)if __name__ == "__main__":main()

使用說明

安裝依賴

pip install PyMuPDF Pillow tqdm

命令行使用

# 基本用法
python pdf_to_png.py input.pdf output_directory# 高級選項
python pdf_to_png.py input.pdf output_directory \--dpi 600 \             # 設置DPI為600--zoom 5.0 \            # 提高縮放因子--format JPEG \         # 輸出為JPEG格式--grayscale \           # 轉換為灰度圖像--crop \                # 裁剪到內容區域--quality 90            # 設置JPEG質量為90

功能特點

  1. 高質量輸出

    • 使用高DPI設置(默認300 DPI)
    • 通過縮放因子提升渲染質量(默認4.0)
    • 支持PNG、JPEG、TIFF三種輸出格式
  2. 智能處理

    • 內容感知裁剪(--crop選項)
    • 灰度轉換(--grayscale選項)
    • 進度條顯示轉換進度
  3. 健壯性

    • 完善的錯誤處理
    • 輸入文件驗證
    • 自動創建輸出目錄
  4. 性能優化

    • 批量處理多頁文檔
    • 內存高效管理
    • 支持大文件處理

技術說明

  1. 渲染質量

    • 使用 zoom_factor 參數控制渲染質量(值越高越清晰)
    • DPI 與縮放因子關系:實際DPI = zoom_factor × 72
  2. 內容裁剪

    • 基于文本內容自動檢測邊界
    • 移除不必要的空白區域
    • 特別適合掃描文檔處理
  3. 格式選項

    • PNG:無損壓縮,適合文本和線條圖
    • JPEG:有損壓縮,適合照片內容
    • TIFF:高質量存檔格式,支持多頁

常見問題解決

  1. 中文路徑問題

    # 在腳本開頭添加
    import sys
    sys.stdout.reconfigure(encoding='utf-8')
    
  2. 內存不足處理

    • 降低 zoom_factor
    • 分批次處理大型PDF
  3. 安裝問題

    • Windows用戶可能需要安裝Microsoft Visual C++ Redistributable
    • Linux用戶確保安裝libjpeg和zlib開發包

此腳本提供了專業級的PDF轉圖像功能,特別適合需要高質量轉換的學術、出版和設計工作場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87610.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CUDA GPU 支持安裝全攻略】PyTorch 深度學習開發者指南

PyTorch 的 CUDA GPU 支持 安裝五條鐵律(最新版 2025 修訂)(適用于所有用戶)-CSDN博客 是否需要預先安裝 CUDA Toolkit?——按使用場景分級推薦及進階說明-CSDN博客 “100% 成功的 PyTorch CUDA GPU 支持” 安裝攻略…

Cyberith 運動模擬器Virtualizer2:提升虛擬現實沉浸體驗

奧地利Cyberith公司是一家專注于虛擬現實(VR)互動解決方案的創新型科技企業,以其研發的Virtualizer虛擬現實步態模擬設備而聞名。該公司的核心技術體現在其設計和制造的全方位跑步機式VR交互平臺上,使得用戶能夠在虛擬環境中實現自…

常見的數據處理方法有哪些?ETL中的數據處理怎么完成

在數字化轉型縱深推進的背景下,數據作為新型生產要素已成為驅動企業戰略決策、科研創新及智能化運營的核心戰略資產。數據治理價值鏈中的處理環節作為關鍵價值節點,其本質是通過系統化處理流程將原始觀測數據轉化為結構化知識產物,以支撐預測…

WHAT - 為甲方做一個官網(二)- 快速版

文章目錄 一、明確需求優先級(快速決策)二、推薦零代碼/低代碼工具(附對比)方案1:低代碼建站平臺(適合無技術用戶,拖拽式操作)方案2:CMS系統(適合內容更新頻繁…

音視頻之H.264視頻編碼傳輸及其在移動通信中的應用

系列文章: 1、音視頻之視頻壓縮技術及數字視頻綜述 2、音視頻之視頻壓縮編碼的基本原理 3、音視頻之H.264/AVC編碼器原理 4、音視頻之H.264的句法和語義 5、音視頻之H.264/AVC解碼器的原理和實現 6、音視頻之H.264視頻編碼傳輸及其在移動通信中的應用 7、音視…

C#語言入門-task2 :C# 語言的基本語法結構

下面從四個方面對C#的基本語法進行簡單介紹: 1. 數據類型 C#的類型可分為值類型和引用類型。值類型變量直接存儲數據,引用類型變量則存儲對象的引用。 值類型:涵蓋整數類型(像int、long)、浮點類型(例如…

c#筆記之類的常量、字段和屬性

學習內容: 一、字段 字段是為了對象或者類型存儲數據的,可以表達一個對象或者類型的狀態;也叫做成員變量;注意字段是在類里面聲明的;在方法里聲明的是局部變量; 1.1實例字段 用來表示每個實例的狀態;比如一個students類;要了解一個學生一般看名字和成績;所以名字和…

Linux 常用命令(入門)

Linux 常用命令 一、Linux 命令基礎 (一)命令格式 Linux 命令的一般格式為:command [-options] [parameter1] … 。其中,command 是命令名,通常是相應功能的英文單詞或其縮寫;[-options] 是選項,用于對命令進行控制,可省略;parameter1 … 是傳給命令的參數,可以是…

CppCon 2016 學習:Parallelism in Modern C++

這段介紹的是 HPX (High Performance ParalleX),一個現代C的通用并行運行時系統,重點包括: 通用性:適用于各種規模的應用,從小型到超大規模分布式系統。統一標準API:符合C標準,方便編寫異步、并…

機器學習監督學習實戰七:文本卷積神經網絡TextCNN對中文短文本分類(15類)

本文介紹了一個基于TextCNN模型的文本分類項目,使用今日頭條新聞數據集進行訓練和評估。項目包括數據獲取、預處理、模型訓練、評估測試等環節。數據預處理涉及清洗文本、中文分詞、去除停用詞、構建詞匯表和向量化等步驟。TextCNN模型通過卷積層和池化層提取文本特…

iot-dc3 項目Bug修復保姆喂奶級教程

一.Uncaught (in promise) ReferenceError: TinyArea is not defined 1.觸發場景 前端設備模塊,點擊關聯模板、關聯位號、設備數據,無反應,一直切不過去,沒有報錯通知,F12查看控制臺報錯如下: 2.引起原因 前端導入的庫為"@antv/g2": "^5.3.0",在 P…

Spring Boot + MyBatis Plus + SpringAI + Vue 畢設項目開發全解析(源碼)

前言 前些天發現了一個巨牛的人工智能免費學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站 Spring Boot MyBatis Plus SpringAI Vue 畢設項目開發全解析 目錄 一、項目概述與技術選型 項目背景與需求分析技術棧選擇…

Vitess數據庫部署與運維深度指南:構建可伸縮、高可用與安全的云原生數據庫

摘要 Vitess是一個為MySQL和MariaDB設計的云原生、水平可伸縮的分布式數據庫系統,它通過分片(sharding)實現無限擴展,同時保持對應用程序的透明性,使其無需感知底層數據分布。該項目于2019年從云原生計算基金會&#…

SpringAI+DeepSeek大模型應用開發——6基于MongDB持久化對話

持久化對話 默認情況下,聊天記憶存儲在內存中ChatMemory chatMemory new InMemoryChatMemory()。 如果需要持久化存儲,可以實現一個自定義的聊天記憶存儲類,以便將聊天消息存儲在你選擇的任何持久化存儲介質中。 MongoDB 文檔型數據庫&…

Mac電腦-音視頻剪輯編輯-Final Cut Pro X(fcpx)

Final Cut Pro Mac是一款專業的視頻剪輯工具,專為蘋果用戶設計。 它具備強大的視頻剪輯、音軌、圖形特效和調色功能,支持整片輸出,提升創作效率。 經過Apple芯片優化,利用Metal引擎動力,可處理更復雜的項目&#xff…

不同程度多徑效應影響下的無線通信網絡電磁信號仿真數據生成程序

生成.mat數據: %創建時間:2025年6月19日 %zhouzhichao %遍歷生成不同程度多徑效應影響的無線通信網絡拓撲推理數據用于測試close all clearsnr 40; n 30;dataset_n 100;for bias 0.1:0.1:0.9nodes_P ones(n,1);Sampling_M 3000;%獲取一幀信號及對…

Eureka 和 Feign(二)

Eureka 和 Feign 是 Spring Cloud 微服務架構中協同工作的兩個核心組件,它們的關系可以通過以下比喻和詳解來說明: 關系核心:服務發現 → 動態調用 組件角色核心功能Eureka服務注冊中心服務實例的"電話簿"Feign聲明式HTTP客戶端根…

Springboot仿抖音app開發之RabbitMQ 異步解耦(進階)

Springboot仿抖音app開發之評論業務模塊后端復盤及相關業務知識總結 Springboot仿抖音app開發之粉絲業務模塊后端復盤及相關業務知識總結 Springboot仿抖音app開發之用短視頻務模塊后端復盤及相關業務知識總結 Springboot仿抖音app開發之用戶業務模塊后端復盤及相關業務知識…

1.部署KVM虛擬化平臺

一.KVM原理簡介 廣義的KVM實際上包含兩部分,一部分是基于Linux內核支持的KVM內核模塊,另一部分就是經過簡化和修改的Qemuo KVM內核模塊是模擬處理器和內存以支持虛擬機的運行,Qemu主要處理丨℃以及為用戶提供一個用戶空間工具來進行虛擬機的…

優化與管理數據庫連接池

優化與管理數據庫連接池 在現代高并發系統中,數據庫連接池是保障數據庫訪問性能的核心組件之一。合理配置、優化和管理連接池,可以有效緩解連接創建成本高、連接頻繁斷開重連等問題,從而提升系統整體的響應速度與穩定性。 數據庫連接池的作用與價值 數據庫連接池的核心思…