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
- Windows:
- 嵌入字体会让PDF体积有小幅增加,但可以保证所有设备打开时的显示效果一致,是兼容性最高的处理方案。
内容的提问来源于stack exchange,提问作者J.W
相关产品推荐
相关产品推荐

