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
相关产品推荐
相关产品推荐

