pypdf FreeText注释字体配置不生效问题求助
问题排查与解决方案
核心问题原因
pypdf的FreeText注释依赖PDF阅读器渲染,多数字体、字号、颜色参数会被阅读器忽略,导致配置不生效;同时参数格式错误、字体名称不匹配也会引发异常。
具体解决步骤
- 升级pypdf到最新版本
旧版本pypdf在FreeText注释的参数处理上存在bug,执行命令升级:
pip install --upgrade pypdf
- 修正参数格式
- 字体颜色
font_color需使用带#的十六进制值(如#000000)或RGB元组(如(0,0,0)),而非纯十六进制字符串; - 字号
font_size直接传入数字(如20)即可,无需带pt后缀。
修正后的FreeText代码示例:
pageno = FreeText( text=numberstring, rect=(box.width - 60, box.height - 60, box.width - 20, box.height - 20), font="Arial", bold=True, italic=False, font_size=20, font_color="#000000", border_color="#0000ff", background_color=None, ) writer.add_annotation(page_number=0, annotation=pageno)
确认字体名称正确性
Ubuntu系统中字体名称可能与预期不符,执行fc-list命令查看系统已安装字体的准确名称(比如Arial的正确名称可能是Arial,MT),替换代码中font参数的对应值。更可靠的替代方案:直接绘制文本
如果FreeText注释仍无法满足需求,改用PageObject.add_text()方法直接在页面上绘制文本,该方式不依赖阅读器渲染,字体配置更稳定:
from pypdf import PdfReader, PdfWriter reader = PdfReader("原始试卷.pdf") for num in range(100, 200): # 生成100-199的3位编号 writer = PdfWriter() page = reader.pages[0] # 在右上角添加编号 page.add_text( text=str(num).zfill(3), x=page.mediabox.width - 60, y=page.mediabox.height - 60, font_size=20, font_name="Arial", font_color=(0, 0, 0), bold=True ) writer.add_page(page) with open(f"试卷_{num}.pdf", "wb") as f: writer.write(f)
内容的提问来源于stack exchange,提问作者user808856
相关产品推荐
相关产品推荐

