PDF 转 图片(python)

功能:批量将指定目录下的所有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}")
相关推荐
石牌桥网管2 小时前
正则表达式:匹配不包含指定字符串的文本
java·javascript·python·正则表达式·go·php
AC赳赳老秦2 小时前
DeepSeek助力云原生AI降本:容器化部署资源优化与算力利用率提升技巧
网络·python·django·prompt·tornado·ai-native·deepseek
卓越软件开发2 小时前
毕设全栈开发一条龙:Java/SpringBoot/Vue/ 小程序 / Python / 安卓 / AI 图像识别 人脸检测 车牌识别 YOLO
开发语言·spring boot·python·yolo·小程序·毕业设计·课程设计
甲枫叶2 小时前
【claude+weelinking产品经理系列15】UI/UX 打磨——产品经理的审美终于能自己实现
java·人工智能·python·ui·产品经理·ai编程·ux
geovindu2 小时前
python: Strategy Pattern
python·设计模式·策略模式
柒.梧.2 小时前
Java拷贝精讲:彻底分清浅拷贝与深拷贝
java·开发语言·python
少云清2 小时前
【UI自动化测试】3_PO模式 _封装思想
python·ui·po模式
lntu_ling5 小时前
Python-基于Haversine公式计算两点距离
开发语言·python·gis算法
哈里谢顿11 小时前
Django 应用 OOM(Out of Memory)故障的定位思路和排查方法
python·django