在日常办公过程中,你是否遇到过这样的情形,比如把一些合同、发票或证件,先拍照保存为图片,再通过软件转换为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库,若没有安装,可使用以下命令安装:- 修改代码中img_folder = r"E:\X公司合同"的文件夹路径。
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('.'):忽略隐藏文件,可以避免系统文件的干扰。
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
- 第4行取最小值作为最终缩放比例,保证图片完全显示在A4页面内。
- 第6-7行计算缩放后的图片大小。等比例缩放,图片不会变形。
- 第9行页面宽度减去图片宽度,除以2,实现水平居中。
- 第10行页面高度减去图片高度,除以2,做到垂直居中。
pdf_canvas.drawImage()pdf_canvas.showPage()
- 第1行pdf_canvas.drawImage()把图片画入当前页。
- 第2行pdf_canvas.showPage()提交当前页,并创建一个空白页。如果没有这句代码所有的图片会被画在同一页面上。
pdf_name = f"{folder.parts[-1]}.pdf" # 以文件夹命名PDF文件 pdf_save_path = folder / pdf_name # 拼接PDF保存路径
- 第1行folder.parts[-1]可以获取文件夹名称,以文件夹名称命名PDF文件。
- 第2行拼接路径,保存在原文件夹内,方便查找和管理。
如果本文对你有所帮助,欢迎收藏备用,下次需要转图片PDF,直接拿出来运行即可!