我正在尝试用阿拉伯语打印这个单词
الله
我尝试了很多字体,但 FPDF 仍然将其打印为盒子( bean 腐盒,我猜它就是这么叫的)
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")
最佳答案
我认为解决方案是这样的:
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)
但是,脚本现在似乎可以执行您想要的操作,还显示固定方向之前的初始外观和 reshape 的外观。
您的问题不同,但我在这里找到了解决方案:Problem writing a mix of English and Arabic text in PDF using Python pyFPDF 。 Deja Vu 也出现了该警告,因此它不是由特定字体引起的。
关于python - 无法在python中使用FPDF打印特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71545989/