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

der*_*4M1 2 python pdf fpdf

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

\n
\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
from fpdf import FPDF\nimport arabic_reshaper\n\npdf = FPDF(\'P\', \'mm\', "A4")\npdf.add_page()\npdf.add_font(\'dejavu\', "", "DejaVuSansCondensed.ttf", uni=True)\npdf.set_font(\'dejavu\', \'\', 10)\npdf.multi_cell(69, 5, arabic_reshaper.reshape("\xd8\xa7\xd9\x84\xd9\x84\xd9\x87"), "", ln=1)\npdf.output("mypdf.pdf")\n
Run Code Online (Sandbox Code Playgroud)\n

如果我不使用阿拉伯语整形器,结果是在此输入图像描述这不是输入的正确单词。

\n

结果就是这个框在此输入图像描述

\n

Gri*_*mar 5

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

\n
from fpdf import FPDF\nfrom arabic_reshaper import reshape\nfrom bidi.algorithm import get_display\nfrom warnings import filterwarnings\n\npdf = FPDF()\n\npdf.add_page()\npdf.add_font("NotoSansArabic", style="", fname="NotoSansArabic-Regular.ttf", uni=True)\npdf.set_font(\'NotoSansArabic\', \'\', 10)\noriginal_text = \'\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\'\n\nreshaped_text = reshape(original_text)\nbidi_text = get_display(reshaped_text)\n\npdf.write(8, original_text)\npdf.ln(8)\n\npdf.write(8, reshaped_text)\npdf.ln(8)\n\npdf.write(8, bidi_text)\npdf.ln(8)\n\nfilterwarnings(\'ignore\')\npdf.output(\'mypdf.pdf\')\nfilterwarnings(\'default\')\n
Run Code Online (Sandbox Code Playgroud)\n

我无法让它与您提供的字体一起使用,但此处使用的 Google 字体可以免费下载。似乎是 的某些部分\'\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\'导致了这个问题,因为类似的东西\'\xd9\x85\xd8\xb1\xd8\xad\xd8\xa8\xd8\xa7\'在 Deja Vu Sans Condensed 中确实有效。

\n

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

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

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

\n

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

\n