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

标签 python pdf fpdf

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

الله

我尝试了很多字体,但 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")

如果我不使用阿拉伯语整形器,结果是 enter image description here这不是输入的正确单词。

结果是这个框enter image description here

最佳答案

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

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/

相关文章:

python - PY3MQI。 AMQ9627 使用 sco.CertificateLabel 和 os 用户与证书标签用户不匹配时

Python SSL 套接字服务器

python - 尝试检索单个资源时,DRF ViewSet 中不允许使用方法 GET

python - 接口(interface)隔离原则可以应用于Python对象吗?

iphone - quartz 无需其他库就能渲染pdf吗?

python - PDF 响应在 Python 3 中损坏但在 Python 2 中有效

java - 如何在 Java 中从 XML 创建 PDF?

Android - PdfDocument - 将 LinearLayout 分成多个 pdf 页面

php - 将现有的 pdf 添加到 fpdf

pdf-generation - 文件保存在 wkhtmltopdf 中的位置