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

如何将FPDF生成的PDF文本叠加至PDF模板单页,而非合并为两页?

解决PDF模板叠加文本及PyPDF2导入问题

问题分析

  1. 生成两页PDF的原因:你用PdfFileMerger.append(template)先添加了模板页,再通过merge(0, profile_pdf)把FPDF生成的带文本PDF页合并到第0页位置,等于同时保留了模板页和文本页,最终输出两页。正确逻辑应该是把文本内容叠加到模板页面上,而非合并两个独立页面。
  2. 找不到PyPDF2.pdf的错误:PyPDF2版本迭代后API和模块结构发生变化,旧版本中的PyPDF2.pdf模块已调整,同时PdfFileMerger也被PdfMerger替代,旧代码适配性不足导致报错。

解决方案

方法一:直接在模板页面添加文本(推荐)

跳过生成临时PDF的步骤,直接读取模板并在指定位置添加文本:

# work in jupyter
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.generic import TextStringObject, NameObject, DictionaryObject, NumberObject

# 读取模板PDF
reader = PdfReader(template_path)
page = reader.pages[0]  # 取模板第一页

# 定义文本参数
text_dict = DictionaryObject()
text_dict.update({
    NameObject("/Type"): NameObject("/Annot"),
    NameObject("/Subtype"): NameObject("/Text"),
    NameObject("/Contents"): TextStringObject("Edi Graovac!"),
    # 文本位置:左下x, 左下y, 右上x, 右上y,可根据需求调整
    NameObject("/Rect"): [NumberObject(50), NumberObject(200), NumberObject(200), NumberObject(220)],
    NameObject("/Font"): DictionaryObject({
        NameObject("/Type"): NameObject("/Font"),
        NameObject("/Subtype"): NameObject("/Type1"),
        NameObject("/BaseFont"): NameObject("/Helvetica-Bold"),
        NameObject("/Encoding"): NameObject("/WinAnsiEncoding")
    }),
    NameObject("/F"): NumberObject(4),  # 设置注释可见
    NameObject("/Border"): [NumberObject(0), NumberObject(0), NumberObject(0)]  # 去掉文本边框
})

# 将文本添加到页面
if "/Annots" in page:
    page["/Annots"].append(text_dict)
else:
    page[NameObject("/Annots")] = [text_dict]

# 保存修改后的PDF
writer = PdfWriter()
writer.add_page(page)
with open(save_path, "wb") as output_file:
    writer.write(output_file)

方法二:修复叠加逻辑(基于FPDF生成文本页)

如果坚持用FPDF生成文本页,可通过PageObject的merge_page实现页面叠加,而非文件合并:

# work in jupyter
from fpdf import FPDF
from PyPDF2 import PdfReader, PdfWriter

# 生成带文本的临时PDF,注意调整cell参数避免超出页面范围
profile = FPDF()
profile.add_page()
profile.set_font('Arial', 'B', 16)
profile.cell(50, 20, 'Edi Graovac!')
profile.output("temp.pdf", 'F')

# 读取模板和临时PDF
template_reader = PdfReader(template_path)
temp_reader = PdfReader("temp.pdf")

# 获取对应页面并叠加
template_page = template_reader.pages[0]
text_page = temp_reader.pages[0]
template_page.merge_page(text_page)

# 保存结果
writer = PdfWriter()
writer.add_page(template_page)
with open(save_path, "wb") as output_file:
    writer.write(output_file)

PyPDF2版本适配注意事项

  • 安装最新版PyPDF2:pip install --upgrade PyPDF2
  • 新版本中PdfFileMerger已被PdfMerger替代,旧代码中引用PyPDF2.pdf的部分需替换为PyPDF2.generic等对应新模块。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:25:24