资讯动态

Python实现图片转PDF与多图合并的完整指南

发布时间:2026/10/14 9:57:52 来源:尧图企业网站定制
1. 项目概述在日常办公和学习中我们经常需要将图片文件如JPG、PNG等转换为PDF格式或者将多张图片合并成一个PDF文档。这种需求在提交电子版材料、整理扫描件或制作电子相册时尤为常见。Python作为一门强大的编程语言可以轻松实现这一功能。本文将详细介绍如何使用Python将JPG/PNG图片转换为PDF文件并实现多张图片合并为一个PDF的功能。这个方案特别适合需要批量处理图片的场景比如将手机拍摄的文档照片转换为PDF合并多个扫描件为一个PDF文件制作电子相册或产品图册自动化处理大量图片文件2. 核心工具与原理2.1 主要依赖库实现图片转PDF功能主要依赖以下Python库PillowPython图像处理的标准库用于读取和处理图片文件reportlab专业的PDF生成库可以创建和修改PDF文档img2pdf专门用于图片转PDF的轻量级库提示在实际项目中我们通常会优先使用img2pdf库因为它专为此功能设计API简单高效且生成的PDF文件质量更好。2.2 技术原理图片转PDF的核心原理是读取图片文件的二进制数据将图片数据按照PDF格式规范进行编码添加必要的PDF文档结构信息如页面尺寸、元数据等将处理后的数据写入PDF文件对于多图合并创建一个新的PDF文档对象按顺序将每张图片添加为单独的页面统一设置页面尺寸通常以第一张图片或最大图片的尺寸为准保存最终的PDF文档3. 环境准备与安装3.1 Python环境要求Python 3.6或更高版本pip包管理工具3.2 安装依赖库在命令行中执行以下命令安装所需库pip install pillow reportlab img2pdf3.3 验证安装创建一个测试脚本验证库是否安装成功import PIL import reportlab import img2pdf print(所有依赖库已成功安装)如果没有报错说明环境配置正确。4. 单张图片转PDF实现4.1 使用img2pdf库这是最简单高效的方法import img2pdf def convert_image_to_pdf(input_image, output_pdf): 将单张图片转换为PDF文件 :param input_image: 输入图片路径 :param output_pdf: 输出PDF路径 with open(output_pdf, wb) as f: f.write(img2pdf.convert(input_image))使用示例convert_image_to_pdf(example.jpg, output.pdf)4.2 使用Pillow和reportlab如果需要更多控制可以使用以下方法from PIL import Image from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter def convert_with_reportlab(input_image, output_pdf): img Image.open(input_image) width, height img.size # 创建PDF画布 c canvas.Canvas(output_pdf, pagesize(width, height)) # 将图片绘制到PDF页面 c.drawImage(input_image, 0, 0, width, height) c.showPage() c.save()5. 多图合并为PDF实现5.1 使用img2pdf合并多图import img2pdf import os def merge_images_to_pdf(image_folder, output_pdf): 将文件夹中的所有图片合并为一个PDF :param image_folder: 图片文件夹路径 :param output_pdf: 输出PDF路径 # 获取文件夹中所有图片文件 images [os.path.join(image_folder, f) for f in os.listdir(image_folder) if f.lower().endswith((.jpg, .jpeg, .png))] # 按文件名排序 images.sort() with open(output_pdf, wb) as f: f.write(img2pdf.convert(images))5.2 自定义页面尺寸和排序如果需要控制页面尺寸或自定义排序from PIL import Image import img2pdf def merge_with_custom_size(images, output_pdf, page_sizeNone): 合并图片并自定义页面尺寸 :param images: 图片路径列表 :param output_pdf: 输出PDF路径 :param page_size: 指定页面尺寸如A4 # 设置布局函数控制图片在页面中的布局 layout_fun img2pdf.get_layout_fun( pagesizeimg2pdf.get_fit_dims(page_size) if page_size else None ) with open(output_pdf, wb) as f: f.write(img2pdf.convert(images, layout_funlayout_fun))6. 高级功能实现6.1 添加PDF元数据import img2pdf def convert_with_metadata(input_image, output_pdf, title, author): 转换图片并添加PDF元数据 pdf_bytes img2pdf.convert( input_image, producerimg2pdf, creatorPython Script, titletitle, authorauthor ) with open(output_pdf, wb) as f: f.write(pdf_bytes)6.2 图片预处理在转换前对图片进行处理如调整大小、旋转等from PIL import Image import img2pdf def preprocess_and_convert(input_image, output_pdf): # 打开图片 img Image.open(input_image) # 图片预处理 img img.rotate(90) # 旋转90度 img img.resize((800, 600)) # 调整尺寸 # 保存临时文件 temp_path temp.jpg img.save(temp_path) # 转换为PDF with open(output_pdf, wb) as f: f.write(img2pdf.convert(temp_path)) # 删除临时文件 os.remove(temp_path)7. 常见问题与解决方案7.1 图片尺寸不一致问题问题描述当合并多张尺寸不同的图片时PDF页面大小不一致。解决方案统一设置固定页面尺寸按最大图片尺寸设置页面保持原始图片比例自动调整def merge_with_uniform_size(images, output_pdf): # 获取所有图片尺寸 sizes [] for img_path in images: with Image.open(img_path) as img: sizes.append(img.size) # 计算最大宽度和高度 max_width max(s[0] for s in sizes) max_height max(s[1] for s in sizes) # 设置布局函数 layout_fun img2pdf.get_layout_fun((max_width, max_height)) with open(output_pdf, wb) as f: f.write(img2pdf.convert(images, layout_funlayout_fun))7.2 图片方向错误问题问题描述某些图片在PDF中显示方向不正确。解决方案读取图片的EXIF信息获取方向根据方向自动旋转图片from PIL import Image, ImageOps def auto_rotate_image(image_path): img Image.open(image_path) try: # 获取EXIF信息中的方向标签 exif img._getexif() orientation exif.get(0x0112) # 根据方向值旋转图片 if orientation 3: img img.rotate(180, expandTrue) elif orientation 6: img img.rotate(270, expandTrue) elif orientation 8: img img.rotate(90, expandTrue) except (AttributeError, KeyError): pass return img7.3 大图片处理问题问题描述处理高分辨率图片时内存不足或速度慢。解决方案对大图片进行适当压缩分块处理图片def compress_image(input_path, output_path, quality85): img Image.open(input_path) img.save(output_path, qualityquality, optimizeTrue)8. 性能优化与批量处理8.1 多线程批量处理对于大量图片可以使用多线程提高处理速度import concurrent.futures def batch_convert(image_paths, output_dir, threads4): 批量转换图片为PDF :param image_paths: 图片路径列表 :param output_dir: 输出目录 :param threads: 线程数 def convert_single(img_path): output_path os.path.join( output_dir, os.path.splitext(os.path.basename(img_path))[0] .pdf ) convert_image_to_pdf(img_path, output_path) with concurrent.futures.ThreadPoolExecutor(max_workersthreads) as executor: executor.map(convert_single, image_paths)8.2 内存优化处理超大图片时可以使用流式处理def convert_large_image(input_path, output_path): # 分块读取和处理图片 img Image.open(input_path) width, height img.size # 设置合适的块大小 tile_size 1024 for y in range(0, height, tile_size): for x in range(0, width, tile_size): box (x, y, min(xtile_size, width), min(ytile_size, height)) tile img.crop(box) # 处理图片块...9. 完整示例代码下面是一个完整的命令行工具实现支持单图转换、多图合并和批量处理import os import argparse import img2pdf from PIL import Image def convert_image_to_pdf(input_path, output_path): 单图转PDF with open(output_path, wb) as f: f.write(img2pdf.convert(input_path)) def merge_images_to_pdf(input_paths, output_path): 多图合并为PDF with open(output_path, wb) as f: f.write(img2pdf.convert(input_paths)) def process_directory(input_dir, output_dir): 批量处理目录中的图片 if not os.path.exists(output_dir): os.makedirs(output_dir) images [] for filename in os.listdir(input_dir): if filename.lower().endswith((.jpg, .jpeg, .png)): images.append(os.path.join(input_dir, filename)) if not images: print(未找到图片文件) return if len(images) 1: # 单图转换 output_path os.path.join( output_dir, os.path.splitext(os.path.basename(images[0]))[0] .pdf ) convert_image_to_pdf(images[0], output_path) else: # 多图合并 output_path os.path.join(output_dir, merged.pdf) merge_images_to_pdf(images, output_path) def main(): parser argparse.ArgumentParser(description图片转PDF工具) parser.add_argument(input, help输入文件或目录) parser.add_argument(-o, --output, help输出文件或目录) args parser.parse_args() if os.path.isfile(args.input): # 单文件处理 if not args.output: args.output os.path.splitext(args.input)[0] .pdf convert_image_to_pdf(args.input, args.output) elif os.path.isdir(args.input): # 目录处理 if not args.output: args.output os.path.join(args.input, output) process_directory(args.input, args.output) else: print(无效的输入路径) if __name__ __main__: main()使用方式# 单图转换 python img2pdf.py input.jpg -o output.pdf # 多图合并自动处理目录中所有图片 python img2pdf.py images_folder -o output_folder10. 实际应用中的经验分享在实际项目中我总结了以下几点经验图片质量与PDF大小的平衡对于文档类图片适当降低质量可以显著减小PDF体积对于照片类图片保持较高质量但可以考虑调整尺寸文件名排序技巧使用自然排序(natural sort)处理包含数字的文件名可以添加前缀数字确保排序正确如01_xxx.jpg, 02_xxx.jpg异常处理添加对损坏图片文件的检测和处理对权限问题、磁盘空间不足等情况进行友好提示进度反馈对于批量处理添加进度条显示处理进度可以使用tqdm库实现简单的进度条跨平台考虑处理文件路径时使用os.path保证跨平台兼容性注意不同系统对文件名大小写的敏感性差异一个更健壮的实现应该包含日志记录、错误处理和用户反馈机制。在实际部署时可以考虑将这些功能封装为Web服务或桌面应用提供更友好的用户界面。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑