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

