python 中无法使用 FPDF 打印特定字符

Can't print specific character using FPDF in python

我正在尝试用阿拉伯语打印这个词

الله

我尝试了很多字体,但 FPDF 仍然将其打印为盒子(豆腐盒,我猜就是它的名字)

from fpdf import FPDF
import arabic_reshaper

pdf = FPDF('P', 'mm', "A4")
pdf.add_page()
pdf.add_font('dejavu', "", "DejaVuSansCondensed.ttf", uni=True)
pdf.set_font('dejavu', '', 10)
pdf.multi_cell(69, 5, arabic_reshaper.reshape("الله"), "", ln=1)
pdf.output("mypdf.pdf")

如果我不使用 arabic reshaper,结果是 ,这不是输入的正确单词。

结果就是这个框

我认为解决方案是这样的:

from fpdf import FPDF
from arabic_reshaper import reshape
from bidi.algorithm import get_display
from warnings import filterwarnings

pdf = FPDF()

pdf.add_page()
pdf.add_font("NotoSansArabic", style="", fname="NotoSansArabic-Regular.ttf", uni=True)
pdf.set_font('NotoSansArabic', '', 10)
original_text = 'الله'

reshaped_text = reshape(original_text)
bidi_text = get_display(reshaped_text)

pdf.write(8, original_text)
pdf.ln(8)

pdf.write(8, reshaped_text)
pdf.ln(8)

pdf.write(8, bidi_text)
pdf.ln(8)

filterwarnings('ignore')
pdf.output('mypdf.pdf')
filterwarnings('default')

我无法使用您提供的字体,但此处使用的 Google 字体可以免费下载。似乎 'الله' 的某些部分导致了这个问题,因为像 'مرحبا' 这样的东西在 Deja Vu Sans Condensed 中确实有效。

filterwarnings("ignore") 之所以存在是因为 pdf.output 生成的警告似乎不会影响结果,但您可能希望查看它们而不是仅仅忽略它们:

[..]\site-packages\fpdf\ttfonts.py:670: UserWarning: cmap value too big/small: -65241
  warnings.warn("cmap value too big/small: %s" % cm)

但是,脚本现在似乎可以执行您想要的操作,还显示了初始外观和修复方向之前重塑的外观。

你的问题不同,但我在这里找到了解决方案:Problem writing a mix of English and Arabic text in PDF using Python pyFPDF。 Deja Vu 也出现了警告,所以它不是由特定字体引起的。