如何将FPDF生成的PDF文本叠加至PDF模板单页,而非合并为两页?
解决PDF模板叠加文本及PyPDF2导入问题
问题分析
- 生成两页PDF的原因:你用
PdfFileMerger.append(template)先添加了模板页,再通过merge(0, profile_pdf)把FPDF生成的带文本PDF页合并到第0页位置,等于同时保留了模板页和文本页,最终输出两页。正确逻辑应该是把文本内容叠加到模板页面上,而非合并两个独立页面。 - 找不到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
相关产品推荐
相关产品推荐

