
1. 项目概述与核心需求最近在整理一批历史文档手头有几百个PDF文件里面有不少图表和示意图需要单独提取出来做二次编辑。如果一个个打开PDF再截图或者另存为图片工作量简直不敢想。作为一个懒人第一反应就是能不能用Python写个脚本批量把PDF的每一页都转成高清图片最好是JPG或者PNG格式分辨率还不能太低至少得300 DPI方便后续印刷或者高清展示。这个需求其实挺普遍的无论是做文档归档、内容迁移还是像我一样需要提取素材手动操作效率太低。市面上虽然有一些在线转换工具或者桌面软件但要么有文件数量、大小限制要么需要付费更重要的是无法集成到自动化工作流里。用Python来实现最大的好处就是自由、可控、可批量一次写好脚本以后类似的工作就一劳永逸了。所以今天就来聊聊怎么用Python真正实现“轻松”且“成功”地批量将PDF转换为300 DPI的JPG或PNG图片。这里说的“成功”不仅仅是跑通代码更是指转换后的图片质量清晰、尺寸准确、没有乱码或空白页能直接投入实际使用。2. 技术方案选型与工具解析要实现PDF转图片Python社区里有好几个库可选但各有优劣选错了工具后面可能会踩不少坑。我对比了几个主流方案最终选择了一个组合拳兼顾了稳定性、易用性和输出质量。2.1 核心库PyMuPDF (fitz)最初我尝试过pdf2image这个库它背后调用的是poppler工具在Linux上表现不错但在Windows上配置环境有点麻烦。后来发现了PyMuPDF通常以fitz模块名导入它是一个功能极其强大的PDF处理库底层基于成熟的MuPDF引擎。用它来渲染PDF页面为图片有几点核心优势纯Python实现无需外部依赖直接pip install PyMuPDF就能用跨平台无忧特别适合在服务器或无GUI环境下运行。渲染质量高速度飞快MuPDF引擎对PDF的渲染非常精准特别是对复杂字体和矢量图形的支持很好转换速度也比许多其他库快。精细控制参数可以非常方便地设置输出图片的分辨率DPI、缩放比例、色彩空间等这正是实现300 DPI输出的关键。注意安装时库名是PyMuPDF但在代码中要使用import fitz。这是历史原因记住就行。2.2 辅助库PIL (Pillow)PyMuPDF渲染出来的是原始的像素数据通常是一个字节流。我们需要另一个库来将这些数据保存为标准格式的图片文件比如JPG或PNG。这里就轮到Python图像处理领域的“瑞士军刀”——PillowPIL的分支出场了。它几乎能处理所有常见的图片格式并且可以方便地进行压缩、调整色彩模式等后处理。所以我们的技术栈就明确了用PyMuPDFfitz读取PDF并渲染每一页为高分辨率位图再用Pillow将位图数据保存为JPG或PNG文件。这个组合既专业又高效。2.3 为什么是300 DPI这里简单解释一下DPIDots Per Inch每英寸点数。它衡量的是打印或显示时图像的精细度。72或96 DPI是常见的屏幕显示标准而300 DPI则是印刷品如宣传册、书籍的常用分辨率能保证打印出来的文字和图片清晰锐利没有锯齿感。所以如果你的PDF转换图片是为了打印或高质量展示设置300 DPI是很有必要的。在代码中我们会通过设置一个放大矩阵matrix来精确控制这个参数。3. 环境准备与依赖安装动手写代码之前先把环境搭好。整个过程非常简单几乎不会遇到什么障碍。3.1 创建虚拟环境推荐为了避免项目间的包版本冲突强烈建议使用虚拟环境。打开你的终端Windows用CMD或PowerShellMac/Linux用Terminal执行以下命令# 创建一个新的虚拟环境命名为 pdf2img_env python -m venv pdf2img_env # 激活虚拟环境 # Windows: pdf2img_env\Scripts\activate # Mac/Linux: source pdf2img_env/bin/activate激活后你的命令行提示符前面应该会出现(pdf2img_env)表示你已经在这个独立的环境里了。3.2 安装核心依赖在激活的虚拟环境中运行以下pip命令来安装我们需要的两个库pip install PyMuPDF Pillowpip会自动处理这两个库及其自身的依赖。安装过程通常很快如果遇到网络问题可以考虑使用国内的镜像源比如清华源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyMuPDF Pillow。安装完成后可以快速验证一下import fitz from PIL import Image print(fitz.__doc__[:100]) # 打印PyMuPDF的部分文档确认导入成功如果没有报错说明环境配置成功。4. 核心代码实现与分步详解接下来是重头戏我们将一步步构建完整的转换脚本。我会把代码拆解开详细解释每一部分的作用和关键参数。4.1 基础转换函数单PDF转多图片我们先写一个函数实现将一个PDF文件的所有页面转换为图片。import fitz # PyMuPDF from PIL import Image import os def convert_pdf_to_images(pdf_path, output_folder, dpi300, fmtJPEG): 将单个PDF文件的所有页面转换为图片。 参数: pdf_path (str): PDF文件的完整路径。 output_folder (str): 输出图片的文件夹路径。 dpi (int): 输出图片的分辨率默认为300。 fmt (str): 输出图片格式JPEG 或 PNG。 # 1. 打开PDF文档 pdf_document fitz.open(pdf_path) # 获取PDF基础名称不含扩展名 pdf_name os.path.splitext(os.path.basename(pdf_path))[0] # 2. 确保输出文件夹存在 os.makedirs(output_folder, exist_okTrue) # 3. 计算缩放因子 # fitz.Matrix 用于定义缩放、旋转等变换。 # dpi / 72 是因为PyMuPDF内部默认以72DPI为基准。 zoom dpi / 72.0 matrix fitz.Matrix(zoom, zoom) # 4. 遍历每一页进行转换 for page_num in range(len(pdf_document)): # 获取页面对象 page pdf_document.load_page(page_num) # 将页面渲染为像素图Pixmap pix page.get_pixmap(matrixmatrix) # 从Pixmap的samples属性中获取图像数据并构建PIL Image对象 # 模式 RGB 适用于JPEG如果是PNG且需要透明度可能需要 RGBA img Image.frombytes(RGB, [pix.width, pix.height], pix.samples) # 5. 构建输出文件路径并保存 # 文件名格式PDF名_页码.扩展名 output_filename f{pdf_name}_page_{page_num1:03d}.{fmt.lower()} output_path os.path.join(output_folder, output_filename) img.save(output_path, formatfmt, dpi(dpi, dpi)) # 保存时也写入DPI信息 print(f已保存: {output_path}) # 6. 关闭PDF文档 pdf_document.close() print(f转换完成PDF {pdf_name} 共 {len(pdf_document)} 页。)关键点解析fitz.Matrix(zoom, zoom)这是控制分辨率的核心。PDF内部坐标系通常以72DPI为基准。我们将目标DPI除以72得到一个缩放因子。例如300 DPI对应的缩放因子是300/72 ≈ 4.1667。这个矩阵会告诉渲染引擎将页面放大到这个倍数从而得到高分辨率的位图。page.get_pixmap(matrixmatrix)这个方法根据我们提供的变换矩阵将PDF页面渲染成一个Pixmap对象它包含了页面的所有像素数据。Image.frombytes(...)我们将Pixmap对象的像素数据pix.samples和尺寸信息传递给Pillow重新构建成一个标准的Image对象这样才能进行后续的保存操作。保存时的DPI参数img.save(..., dpi(dpi, dpi))这一步很重要它将分辨率信息写入图片文件的元数据中。这样当你在Photoshop或其他图片查看器中打开时显示的尺寸才是正确的。4.2 批量处理与命令行集成单个文件转换的函数有了现在我们来增强它使其能够处理一个文件夹下的所有PDF文件并且最好能通过命令行参数来调用这样灵活性更高。import argparse def batch_convert_pdfs(input_folder, output_base_folder, dpi300, fmtJPEG): 批量转换一个文件夹内所有的PDF文件。 参数: input_folder (str): 存放PDF文件的输入文件夹路径。 output_base_folder (str): 输出图片的基础文件夹路径。 dpi (int): 输出图片的分辨率。 fmt (str): 输出图片格式。 # 获取输入文件夹中所有PDF文件 pdf_files [f for f in os.listdir(input_folder) if f.lower().endswith(.pdf)] if not pdf_files: print(f在文件夹 {input_folder} 中未找到PDF文件。) return print(f找到 {len(pdf_files)} 个PDF文件开始批量转换...) for pdf_file in pdf_files: pdf_path os.path.join(input_folder, pdf_file) # 为每个PDF创建一个独立的输出子文件夹避免文件混杂 pdf_name os.path.splitext(pdf_file)[0] output_folder os.path.join(output_base_folder, pdf_name) print(f\n正在处理: {pdf_file}) try: convert_pdf_to_images(pdf_path, output_folder, dpi, fmt) except Exception as e: print(f 转换失败: {pdf_file}, 错误: {e}) def main(): 命令行入口函数 parser argparse.ArgumentParser(description批量将PDF转换为高清图片 (JPG/PNG)) parser.add_argument(input, help输入PDF文件或文件夹的路径) parser.add_argument(-o, --output, default./output_images, help输出图片的文件夹路径 (默认: ./output_images)) parser.add_argument(--dpi, typeint, default300, help输出图片的分辨率DPI (默认: 300)) parser.add_argument(--format, choices[JPEG, PNG], defaultJPEG, help输出图片格式 (默认: JPEG)) args parser.parse_args() # 判断输入是文件还是文件夹 if os.path.isfile(args.input) and args.input.lower().endswith(.pdf): # 单个文件转换 output_folder os.path.join(args.output, os.path.splitext(os.path.basename(args.input))[0]) convert_pdf_to_images(args.input, output_folder, args.dpi, args.format) elif os.path.isdir(args.input): # 批量转换 batch_convert_pdfs(args.input, args.output, args.dpi, args.format) else: print(错误请输入一个有效的PDF文件路径或包含PDF文件的文件夹路径。) if __name__ __main__: main()现在这个脚本就可以通过命令行来调用了非常方便# 转换单个PDF文件 python pdf_to_img.py my_document.pdf -o ./converted --dpi 300 --format PNG # 转换整个文件夹下的PDF python pdf_to_img.py ./my_pdfs/ -o ./all_converted_images --dpi 3004.3 JPG与PNG格式的深度选择在函数中我们提供了JPEG和PNG两种格式选项。这不仅仅是扩展名的区别它们适用于完全不同的场景选择JPEG (fmtJPEG)优点采用有损压缩文件体积小适合用于网页展示、邮件附件或内容以彩色照片、渐变图像为主的PDF。缺点不支持透明度。如果PDF页面背景是透明的转换后会被填充为白色。反复编辑保存会导致质量下降。实操心得保存JPEG时Pillow默认质量是75。如果你对质量要求高可以修改保存代码img.save(..., formatJPEG, quality95, dpi(dpi, dpi))。quality取值1-10095以上差异不大但体积会显著增大。选择PNG (fmtPNG)优点采用无损压缩支持透明度Alpha通道。适合包含大量文字、线条图、图标或需要透明背景的PDF。转换后的图片质量完美适合二次编辑或印刷。缺点文件体积通常比JPEG大很多尤其是彩色页面。实操心得如果PDF本身是黑白的或者你不需要透明通道可以在保存前将图像模式转换为P调色板模式或L灰度模式能极大减小PNG文件体积。例如img.convert(L).save(...)。如何选择一个简单的原则追求最小文件体积选JPEG追求最高保真度和可编辑性选PNG。对于扫描版合同、论文这类文档PNG是更好的选择能保证文字边缘清晰。5. 高级技巧与性能优化基础的转换功能已经实现但在处理大量或复杂的PDF时我们还可以做一些优化让脚本更健壮、更高效。5.1 处理加密PDF与异常页面有些PDF是加密的或者某些页面可能损坏直接打开会报错。我们需要增加一些异常处理。def convert_pdf_to_images_robust(pdf_path, output_folder, dpi300, fmtJPEG): 增强版的转换函数增加异常处理和加密PDF支持。 try: # 尝试打开PDF如果加密会提示输入密码此处简化处理 pdf_document fitz.open(pdf_path) except fitz.FileDataError as e: print(f错误无法打开文件 {pdf_path}。可能已损坏或不是有效的PDF。) return # 注意对于加密PDFfitz.open()可能需要密码参数如 fitz.open(pdf_path, passwordxxx) # 此处为简化假设PDF未加密或已知密码。 pdf_name os.path.splitext(os.path.basename(pdf_path))[0] os.makedirs(output_folder, exist_okTrue) zoom dpi / 72.0 matrix fitz.Matrix(zoom, zoom) for page_num in range(len(pdf_document)): try: page pdf_document.load_page(page_num) pix page.get_pixmap(matrixmatrix) img Image.frombytes(RGB, [pix.width, pix.height], pix.samples) output_filename f{pdf_name}_page_{page_num1:03d}.{fmt.lower()} output_path os.path.join(output_folder, output_filename) img.save(output_path, formatfmt, dpi(dpi, dpi)) print(f 成功: 第 {page_num1} 页) except Exception as e: print(f 警告: 跳过第 {page_num1} 页原因: {e}) # 可以选择生成一个错误占位图 # error_img Image.new(RGB, (100, 100), colorred) # error_img.save(output_path) pdf_document.close()5.2 内存管理与大PDF处理当PDF页数非常多比如超过1000页或者页面尺寸巨大时一次性处理所有页面可能会消耗大量内存。我们可以采用“渲染一页保存一页释放一页”的策略并且对Pixmap对象进行显式清理。for page_num in range(len(pdf_document)): page pdf_document.load_page(page_num) pix page.get_pixmap(matrixmatrix) img_data pix.samples # 先取出数据 # 立即删除pix对象释放内存 pix None img Image.frombytes(RGB, [pix.width, pix.height], img_data) # ... 保存图片 img None # 删除PIL Image对象 # 可选强制垃圾回收一般不必要 # import gc # gc.collect()5.3 并行处理加速如果你的电脑是多核CPU并且要处理成百上千个PDF使用多进程可以极大缩短总耗时。我们可以用Python的concurrent.futures模块。from concurrent.futures import ProcessPoolExecutor, as_completed def convert_single_pdf_wrapper(args): 包装函数用于多进程调用 pdf_path, output_base, dpi, fmt args pdf_name os.path.splitext(os.path.basename(pdf_path))[0] output_folder os.path.join(output_base, pdf_name) os.makedirs(output_folder, exist_okTrue) try: convert_pdf_to_images_robust(pdf_path, output_folder, dpi, fmt) return (pdf_path, True, None) except Exception as e: return (pdf_path, False, str(e)) def batch_convert_parallel(input_folder, output_base_folder, dpi300, fmtJPEG, max_workers4): 使用多进程进行批量转换 pdf_files [os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.lower().endswith(.pdf)] if not pdf_files: return task_args [(pdf, output_base_folder, dpi, fmt) for pdf in pdf_files] with ProcessPoolExecutor(max_workersmax_workers) as executor: futures {executor.submit(convert_single_pdf_wrapper, arg): arg[0] for arg in task_args} for future in as_completed(futures): pdf_path, success, error future.result() if success: print(f完成: {os.path.basename(pdf_path)}) else: print(f失败: {os.path.basename(pdf_path)} - {error})提示多进程适用于多个PDF文件的并行。如果单个PDF文件页数极多想并行转换其内部页面情况会更复杂因为PDF文档对象可能无法安全地在进程间共享。通常更推荐对文件级别进行并行。6. 常见问题、故障排查与实战心得在实际操作中你几乎一定会遇到下面这些问题。我把它们和解决方案整理出来希望能帮你节省大量排查时间。6.1 转换后的图片模糊或有锯齿可能原因与解决方案DPI设置过低确认你的dpi参数确实设置为了300或更高。检查代码中matrix的计算是否正确zoom dpi / 72。查看器缩放问题图片本身是高清的但你的图片查看器可能默认以“适应窗口”的方式显示看起来模糊。用专业的图片软件如Photoshop、GIMP打开查看实际像素尺寸和文档尺寸是否正确。PDF本身是低清扫描件如果源PDF就是由低分辨率图片生成的那么无论怎么转换输出图片的清晰度上限已经被锁死了。这种情况下可以尝试在get_pixmap时使用更大的matrix进行超采样如设置dpi600但效果有限且会增大文件体积。6.2 转换出的图片是空白页可能原因与解决方案PDF包含透明图层或特殊矢量效果某些复杂的PDF特别是由设计软件生成可能使用了PyMuPDF默认渲染模式不支持的特性。尝试在get_pixmap时指定alphaFalse参数pix page.get_pixmap(matrixmatrix, alphaFalse)。字体缺失如果PDF使用了系统中没有的字体渲染时可能显示为空白。PyMuPDF会尝试用备用字体但有时会失败。确保你的运行环境安装了常用字体包。对于Linux服务器可能需要安装libfreetype6等字体库。页面内容为空有些PDF可能有空白页这是正常的。你可以先检查一下PDF在阅读器中是否显示正常。6.3 转换过程内存占用过高或崩溃可能原因与解决方案PDF页面尺寸过大或过于复杂例如工程图纸、高清海报。尝试降低输出DPI如从300降到150或者分批次处理PDF。没有及时释放内存参考5.2节在循环内及时将pix和img变量设为None。使用32位Python32位Python进程内存上限约为2GB。处理大文件时请使用64位Python。6.4 中文或其他特殊字符乱码可能原因与解决方案PDF内嵌字体子集问题这是最常见的原因。PDF为了减小体积可能只嵌入了文字中使用到的部分字体字形称为字体子集。PyMuPDF在渲染时依赖这些嵌入信息。如果渲染正常但保存后乱码问题可能出在系统字体上但PyMuPDF直接渲染为位图通常不会出现此问题。如果遇到可以尝试在服务器或容器环境中补充安装中文字体。确保系统有字体支持在Linux无GUI环境下运行务必安装字体包例如apt-get install fonts-wqy-zenhei文泉驿字体。6.5 输出图片颜色失真可能原因与解决方案色彩空间不匹配PDF可能使用CMYK色彩空间而Pillow的RGB模式无法正确转换。PyMuPDF的get_pixmap默认输出RGB。如果遇到严重色差可以尝试输出为PNG并检查源PDF的色彩配置。JPEG压缩导致JPEG是有损压缩。如果对颜色要求极高请使用PNG格式或者提高JPEG的保存质量quality100。我的实战心得先做小规模测试在处理成百上千个文件前先用一个具有代表性的PDF包含文字、图片、表格测试脚本检查分辨率、清晰度、文件大小是否符合预期。输出文件夹管理像我们代码里那样为每个PDF创建一个独立的子文件夹来存放图片后期整理和查找会方便无数倍。日志记录很重要在生产环境中不要只用print应该将转换成功/失败的信息记录到日志文件中便于后续追溯。DPI不是唯一指标300 DPI对于A4纸印刷是黄金标准。但如果你的PDF页面尺寸很大如A0海报转换成300 DPI的图片会巨大无比。此时需要根据最终用途屏幕观看还是印刷来权衡DPI和文件大小。7. 完整脚本整合与使用示例最后我将提供一个整合了上述所有优点的“终极”脚本并展示一个完整的使用案例。pdf_to_img_pro.py完整脚本#!/usr/bin/env python3 PDF批量转高清图片工具 (增强版) 支持加密PDF、异常处理、并行转换。 import fitz # PyMuPDF from PIL import Image import os import argparse import sys from concurrent.futures import ProcessPoolExecutor, as_completed import traceback def convert_single_page(page, matrix, fmt): 转换单个页面核心渲染逻辑 pix page.get_pixmap(matrixmatrix, alphaFalse) # 禁用alpha避免某些PDF渲染问题 img_mode RGB if fmt.upper() JPEG else RGBA if pix.alpha else RGB img Image.frombytes(img_mode, [pix.width, pix.height], pix.samples) return img def convert_pdf_to_images_pro(pdf_path, output_folder, dpi300, fmtJPEG, quality95): 专业版PDF转图片函数。 if not os.path.exists(pdf_path): raise FileNotFoundError(fPDF文件不存在: {pdf_path}) pdf_name os.path.splitext(os.path.basename(pdf_path))[0] os.makedirs(output_folder, exist_okTrue) try: # 尝试打开PDF这里可以扩展为支持密码输入 pdf_doc fitz.open(pdf_path) except Exception as e: print(f[错误] 无法打开 {pdf_path}: {e}) return False, str(e) zoom dpi / 72.0 matrix fitz.Matrix(zoom, zoom) success_pages 0 total_pages len(pdf_doc) for page_num in range(total_pages): output_filename f{pdf_name}_p{page_num1:03d}.{fmt.lower()} output_path os.path.join(output_folder, output_filename) try: page pdf_doc.load_page(page_num) img convert_single_page(page, matrix, fmt) save_kwargs {format: fmt, dpi: (dpi, dpi)} if fmt.upper() JPEG: save_kwargs[quality] quality if img.mode RGBA: img img.convert(RGB) # JPEG不支持透明度需转换 img.save(output_path, **save_kwargs) success_pages 1 # print(f [OK] 页 {page_num1}/{total_pages}) except Exception as e: print(f [失败] {pdf_name} 第 {page_num1} 页: {e}) # 可选保存一个错误提示图片 # err_img Image.new(RGB, (300,100), color#ffcccc) # ... 在图片上绘制错误文字 ... pdf_doc.close() status success_pages total_pages msg f转换 {pdf_name}: {success_pages}/{total_pages} 页成功 if not status: msg f {total_pages - success_pages} 页失败 print(f[完成] {msg}) return status, msg def process_single_task(task_args): 供多进程调用的任务函数 pdf_path, output_base, dpi, fmt, quality task_args pdf_name os.path.splitext(os.path.basename(pdf_path))[0] output_folder os.path.join(output_base, pdf_name) try: status, msg convert_pdf_to_images_pro(pdf_path, output_folder, dpi, fmt, quality) return (pdf_path, status, msg, None) except Exception as e: return (pdf_path, False, str(e), traceback.format_exc()) def main(): parser argparse.ArgumentParser(description批量PDF转高清图片工具 (支持并行)) parser.add_argument(input, help输入路径 (PDF文件 或 包含PDF的文件夹)) parser.add_argument(-o, --output, default./converted_images, help输出根目录 (默认: ./converted_images)) parser.add_argument(--dpi, typeint, default300, help输出分辨率 (默认: 300)) parser.add_argument(--format, choices[jpg, jpeg, png], defaultjpg, help输出格式 (默认: jpg)) parser.add_argument(--quality, typeint, default95, helpJPEG图片质量 (1-100, 默认: 95)) parser.add_argument(--workers, typeint, default1, help并行工作进程数 (默认: 1即串行)) parser.add_argument(--skip-existing, actionstore_true, help跳过已存在输出文件夹的PDF) args parser.parse_args() fmt args.format.upper() if args.format.upper() ! JPG else JPEG os.makedirs(args.output, exist_okTrue) # 收集任务 tasks [] if os.path.isfile(args.input) and args.input.lower().endswith(.pdf): tasks.append((args.input, args.output, args.dpi, fmt, args.quality)) elif os.path.isdir(args.input): for fname in os.listdir(args.input): if fname.lower().endswith(.pdf): pdf_path os.path.join(args.input, fname) pdf_name os.path.splitext(fname)[0] out_subfolder os.path.join(args.output, pdf_name) if args.skip_existing and os.path.exists(out_subfolder): print(f[跳过] {fname} (输出文件夹已存在)) continue tasks.append((pdf_path, args.output, args.dpi, fmt, args.quality)) else: print(错误无效的输入路径。) sys.exit(1) if not tasks: print(未找到需要处理的PDF文件。) return print(f开始处理 {len(tasks)} 个PDF文件使用 {args.workers} 个进程...) # 执行任务 (并行或串行) if args.workers 1 and len(tasks) 1: with ProcessPoolExecutor(max_workersargs.workers) as executor: futures {executor.submit(process_single_task, task): task for task in tasks} for future in as_completed(futures): pdf_path, status, msg, tb future.result() if status: print(f[成功] {os.path.basename(pdf_path)}) else: print(f[失败] {os.path.basename(pdf_path)}: {msg}) if tb: print(tb) else: # 串行执行便于调试 for task in tasks: pdf_path, status, msg, tb process_single_task(task) # 结果已在函数内打印此处可省略 print(\n所有任务处理完毕。) if __name__ __main__: main()使用示例假设你有一个contracts.pdf文件需要转换为PNG格式保存在./output文件夹。单文件转换 (高质量PNG):python pdf_to_img_pro.py contracts.pdf -o ./output --format png --dpi 300这会在./output/contracts/文件夹下生成contracts_p001.png,contracts_p002.png等文件。批量转换文件夹 (JPEG 并行4进程):python pdf_to_img_pro.py ./my_pdfs/ -o ./all_converted --format jpg --dpi 300 --workers 4 --quality 90这会处理./my_pdfs/文件夹下所有PDF每个PDF的输出放在./all_converted/下以PDF命名的子文件夹里使用4个CPU核心并行处理JPEG质量为90。跳过已处理文件:python pdf_to_img_pro.py ./my_pdfs/ -o ./all_converted --skip-existing如果某个PDF对应的输出文件夹已经存在则跳过它非常适合增量处理。这个脚本已经具备了生产级别的健壮性包含了错误处理、日志输出、并行处理和灵活的配置选项。你可以将它保存下来作为你数字文档处理工具箱中的一件利器。