功能:批量将指定目录下的所有PDF转为高分辨率图片
图片名格式:PDF原名_6位随机字母数字.png
python
import os
import time
import random
import string
import fitz # PyMuPDF,需提前安装:pip install pymupdf
def pdf_to_image_and_ndarray(
pdf_input_dir, output_img_dir="pdf_output", zoom_factor=3.0
):
"""
批量将指定目录下的所有PDF转为高分辨率图片,图片名格式:PDF原名_6位随机字母数字.png
自动遍历输入目录下的PDF文件(不递归子目录),逐个转换
:param pdf_input_dir: PDF文件所在的输入目录(必传)
:param output_img_dir: 图片输出目录,默认pdf_output
:param zoom_factor: 分辨率缩放因子(>1.0提升清晰度,<1.0降低清晰度),默认3.0
:return: 所有生成图片的绝对路径列表
"""
start_time = time.time()
all_img_path_list = [] # 存储所有生成的图片路径
# 1. 校验输入目录是否存在
if not os.path.isdir(pdf_input_dir):
raise NotADirectoryError(f"输入的PDF目录不存在或不是有效目录:{pdf_input_dir}")
# 2. 创建输出目录(不存在则创建,存在则不报错)
os.makedirs(output_img_dir, exist_ok=True)
# 3. 遍历输入目录,筛选所有PDF文件(不递归子目录)
# 过滤规则:文件+后缀为.pdf/.PDF
pdf_file_list = [
file
for file in os.listdir(pdf_input_dir)
if os.path.isfile(os.path.join(pdf_input_dir, file))
and file.lower().endswith(".pdf")
]
if not pdf_file_list:
print(f"警告:输入目录{pdf_input_dir}下未找到任何PDF文件")
return all_img_path_list
print(f"共找到{len(pdf_file_list)}个PDF文件,开始批量转换...")
# 4. 逐个处理PDF文件
for pdf_filename in pdf_file_list:
# 拼接PDF完整路径
pdf_full_path = os.path.join(pdf_input_dir, pdf_filename)
# 提取PDF纯文件名(不含路径和后缀),用于生成图片名
pdf_basename = os.path.splitext(pdf_filename)[0]
try:
# 打开PDF文档
pdf_doc = fitz.open(pdf_full_path)
# 遍历PDF的每一页
for page_index in range(len(pdf_doc)):
page = pdf_doc[page_index]
# 定义缩放矩阵(高分辨率)
zoom_matrix = fitz.Matrix(zoom_factor, zoom_factor)
# 获取页面像素图
pixmap = page.get_pixmap(matrix=zoom_matrix)
# 生成6位随机字母数字组合(大小写+数字)
random_suffix = "".join(
random.sample(string.ascii_letters + string.digits, 6)
)
# 拼接图片名:PDF原名_6位随机串.png
img_filename = f"{pdf_basename}_{random_suffix}.png"
# 拼接图片保存完整路径
img_save_path = os.path.join(output_img_dir, img_filename)
# 保存图片并记录路径
pixmap.save(img_save_path)
all_img_path_list.append(img_save_path)
# 获取页数后再关闭PDF文档
page_count = len(pdf_doc)
# 关闭PDF文档,释放资源
pdf_doc.close()
print(f"成功转换:{pdf_filename}(共{page_count}页)")
except Exception as e:
print(f"转换失败:{pdf_filename},错误信息:{str(e)}")
continue
# 计算运行时间
run_time = time.time() - start_time
print(f"\n批量转换完成!总耗时:{run_time:.6f} 秒 / {run_time * 1000:.3f} 毫秒")
print(
f"共生成{len(all_img_path_list)}张图片,输出目录:{os.path.abspath(output_img_dir)}"
)
return all_img_path_list
# 测试调用示例
if __name__ == "__main__":
# 替换为你的PDF实际所在目录
PDF_INPUT_DIR = r"E:\xxx\input"
# 替换为你的图片输出目录(可选,默认pdf_output)
OUTPUT_IMG_DIR = r"E:\xxx\output"
# 调用函数
result = pdf_to_image_and_ndarray(
pdf_input_dir=PDF_INPUT_DIR, output_img_dir=OUTPUT_IMG_DIR, zoom_factor=3.0
)
# 打印所有生成的图片路径
for img_path in result:
print(f"生成图片:{img_path}")