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

Python中ReportLab生成UTF-8编码PDF出现黑方块问题求助

解决ReportLab生成UTF-8文本PDF出现黑方块的问题

我之前也碰到过一模一样的情况,黑方块本质是当前使用的字体不支持你要渲染的UTF-8字符(这里是亚美尼亚语)——哪怕你注册了Vera字体,没在样式里明确指定使用它,ReportLab还是会用默认的拉丁语系字体,自然无法识别非拉丁语字符。

问题根源

ReportLab自带的Normal样式默认使用内置字体,这类字体仅覆盖了拉丁语系字符范围,对亚美尼亚语这类小众语言的字符没有支持,渲染时就会用黑方块替代无法识别的字符。你之前注册了Vera字体,但没给段落样式绑定这个字体,等于白做了。

可行解决方案

要搞定这个问题,核心就是两步:

  • 选一个支持目标语言字符的TTF字体(Vera其实不支持亚美尼亚语,推荐用Noto系列的对应语言字体,覆盖范围极广)
  • 在段落样式中明确指定使用已注册的字体

完整修复代码

先确保依赖安装完成:

pip install faker reportlab

然后修改代码(以Noto Sans Armenian为例,需要先把该字体文件下载到项目目录):

import tempfile
from faker import Faker
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# 初始化亚美尼亚语文本生成器
FAKER = Faker(locale="hy-AM")
text = FAKER.text(max_nb_chars=1_000)

filename = tempfile.NamedTemporaryFile(suffix=".pdf").name

# 注册支持亚美尼亚语的字体
pdfmetrics.registerFont(TTFont("NotoArmenian", "NotoSansArmenian-Regular.ttf"))
pdfmetrics.registerFont(TTFont("NotoArmenianBold", "NotoSansArmenian-Bold.ttf"))

# 基于默认样式创建自定义样式,指定使用新注册的字体
styles = getSampleStyleSheet()
style_paragraph = ParagraphStyle(
    "CustomNormal",
    parent=styles["Normal"],
    fontName="NotoArmenian",
)

story = []
doc = SimpleDocTemplate(
    filename,
    pagesize=letter,
    bottomMargin=.4 * inch,
    topMargin=.6 * inch,
    rightMargin=.8 * inch,
    leftMargin=.8 * inch,
)

paragraph = Paragraph(text, style_paragraph)
story.append(paragraph)
doc.build(story)

关键注意事项

  • 选字体时一定要确认它支持你要渲染的语言:Noto系列字体是谷歌推出的,几乎覆盖了所有已知语言,非常适合这类场景
  • 注册字体后必须在样式中通过fontName绑定,否则ReportLab会继续使用默认字体
  • 如果你坚持要用Vera,先确认它确实支持亚美尼亚语(大概率不支持),再把代码里的fontName改成Vera即可

内容的提问来源于stack exchange,提问作者Artur Barseghyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:20:30