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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:13:17