使用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")
关键修改点
- 移除初始的
pdf.add_page():改为在每次循环开始时添加新页面,确保每条数据单独占一页。 - 用
zip()并行遍历:把fetch中的数据和imagefiles中的图片一一配对,循环只会执行2次,正好生成你需要的2页PDF。 - 可选:关闭自动分页:如果你的单条内容不会超过一页高度,关闭自动分页可以避免意外生成多余页面。
额外提示
- 确保
fetch的长度和imagefiles的长度一致,否则会有部分数据或图片无法被匹配使用。 - 如果后续数据量变大,可以考虑用
enumerate来处理索引,或者添加异常处理避免因长度不匹配报错。
内容的提问来源于stack exchange,提问作者drealfestus
相关产品推荐
相关产品推荐

