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

