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主要处理丨℃以及为用户提供一个用户空间工具来进行虚拟机的…

优化与管理数据库连接池

优化与管理数据库连接池 在现代高并发系统中,数据库连接池是保障数据库访问性能的核心组件之一。合理配置、优化和管理连接池,可以有效缓解连接创建成本高、连接频繁断开重连等问题,从而提升系统整体的响应速度与稳定性。 数据库连接池的作用与价值 数据库连接池的核心思…