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

Python+FPDF2添加Unicode文本注释时编码报错求助

解决fpdf2 text_annotation的Unicode编码问题

问题原因

fpdf2的text_annotation方法默认会将字符串用latin-1编码处理,而PDF注释规范要求非ASCII字符需使用UTF-16BE编码并带字节顺序标记(BOM),因此直接传入Unicode字符串会触发编码错误。

解决方案

手动将Unicode注释文本编码为带BOM的UTF-16BE字节串,再传入text_annotation的content参数:

  • 对注释文本执行UTF-16BE编码
  • 拼接UTF-16BE的BOM(b'\xfe\xff')
  • 将生成的字节串作为content传入

完整示例代码

from fpdf import FPDF

# 初始化PDF对象
pdf = FPDF()
pdf.add_page()

# 添加支持Unicode的字体(保持原有配置)
pdf.add_font("DejaVuSerif", "", "DejaVuSerif.ttf", uni=True)
pdf.set_font("DejaVuSerif", size=12)

# 正常写入Unicode正文内容(原有write_html逻辑)
pdf.write_html("<p>示例Unicode正文内容</p>")

# 处理Unicode注释文本
annot_text = "这是一条包含中文的Unicode注释"
# 生成带BOM的UTF-16BE编码字节串
utf16_bom = b'\xfe\xff'
encoded_annot_content = utf16_bom + annot_text.encode("utf-16be")

# 添加文本注释
pdf.text_annotation(x=20, y=40, content=encoded_annot_content)

# 输出PDF
pdf.output("unicode_annotation.pdf")

说明

通过这种方式传入的字节串会被fpdf2直接写入PDF的注释内容字段,完全符合PDF规范对Unicode注释的编码要求,可避免latin-1编码导致的错误。

内容的提问来源于stack exchange,提问作者Myrto Pirli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:40:06