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
相关产品推荐
相关产品推荐

