如何去除pdf2image直接存盘生成JPG文件名中的‘_0001-’后缀?
问题:修改pdf2image直接存盘的文件名规则
我需要将多页PDF转换为多个JPG文件,要求图片直接写入硬盘而非暂存到内存。在Python 3.11中,我使用以下代码:
from pdf2image import convert_from_path poppler_path = r".\poppler-22.12.0\Library\bin" images = convert_from_path('test.pdf', output_folder='.', output_file = 'test', poppler_path=poppler_path, paths_only = True)
但pdf2image生成的文件名格式为test_0001-1.jpg、test_0001-2.jpg等,我希望生成的文件名不含_0001-后缀(例如test1.jpg)。目前我能想到的方法是不使用output_folder参数,逐个调用image.save()保存图片,但这种方式会先把图片存入内存,容易占用大量内存空间。请问是否可以修改pdf2image直接存盘时的文件名生成规则?
解决方案
pdf2image本质是封装了poppler的pdftoppm工具,其默认的文件名格式由poppler决定,没有直接提供修改文件名规则的参数。不过可以通过两种方式实现需求,且全程不加载图片到内存:
方法一:直接调用poppler的pdftoppm工具+批量重命名
绕开pdf2image,直接调用poppler核心工具生成图片,再批量重命名成目标格式:
import subprocess import os poppler_bin_path = r".\poppler-22.12.0\Library\bin" pdf_path = "test.pdf" output_prefix = "test" # 调用pdftoppm生成JPG,初始格式为test-1.jpg、test-2.jpg... subprocess.run( [ os.path.join(poppler_bin_path, "pdftoppm.exe"), "-jpeg", # 指定输出格式为JPG pdf_path, output_prefix ], check=True ) # 批量重命名,将test-N.jpg改为testN.jpg for filename in os.listdir("."): if filename.startswith(f"{output_prefix}-") and filename.endswith(".jpg"): new_filename = filename.replace("-", "") os.rename(filename, new_filename)
方法二:用pdf2image生成后立刻重命名
保留原代码的调用逻辑,利用paths_only=True返回的文件路径列表,直接对硬盘上的文件重命名,无需加载图片到内存:
from pdf2image import convert_from_path import os poppler_path = r".\poppler-22.12.0\Library\bin" output_prefix = "test" # 生成文件到硬盘,返回所有图片的路径 image_paths = convert_from_path( 'test.pdf', output_folder='.', output_file=output_prefix, poppler_path=poppler_path, paths_only=True ) # 遍历路径,重命名为目标格式 for idx, old_path in enumerate(image_paths, start=1): new_path = f"{output_prefix}{idx}.jpg" os.rename(old_path, new_path)
说明
两种方法都不会将图片加载到内存:
- 方法一直接通过命令行工具生成文件,全程由poppler处理并写入硬盘;
- 方法二中
paths_only=True让pdf2image只返回文件路径,不加载图片对象,重命名操作仅修改文件系统的元数据,不会占用额外内存。
内容的提问来源于stack exchange,提问作者Gardener_NL
相关产品推荐
相关产品推荐

