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

Python FPDF批量生成PDF时仅加载最后一张PNG图片问题

问题根因

代码存在两处核心错误:

  • 循环嵌套逻辑倒置:外层每生成1份PDF的循环内,又嵌套了遍历文件夹所有PNG的循环,所有图片会被依次插入到PDF的同一坐标位置,后插入的图片直接覆盖前一张,最终每份PDF只会显示最后一次插入的图片。
  • 图片路径不完整:os.listdir()仅返回文件名,不带上级文件夹路径,如果Python脚本的工作目录不是目标图片文件夹,会直接触发文件不存在的报错,当前能跑通属于特殊情况的巧合。
修正后可直接运行的代码
import pandas as pd
import os
from fpdf import FPDF

# 初始化基础数据
Data = {'Joint': [1, 2, 3, 4, 5], 'Cx': [0.4, 0.4, 0.5, 0.5, 0.5]}
PlanData = pd.DataFrame.from_dict(Data)

# 提前筛选目标文件夹下所有PNG文件
folder_dir = "C:/Users/LENOVO/Desktop/Tests"
png_list = [f for f in os.listdir(folder_dir) if f.lower().endswith(".png")]

# 前置校验,避免图片和PDF数量不匹配导致错配
if len(png_list) != len(PlanData):
    raise ValueError(f"PNG图片数量为{len(png_list)},需要生成的PDF数量为{len(PlanData)},二者不匹配,请检查文件夹内容")

# 逐份生成对应PDF
for idx, row_index in enumerate(PlanData.index):
    joint_num = PlanData['Joint'][row_index]
    pdf = FPDF(orientation='P', unit='mm', format='A4')
    pdf.add_page()
    pdf.set_font('Arial', 'b', 8.5)
    pdf.text(x=10, y=10, txt='Proyect:')
    
    # 仅插入当前PDF对应的单张图片,拼接完整文件路径
    target_img = os.path.join(folder_dir, png_list[idx])
    pdf.image(target_img, x=20, y=20, w=165, h=27.5)

    pdf.output(f'Doc{int(joint_num)}.pdf')
额外优化说明
  • 把图片遍历逻辑挪到生成PDF的循环外,避免每生成1份PDF就重复遍历一次文件夹,执行效率更高
  • 用os.path.join()拼接路径,自动适配Windows/macOS/Linux的路径分隔符规则,不会出现路径识别错误
  • 后缀判断加了.lower()转换,可兼容.PNG这类大写后缀的图片文件
  • 如果你的图片文件名和Joint编号有明确对应规则(比如命名为joint_1.png对应编号1),可以把当前按列表顺序匹配的逻辑,改成按文件名关键词匹配,彻底避免文件排序错乱导致的图片PDF错配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:15:39