首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在python中使用FPDF打印特定字符

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

Stack Overflow用户
提问于 2022-03-20 10:37:21
回答 1查看 389关注 0票数 1

我正试图用阿拉伯文打印这个词。

代码语言:javascript
运行
复制
الله

我试过很多种字体,但FPDF还是把它打印成盒子(豆腐盒,我猜就是它的名字)。

代码语言:javascript
运行
复制
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")

如果我不使用阿拉伯reshaper,结果是

这不是输入的正确单词。

结果就是这个盒子

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-20 22:57:03

我认为解决办法是这样的:

代码语言:javascript
运行
复制
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凝聚中确实能工作。

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

代码语言:javascript
运行
复制
[..]\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中,所以它不是由特定的字体引起的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71545989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档