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

pypdf FreeText注释字体配置不生效问题求助

问题排查与解决方案

核心问题原因

pypdf的FreeText注释依赖PDF阅读器渲染,多数字体、字号、颜色参数会被阅读器忽略,导致配置不生效;同时参数格式错误、字体名称不匹配也会引发异常。

具体解决步骤

  1. 升级pypdf到最新版本
    旧版本pypdf在FreeText注释的参数处理上存在bug,执行命令升级:
pip install --upgrade pypdf
  1. 修正参数格式
  • 字体颜色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)
  1. 确认字体名称正确性
    Ubuntu系统中字体名称可能与预期不符,执行fc-list命令查看系统已安装字体的准确名称(比如Arial的正确名称可能是Arial,MT),替换代码中font参数的对应值。

  2. 更可靠的替代方案:直接绘制文本
    如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:22:24