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

使用PyFPDF生成PDF遇latin-1编码错误,求希腊字母μ处理方案

解决PyFPDF输出希腊字母μ时的Unicode编码错误

问题原因

你使用的默认Times字体属于PyFPDF的核心字体,仅支持Latin-1编码,而希腊字母μ(U+03BC)不在Latin-1字符集中,因此触发UnicodeEncodeError。

解决方法

方法1:使用支持UTF-8的外部字体

PyFPDF允许导入支持Unicode的TrueType(TTF)字体,这是最通用的解决方案。步骤如下:

  • 下载一款支持UTF-8的TTF字体(比如DejaVu Sans),将字体文件放在项目目录下。
  • 修改代码导入并使用该字体:
# 避免用str作为变量名(它是Python内置类型)
content = "2-3 μg/day"
pdf = FPDF('P', 'mm', 'A4')

# 添加支持Unicode的字体,uni=True开启UTF-8支持
pdf.add_font('DejaVuSans', '', 'DejaVuSans.ttf', uni=True)

pdf.add_page()

# 设置为导入的Unicode字体
pdf.set_font("DejaVuSans", "B", size=24)
pdf.set_text_color(0, 0, 0)

pdf.write(h=10, txt=content)
pdf.output("output.pdf")

方法2:切换核心字体实现符号输出(仅适配少量特殊字符)

如果必须使用Times等核心字体,可以切换到Symbol字体输出μ,写完后切回原字体继续内容:

content_prefix = "2-3 "
mu_char = "μ"
content_suffix = "g/day"

pdf = FPDF('P', 'mm', 'A4')
pdf.add_page()

# 用Times字体写前缀文本
pdf.set_font("Times", "B", size=24)
pdf.write(h=10, txt=content_prefix)

# 切换到Symbol字体输出μ
pdf.set_font("Symbol", "", size=24)
pdf.write(h=10, txt=mu_char)

# 切回Times字体写剩余内容
pdf.set_font("Times", "B", size=24)
pdf.write(h=10, txt=content_suffix)

pdf.output("output.pdf")

内容的提问来源于stack exchange,提问作者Alpha Geek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:24:16