在日常办公或数据处理中我们经常需要将多张图片如扫描件、截图、照片等合并为一个PDF文件方便分享或归档。虽然市面上有很多工具可以完成这一任务但通过Python脚本实现不仅灵活可控还能根据需求定制布局如横向/纵向、纸张大小等。本文将介绍如何使用Python的FPDF和Pillow库高效实现图片转PDF并支持中文参数和错误处理。一、核心功能需求在开发图片转PDF工具时通常需要满足以下需求多图合并支持将多张图片合并为一个PDF。自定义布局支持横向或纵向页面方向。支持标准纸张大小如A4、A3或自定义尺寸。图片自适应图片按比例缩放以适应页面避免变形。错误处理跳过损坏的图片保证程序稳定性。中文友好参数支持中文如“纵向”、“横向”。二、技术选型FPDF轻量级PDF生成库支持自定义页面尺寸和图片插入。PillowPIL图片处理库用于获取图片尺寸和格式转换。glob文件路径匹配方便批量读取图片。三、完整代码实现以下是支持中文参数、自定义布局和错误处理的完整代码importosimportglobfromfpdfimportFPDFfromPILimportImagedefimages_to_pdf_fpdf(image_paths,output_pdf_path,paper_sizeA4,# 纸张大小默认A4direction纵向# 布局方向默认纵向支持横向): 将多张图片合并为PDF支持自定义纸张大小和方向纵向/横向 参数: image_paths: 图片路径列表支持通配符如 *.jpg output_pdf_path: 输出PDF路径 paper_size: 纸张大小默认A4支持A3/Letter/Legal或自定义元组如(200, 300) direction: 布局方向默认纵向可选横向 # 定义标准纸张尺寸单位毫米paper_sizes{A4:(210,297),A3:(297,420),Letter:(215.9,279.4),Legal:(215.9,355.6),}# 校验纸张大小参数ifisinstance(paper_size,str):ifpaper_size.upper()inpaper_sizes:width_mm,height_mmpaper_sizes[paper_size.upper()]else:raiseValueError(f未知的纸张大小:{paper_size}。支持的值:{list(paper_sizes.keys())}或自定义元组如 (200, 300))elifisinstance(paper_size,(tuple,list))andlen(paper_size)2:width_mm,height_mmpaper_sizeelse:raiseValueError(paper_size 必须是预定义名称如 A4或 (width_mm, height_mm) 元组)# 校验方向参数directiondirection.lower()ifdirectionnotin[纵向,横向]:raiseValueError(direction 必须是 纵向 或 横向)# 根据方向调整宽高横向时交换宽高ifdirection横向:width_mm,height_mmheight_mm,width_mm# 创建 PDF 对象pdfFPDF(unitmm,format(width_mm,height_mm))# 直接传入宽高forimage_pathinimage_paths:try:# 打开图片并获取尺寸转换为毫米imgImage.open(image_path)img_width,img_heightimg.size img_width_mmimg_width*0.264583# 像素 → 毫米1像素 ≈ 0.264583毫米img_height_mmimg_height*0.264583# 计算缩放比例适应当前页面尺寸scale_widthwidth_mm/img_width_mm scale_heightheight_mm/img_height_mm scalemin(scale_width,scale_height)# 计算缩放后的图片尺寸new_width_mmimg_width_mm*scale new_height_mmimg_height_mm*scale# 添加页面并插入图片居中pdf.add_page()x(width_mm-new_width_mm)/2y(height_mm-new_height_mm)/2pdf.image(image_path,xx,yy,wnew_width_mm,hnew_height_mm)exceptExceptionase:print(f警告图片{image_path}处理失败跳过。错误:{e})# 保存 PDFpdf.output(output_pdf_path)print(fPDF 已生成{output_pdf_path})# 示例用法if__name____main__:# 获取所有JPG图片使用raw字符串避免转义image_pathsglob.glob(rE:\Python\learning\图片转PDF\img\*流水.jpg)output_pdf_path1-3月银行流水.pdf# 调用方式1默认A4纵向images_to_pdf_fpdf(image_paths,output_pdf_path)# 调用方式2A4横向images_to_pdf_fpdf(image_paths,output_pdf_path,paper_sizeA4,direction横向)# 调用方式3自定义纸张大小200x300毫米纵向images_to_pdf_fpdf(image_paths,output_pdf_path,paper_size(200,300),direction纵向)四、代码解析1. 纸张大小与方向处理标准纸张通过字典paper_sizes定义常见尺寸如A4、A3。自定义尺寸支持传入元组如(200, 300)。方向调整横向时交换宽高width_mm, height_mm height_mm, width_mm。2. 图片自适应缩放像素转毫米1像素 ≈ 0.264583毫米。缩放比例取宽高缩放比例的最小值确保图片完整显示。居中布局计算图片在页面中的偏移量x和y。3. 错误处理捕获单张图片处理时的异常如损坏图片打印警告并跳过。参数校验检查paper_size和direction的有效性。4. 中文参数支持将方向参数命名为direction接受纵向或横向。内部统一转换为小写direction.lower()避免大小写敏感问题。五、使用场景示例需求调用方式默认A4纵向images_to_pdf_fpdf(image_paths, output_pdf_path)A4横向images_to_pdf_fpdf(image_paths, output_pdf_path, direction横向)自定义200x300毫米纵向images_to_pdf_fpdf(image_paths, output_pdf_path, paper_size(200, 300), direction纵向)六、注意事项图片方向代码仅调整PDF页面方向不旋转图片内容。如果图片本身是横向的建议先用Pillow旋转图片如img.rotate(90)。路径问题使用glob.glob(r...)raw string避免Windows路径转义错误。性能优化对于大量图片可考虑添加进度条如tqdm库。七、总结通过Python实现图片转PDF不仅灵活高效还能满足个性化需求如自定义布局、错误处理等。本文的代码支持中文参数、标准/自定义纸张大小和横向/纵向布局适合办公自动化场景。你可以根据实际需求进一步扩展功能如添加水印、调整图片质量等。完整代码与示例已开源至GitHub点击查看示例链接需替换为实际仓库地址。希望这篇文章能帮助你轻松实现图片转PDF如果有任何问题或建议欢迎在评论区交流。