You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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目录
  • 用os.path.join拼接路径可以避免不同系统下路径分隔符的问题,更稳妥

内容的提问来源于stack exchange,提问作者user2895444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:52:08