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

使用pyfpdf写入Unicode孟加拉语Avro字符时顺序错乱问题求解决

解决pyfpdf生成孟加拉语PDF时字符顺序错乱的问题

我之前也碰到过类似的问题,核心原因是孟加拉语属于复杂书写系统(Complex Script)——它的字符需要特殊的字形组合处理(比如辅音与元音符号的结合、连写规则等),而旧版本的pyfpdf库对这类复杂脚本的排版支持不足,只是简单按Unicode码点的顺序输出字符,完全没处理孟加拉语的字形布局逻辑,才会出现字符顺序错乱的情况。

下面给你两个靠谱的解决方法,优先推荐第一个:

方法1:升级到fpdf2库(官方升级版本,推荐)

fpdf2是pyfpdf的官方迭代版本,专门优化了对复杂书写系统的支持,能正确处理孟加拉语的字符组合规则。

操作步骤:

  1. 先卸载旧的pyfpdf,安装fpdf2:
pip uninstall pyfpdf
pip install fpdf2
  1. 修改你的代码,用fpdf2替代旧库,同时简化文本处理(Python3里孟加拉语文本本身就是Unicode字符串,不用额外转str):
from fpdf import FPDF  # 这里导入的是fpdf2的FPDF类,和旧库同名但功能升级
pdf = FPDF()
pdf.add_page()
# 添加你的Kalpurush字体,注意路径要正确
pdf.add_font('Kalpurush', '', r'C:\Users\PWD-PD-5\Desktop\kalpurush.ttf', uni=True)
pdf.set_font('Kalpurush', size=20)
# 直接传入孟加拉语文本即可
pdf.cell(200, 10, txt="করিম", ln=1, align="C")
pdf.output("Bangla.pdf")

方法2:用reportlab作为替代方案(如果fpdf2仍有问题)

要是fpdf2还是达不到预期效果,reportlab库对复杂脚本的支持更成熟,是处理多语言PDF的常用选择:

操作步骤:

  1. 安装reportlab:
pip install reportlab
  1. 示例代码:
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

# 先注册孟加拉语字体
pdfmetrics.registerFont(TTFont('Kalpurush', r'C:\Users\PWD-PD-5\Desktop\kalpurush.ttf'))

# 创建PDF画布
c = canvas.Canvas("Bangla_reportlab.pdf")
c.setFont("Kalpurush", 20)
# 在PDF的(100, 750)坐标位置绘制文本(reportlab需要手动指定坐标)
c.drawString(100, 750, "করিম")
c.save()

几个关键提醒:

  • 确保你用的Kalpurush字体是完整支持孟加拉语所有字形组合的版本,损坏的字体文件也可能导致显示异常。
  • 不要手动把孟加拉语文本转成str,Python3里默认字符串就是Unicode格式,这个操作完全多余,甚至可能引发问题。
  • 旧版pyfpdf对复杂脚本的支持基本是缺失的,不建议继续使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:42:42