如何通过For循环结合FPDF自动批量填充PDF中的PNG图片?
问题描述
我跟着一份Python教程生成了类似下图的PDF报告(布局为每页2列3行,共6张图片):
手动指定每张图片路径可以实现这个布局,代码如下:
pdf.add_page() pdf.image("/Users/Foo/Graph1.png", 5, 20, WIDTH/2-10) pdf.image("/Users/Foo/Graph2.png", WIDTH/2, 20, WIDTH/2-10) pdf.image("/Users/Foo/Graph3.png", 5, 110, WIDTH/2-10) pdf.image("/Users/Foo/Graph4.png", WIDTH/2, 110, WIDTH/2-10) pdf.image("/Users/Foo/Graph5.png", 5, 200, WIDTH/2-10) pdf.image("/Users/Foo/Graph6.png", WIDTH/2, 200, WIDTH/2-10)
但当文件夹中PNG文件数量不固定时,这段代码就不适用了。我写了一个函数框架,需要完善逻辑:
def addtopage(function): for f in os.listdir('path'): if f.endswith('png') in f: #add it to the next position in the pdf
我的问题是:如何编写循环,自动遍历文件夹获取所有PNG文件,并按上述布局依次放置到PDF页面对应位置?
解决方案
要实现自动按2列3行的布局批量插入图片,可按以下思路完善代码:
1. 核心逻辑梳理
- 先筛选出文件夹内所有PNG文件(兼容大小写)
- 按每页6张的批次处理,自动新增页面
- 复用你手动设定的坐标规则,按顺序给图片分配位置
2. 完整代码实现
import os # 定义PDF页面宽度(以A4纸为例,宽度为210mm) WIDTH = 210 def add_images_to_pdf(pdf, image_dir): # 获取所有PNG文件,按文件名排序保证顺序稳定 png_files = sorted([f for f in os.listdir(image_dir) if f.lower().endswith('.png')]) # 预定义每页6个图片的坐标位置,按顺序对应第1-6张图 page_positions = [ (5, 20), (WIDTH/2, 20), (5, 110), (WIDTH/2, 110), (5, 200), (WIDTH/2, 200) ] # 每6张图片为一组,生成一页PDF for start_idx in range(0, len(png_files), 6): pdf.add_page() # 取出当前页要放置的图片(最多6张) current_page_images = png_files[start_idx:start_idx+6] # 遍历当前页图片,按位置插入 for img_idx, img_name in enumerate(current_page_images): img_path = os.path.join(image_dir, img_name) x, y = page_positions[img_idx] pdf.image(img_path, x, y, WIDTH/2 - 10)
3. 使用示例
以fpdf2库为例,初始化PDF后调用函数即可:
from fpdf import FPDF # 初始化PDF对象 pdf = FPDF() # 调用函数,传入PDF对象和图片文件夹路径 add_images_to_pdf(pdf, "/Users/Foo/") # 保存生成的PDF pdf.output("auto_report.pdf")
内容的提问来源于stack exchange,提问作者Derek Fisher
相关产品推荐
相关产品推荐

