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

使用FPDF库结合SQLite生成PDF时循环异常导致页面重复问题求助

解决FPDF生成重复页面的问题

我一眼就看出问题所在啦!你现在的嵌套for循环是导致重复页面的核心原因:

你外层循环遍历imagefiles(2张图片),内层又循环range(0,2)(2条数据),这样总共会执行 2×2=4次 内容输出逻辑。每次输出都会在当前页面添加内容,当内容超过页面高度触发自动分页后,就生成了4页重复的内容。

修复方案

假设你的imagefiles里的图片和fetch中的数据是一一对应的(第一条数据用第一张图,第二条用第二张图),我们可以把嵌套循环改成并行遍历,同时控制分页:

修改后的完整代码:

import sqlite3
from datetime import datetime
from fpdf import FPDF

conn = sqlite3.connect('delegates_cert.db')
cursor = conn.cursor()
cursor.execute('''SELECT marine_data.Cert_no, marine_data.Surname, marine_data.First_name, marine_data.Other_names, marine_data.Birthday, marine_data.Course_end_date, marine_data.Expiry_date, setup.course, setup.course_description FROM marine_data INNER JOIN setup ON marine_data.Course=setup.course WHERE marine_data.Course_code = 'CM01' ''')
fetch = cursor.fetchall()
imagefiles = ["0.png","1.png"]

pdf = FPDF('P', 'mm', 'A5')
pdf.set_font('helvetica', '', 10)
# 如果你手动控制分页,可以关闭自动分页避免意外新增页面
# pdf.set_auto_page_break(auto = False, margin = 10)

# 并行遍历数据和对应的图片,确保一一对应
for data, img in zip(fetch, imagefiles):
    pdf.add_page()  # 每条数据对应新的一页
    
    pdf.set_font('helvetica', '', 10)
    pdf.cell(0, 63, " "*90+data[0].center(28, " "), ln = True )
    pdf.set_font('helvetica', 'B', 14)
    pdf.cell(0, 12, (data[1]+" "+data[2]+" "+data[3]).center(50, " "), ln = True )
    pdf.set_font('helvetica', 'B', 13)
    pdf.cell(0, 13, " "*17+datetime.strptime(data[4],"%Y-%m-%d").strftime("%d-%m-%Y").center(50, " "), ln = True )
    pdf.cell(0, 23, data[7], align = "C", ln = True )
    pdf.set_font('helvetica', 'I', 9)
    pdf.multi_cell(0, 5, data[8], ln = True, align = "C" )
    pdf.set_font('helvetica', 'B', 9)
    pdf.cell(0, 4, data[5].center(20, " ")+" "*90+data[6].center(10, " "), align = "L", ln = True )
    pdf.image(img,117,74,24,24)

# 最后别忘保存生成的PDF
pdf.output("certificates.pdf")

关键修改点

  1. 移除初始的pdf.add_page():改为在每次循环开始时添加新页面,确保每条数据单独占一页。
  2. 用zip()并行遍历:把fetch中的数据和imagefiles中的图片一一配对,循环只会执行2次,正好生成你需要的2页PDF。
  3. 可选:关闭自动分页:如果你的单条内容不会超过一页高度,关闭自动分页可以避免意外生成多余页面。

额外提示

  • 确保fetch的长度和imagefiles的长度一致,否则会有部分数据或图片无法被匹配使用。
  • 如果后续数据量变大,可以考虑用enumerate来处理索引,或者添加异常处理避免因长度不匹配报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:32:45