如何用Python高效批量生成含不同变量输入的PDF
批量生成带自定义变量与公司logo的PDF解决方案
一、修复你的FPDF代码问题
你的代码存在FPDF库使用错误与基础语法问题,以下是修复后的可运行版本:
from FPDF import FPDF # 营收增长数据,按需补充所有公司的数值 revenue_growth = { "company1": 5, # 示例:添加更多公司数据 "company2": 12, "company3": 8 } # 批量生成并保存PDF with open("company_names.txt", "r") as f: for company_name in f.readlines(): company_name = company_name.strip() # 去除换行符与首尾空白 if not company_name: continue # 跳过空行 # 初始化PDF实例 pdf = FPDF(orientation='P', unit='mm', format='A4') pdf.add_page() # 设置字体 pdf.set_font('helvetica', 'bold', 10) # 添加自定义变量内容(营收增长) # cell参数说明:w=0表示占满整行,ln=1表示输出后换行 pdf.cell(0, 10, f"公司名称:{company_name}", ln=1) pdf.cell(0, 10, f"本年度营收增长{revenue_growth[company_name]}%", ln=1) # 定位并添加底部logo page_height = pdf.h # 获取页面高度 logo_y = page_height - 20 # 距离页面底部20mm,按需调整 # image参数:x=横向位置,y=纵向位置,w=logo宽度(高度按比例自动缩放) pdf.image(f"logos/{company_name}.png", x=10, y=logo_y, w=30) # 直接保存PDF,避免占用大量内存 pdf.output(f"output/{company_name}_investor_report.pdf")
关键修复点:
- FPDF没有
add_text和add_picture方法,替换为原生的cell(结构化文本)和image(图片)方法; - 用
.strip()清理readlines()读取的换行符,避免公司名称带无效空白; - 给logo添加底部定位逻辑,确保所有PDF的logo位置统一;
- 生成一个PDF立即保存,而非存入列表,避免数千份PDF占用过多内存。
二、提升批量生成速度的优化方案
针对数千份PDF的生成需求,可通过以下方式大幅提升效率:
1. 多进程并行生成
PDF生成属于CPU密集型任务,利用多进程充分发挥多核CPU性能:
from FPDF import FPDF import multiprocessing revenue_growth = { "company1": 5, "company2": 12, # ... 其他公司数据 } def generate_single_pdf(company_name): company_name = company_name.strip() if not company_name or company_name not in revenue_growth: return pdf = FPDF(orientation='P', unit='mm', format='A4') pdf.add_page() pdf.set_font('helvetica', 'bold', 10) pdf.cell(0, 10, f"公司名称:{company_name}", ln=1) pdf.cell(0, 10, f"本年度营收增长{revenue_growth[company_name]}%", ln=1) page_height = pdf.h logo_y = page_height - 20 pdf.image(f"logos/{company_name}.png", x=10, y=logo_y, w=30) pdf.output(f"output/{company_name}_investor_report.pdf") if __name__ == "__main__": # 读取并整理公司列表 with open("company_names.txt", "r") as f: company_list = [line.strip() for line in f.readlines() if line.strip()] # 启动多进程池,进程数设为CPU核心数 with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool: pool.map(generate_single_pdf, company_list)
2. 预加载固定资源
如果所有公司logo尺寸统一,可提前获取logo的宽高,避免每次调用image时重复计算尺寸;若使用自定义字体,提前加载一次而非每个PDF实例都加载。
3. 模板复用(进阶)
若PDF模板有大量固定内容(如页眉、通用条款),可先生成一份基础模板PDF,再用PyPDF2加载模板,添加自定义变量和logo后保存,减少重复渲染固定内容的时间。
内容的提问来源于stack exchange,提问作者juanpethes
相关产品推荐
相关产品推荐

