如何用Python将PDF、图片等多格式文件合并为单个PDF?
解决方法
你的错误根源在于pdfsort函数的返回值类型不统一:处理PDF时返回的是PIL Image对象列表,处理图片时返回的是文件名字符串,而Image.open()只能接收路径或类文件对象,无法处理列表,因此报错。
正确的思路是统一输出格式:让每个文件都转换成PIL Image对象的列表(PDF的每一页对应一个Image,单张图片对应只有一个元素的列表),再把所有列表合并成一个大的Image集合,最后保存为单个PDF。
修正后的代码
from PIL import Image from pdf2image import convert_from_path import os def file_to_images(file_path): # 处理PDF文件:将每一页转为Image对象,返回列表 if file_path.lower().endswith(".pdf"): # 若poppler未配置环境变量,需指定poppler_path参数,例如convert_from_path(file_path, poppler_path=r"C:\poppler\bin") return convert_from_path(file_path) # 处理图片文件:返回包含单个Image对象的列表 else: return [Image.open(file_path)] # 收集所有文件对应的Image对象 all_images = [] file_list = ["file1.jpg", "file2.pdf", "file3.jpg"] base_dir = "dir" for f in file_list: full_path = os.path.join(base_dir, f) all_images.extend(file_to_images(full_path)) # 将所有图片合并为单个PDF if all_images: # 用第一张图片作为基础,保存所有图片为PDF all_images[0].save( "merged_output.pdf", save_all=True, append_images=all_images[1:], resolution=100 # 可调整PDF分辨率 )
注意事项
pdf2image依赖poppler工具:- Linux系统:通过包管理器安装
poppler-utils(例如sudo apt install poppler-utils) - Windows系统:需下载poppler二进制包,解压后在
convert_from_path中指定poppler_path参数,指向poppler的bin目录
- Linux系统:通过包管理器安装
- 用
os.path.join拼接路径可以避免不同系统下路径分隔符的问题,更稳妥
内容的提问来源于stack exchange,提问作者user2895444
相关产品推荐
相关产品推荐

