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

如何用Python的fpdf库实现阿语与英语混排打印?已尝试方案无效

解决fpdf混合阿拉伯语与英语文本显示问题

问题根源

你遇到的英语显示为矩形的问题,本质是当前用的PDF字体不支持阿拉伯语+英语的混合字符集,加上阿拉伯语本身需要特殊的字形重塑和双向文本处理,仅靠arabic_reshaper和bidi还不够,必须搭配同时覆盖两种语言的字体才行。

可行解决方案步骤

1. 准备支持双语的字体

选一个同时包含阿拉伯语和英语字形的开源字体,比如DejaVu Sans,下载字体文件(比如DejaVuSans.ttf)放到你的项目目录里。

2. 完整代码实现

from fpdf import FPDF
import arabic_reshaper
from bidi.algorithm import get_display

# 初始化PDF对象
pdf = FPDF()
pdf.add_page()

# 添加支持双语的字体,必须加uni=True启用Unicode支持
pdf.add_font('DejaVu', '', 'DejaVuSans.ttf', uni=True)
pdf.set_font('DejaVu', '', 12)

# 处理混合文本:先重塑阿拉伯语字形,再处理双向排版
original_text = "تمانتمانتمانتمانتم English Letters"
reshaped_text = arabic_reshaper.reshape(original_text)
bidi_text = get_display(reshaped_text)

# 输出到PDF
pdf.multi_cell(w=150, h=5, txt=bidi_text)

# 保存文件
pdf.output('arabic_english_mixed.pdf')

3. 关键注意事项

  • Unicode必须开启:调用add_font时一定要加uni=True,不然fpdf没法处理阿拉伯语这类非拉丁字符。
  • 处理顺序不能乱:先对完整文本做字形重塑,再用get_display处理双向排版,这样英语会自动按左到右显示,阿拉伯语按右到左显示,两者不会冲突。
  • 字体路径要正确:如果字体放在子目录里,要写相对路径(比如fonts/DejaVuSans.ttf),确保程序能找到字体文件。

4. 备选方案(升级到fpdf2)

如果用的是旧版fpdf(fpdf1),可以直接升级到fpdf2——新版对Unicode支持更好,代码更简洁:

from fpdf import FPDF
import arabic_reshaper
from bidi.algorithm import get_display

pdf = FPDF()
pdf.add_page()
# fpdf2默认兼容更多Unicode字体,直接设置即可
pdf.set_font("DejaVuSans", size=12)

text = "تمانتمانتمانتمانتم English Letters"
reshaped_text = arabic_reshaper.reshape(text)
bidi_text = get_display(reshaped_text)

pdf.multi_cell(150, 5, bidi_text)
pdf.output("mixed_text.pdf")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:46:16