Python提取PDF内JP2图片:如何通过write()指定自定义文件名防覆盖
解决PDF提取图片重名覆盖问题的两种方法
方法一:直接生成带PDF前缀的自定义文件名
直接在保存时把原PDF的文件名(不含扩展名)和图片名拼接,就能避免不同PDF的图片重名覆盖。修改代码中open()的文件名参数即可:
from PyPDF2 import PdfReader from pathlib import Path pdfdirpath = Path('C:/Users/...') pathlist = pdfdirpath.glob('*.pdf') for path in pathlist: reader = PdfReader(path) # 获取PDF文件名(不含后缀)作为前缀 pdf_filename = path.stem for page in reader.pages: for image in page.images: # 拼接成新文件名:PDF文件名_原图片名 new_image_name = f"{pdf_filename}_{image.name}" with open(new_image_name, "wb") as fp: fp.write(image.data)
比如处理名为report.pdf的文件时,提取的图片会变成report_im1.jp2、report_im2.jp2,这样下次处理其他PDF时就不会覆盖旧文件。
如果想把图片保存到指定目录,还可以结合路径:
# 比如保存到和PDF同目录下的images子文件夹 save_dir = pdfdirpath / "images" save_dir.mkdir(exist_ok=True) # 不存在就创建文件夹 new_image_path = save_dir / f"{pdf_filename}_{image.name}" with open(new_image_path, "wb") as fp: fp.write(image.data)
方法二:先保存再重命名
如果一定要先按原image.name保存,之后再重命名,可以用Path的rename()方法:
from PyPDF2 import PdfReader from pathlib import Path pdfdirpath = Path('C:/Users/...') pathlist = pdfdirpath.glob('*.pdf') for path in pathlist: reader = PdfReader(path) pdf_filename = path.stem for page in reader.pages: for image in page.images: # 先按原名字保存 temp_path = Path(image.name) with open(temp_path, "wb") as fp: fp.write(image.data) # 重命名为带PDF前缀的名字 new_path = Path(f"{pdf_filename}_{image.name}") temp_path.rename(new_path)
这种方法多了一步重命名操作,不如方法一直接高效,适合有特殊流程需求的场景。
内容的提问来源于stack exchange,提问作者user20880339
相关产品推荐
相关产品推荐

