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

Python使用reportlab生成PDF时Māngere等带重音字符字体显示异常如何解决

问题原因

ReportLab默认使用的Helvetica字体仅支持ASCII字符集,无法渲染包含重音符号在内的Unicode扩展字符,因此你代码中的Māngere里的ā会出现乱码、缺失的情况。

解决方案

你需要给ReportLab注册支持Unicode的字体,嵌入到生成的PDF中即可解决问题,完整可运行的代码示例如下:

import io
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from django.http import FileResponse

# 注册支持Unicode的字体,第二个参数替换为你实际的字体文件路径
# 推荐使用开源免费的Noto Sans系列字体,支持几乎所有通用Unicode字符
pdfmetrics.registerFont(TTFont('UnicodeFont', 'NotoSans-Regular.ttf'))

buffer = io.BytesIO()
c = canvas.Canvas(buffer)
# 绘制文本前设置为你注册的字体,可自行调整字号
c.setFont('UnicodeFont', 12)
c.drawString(100, 100, "Māngere")
c.save()
buffer.seek(0)
return FileResponse(buffer, filename="test.pdf")
补充说明
  • 如果你不想单独下载字体文件,可直接使用系统内置的兼容Unicode的字体,不同系统的字体路径参考:
    • Windows:C:/Windows/Fonts/msyh.ttc(微软雅黑)
    • macOS:/Library/Fonts/PingFang.ttc(苹方)
    • Linux:/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf
  • 嵌入字体会让PDF体积有小幅增加,但可以保证所有设备打开时的显示效果一致,是兼容性最高的处理方案。

内容的提问来源于stack exchange,提问作者J.W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:57:03