当前位置:首页>python>没有会员也能转,手把手教你用Python把图片转换为PDF,零门槛,自动排版,告别手动拼接!

没有会员也能转,手把手教你用Python把图片转换为PDF,零门槛,自动排版,告别手动拼接!

  • 2026-10-11 08:41:22
没有会员也能转,手把手教你用Python把图片转换为PDF,零门槛,自动排版,告别手动拼接!
在日常办公过程中,你是否遇到过这样的情形,比如把一些合同、发票或证件,先拍照保存为图片,再通过软件转换为PDF格式。
你是不是新建一个Word文档,再一张张插入图片,调整大小,最后再另存为PDF?或者用在线工具转换,也或者购买WPS会员,直接批量合并转换来完成。
今天给大家分享一段纯本地运行、无风险依赖的Python代码,无需安装复杂的软件,直接复制就能用,代码会自动把文件夹里所有的图片一键转换为规范的PDF,图片自动适应大小,居中对齐。
先来看完整代码:
from pathlib import Pathfrom reportlab.lib.pagesizes import A4  # 导入A4尺寸from reportlab.pdfgen import canvas  # 导入PDF生成核心类from reportlab.lib.utils import ImageReader  # 导入图片读取工具def images_to_pdf(folder_path):    folder = Path(folder_path)    formats = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')    # 获取文件夹内所有图片文件    image_files = [        img_path for img_path in folder.glob('*.*')        if img_path.suffix.lower() in formats  # 过滤图片格式        and not img_path.name.startswith('.')  # 忽略隐藏文件(如.thumbs.db)    ]    if not image_files:        print("错误:指定文件夹内未找到任何支持的图片文件!")        return None    image_files.sort()      # 按文件名排序    print(f"成功找到 {len(image_files)} 张图片,开始转换为PDF...")    # 定义PDF相关参数(A4尺寸:宽210mm,高297mm,ReportLab默认单位为点pt,1mm≈2.8346pt)    a4_width, a4_height = A4  # A4尺寸(595.28pt, 841.89pt)    pdf_name = f"{folder.parts[-1]}.pdf"  # 以文件夹名称命名PDF文件    pdf_save_path = folder / pdf_name  # 拼接PDF保存路径    # 创建PDF画布(指定保存路径和页面尺寸为A4,需转换为字符串路径)    pdf_canvas = canvas.Canvas(str(pdf_save_path), pagesize=A4)    # 逐页添加到PDF    for img_path in image_files:        try:            # 读取图片            img = ImageReader(img_path)            # 获取图片原始尺寸(宽、高,单位:pt)            img_width, img_height = img.getSize()            # 计算缩放比例(取宽、高缩放比例的最小值,保证图片能完整显示在A4内)            scale_ratio = min(a4_width / img_width, a4_height / img_height)            # 计算缩放后的图片尺寸            scaled_width = img_width * scale_ratio            scaled_height = img_height * scale_ratio            # 计算图片居中位置(A4页面中心坐标减去图片缩放后尺寸的一半)            x = (a4_width - scaled_width) / 2            y = (a4_height - scaled_height) / 2            # 将图片绘制到PDF页面(指定位置和缩放后的尺寸)            pdf_canvas.drawImage(                image=img,                x=x, y=y,                width=scaled_width, height=scaled_height,                preserveAspectRatio=True  # 强制保持图片宽高比            )            # 结束当前页面,准备下一页            pdf_canvas.showPage()            print(f"已处理:{img_path.name}")        except Exception as e:            print(f"处理图片 {img_path.name} 失败:{str(e)}")            continue    # 保存PDF文件    pdf_canvas.save()    print(f"\n转换完成!PDF文件已保存至:\n{pdf_save_path}")    return pdf_save_path# 主程序if __name__ == "__main__":    img_folder = r"E:\X公司合同"      # 路径    folder = Path(img_folder)    if folder.is_dir():        images_to_pdf(folder)    else:        print(f"错误:文件夹路径不存在!请检查路径:{img_folder}")
再来看运行效果。运行代码将5张合同页的图片合并为一个PDF效果如下图:
下面再来说一下代码使用和解析。
代码运行依赖reportlab库,若没有安装,可使用以下命令安装:
pip install reportlab
代码使用方法
  1. 把所有需要转换为图片放进一个文件夹。
  2. 修改代码中img_folder = r"E:\X公司合同"的文件夹路径。
  3. 运行代码,等待完成即可生成PDF。
代码解析
1、路径和文件筛选
    folder = Path(folder_path)    formats = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')    # 获取文件夹内所有图片文件    image_files = [        img_path for img_path in folder.glob('*.*')        if img_path.suffix.lower() in formats  # 过滤图片格式        and not img_path.name.startswith('.')  # 忽略隐藏文件(如.thumbs.db)    ]
  • formats = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')是图片的后缀名集合,可根据实际添加。

  • folder.glob('*.*')可以获取文件夹内所有文件。
  • if img_path.suffix.lower() in formats:仅保留图片格式文件。
  • not img_path.name.startswith('.'):忽略隐藏文件,可以避免系统文件的干扰。
2、图片自动居中并适应页面
    a4_width, a4_height = A4  # A4尺寸(595.28pt, 841.89pt)    img_width, img_height = img.getSize()     # 计算缩放比例(取宽、高缩放比例的最小值,保证图片能完整显示在A4内)    scale_ratio = min(a4_width / img_width, a4_height / img_height)    # 计算缩放后的图片尺寸    scaled_width = img_width * scale_ratio    scaled_height = img_height * scale_ratio    # 计算图片居中位置(A4页面中心坐标减去图片缩放后尺寸的一半)    x = (a4_width - scaled_width) / 2    y = (a4_height - scaled_height) / 2
  • 第1行获取A4纸张的宽度和高度。
  • 第2行获取图片的宽度和高度。
  • 第4行取最小值作为最终缩放比例,保证图片完全显示在A4页面内。
  • 第6-7行计算缩放后的图片大小。等比例缩放,图片不会变形。
  • 第9行页面宽度减去图片宽度,除以2,实现水平居中。
  • 第10行页面高度减去图片高度,除以2,做到垂直居中。
3、写入PDF
pdf_canvas.drawImage()pdf_canvas.showPage()
  • 第1行pdf_canvas.drawImage()把图片画入当前页。
  • 第2行pdf_canvas.showPage()提交当前页,并创建一个空白页。如果没有这句代码所有的图片会被画在同一页面上。
4、自动命名并保存
    pdf_name = f"{folder.parts[-1]}.pdf"  # 以文件夹命名PDF文件    pdf_save_path = folder / pdf_name  # 拼接PDF保存路径
  • 第1行folder.parts[-1]可以获取文件夹名称,以文件夹名称命名PDF文件。
  • 第2行拼接路径,保存在原文件夹内,方便查找和管理。
下面是tkinter版的小工具:
如果本文对你有所帮助,欢迎收藏备用,下次需要转图片PDF,直接拿出来运行即可!

最新文章

随机文章