作者: Jim Wang 公众号: 巴博萨船长

摘要:ReportLab默认的支持的西欧字体都有哪些?如何注册并在模版中使用中日韩亚洲字体?

Abstract: What are the default supported Western European fonts in ReportLab? How do I register and use CJK Asian fonts in my templates?

作者: Jim Wang 公众号: 巴博萨船长

ReportLab 如何注册使用其他语言字体

默认语言

ReportLab默认支持西欧语言,例如英文,德语和法语(未测试)。默认支持14种字体,该内容在文档章节3.3 Using fonts中有介绍,具体字体名称如下:

  • Helvetica
  • Helvetica-Bold
  • Courier
  • Courier-Bold
  • Courier-Oblique
  • Courier-BoldOblique
  • Helvetica-Oblique
  • Helvetica-BoldOblique
  • Times-Roman
  • Times-Bold
  • Times-Italic
  • Times-BoldItalic
  • ZapfDingbats
  • Symbol

上述14种默认字体,也是Adobe’s Acrobat Reader默认支持的14种字体。

中日韩亚洲字体

ReportLab支持TrueType 字体支持。未注册非西欧字体却使用非西欧字符,程序并不会报错,但是到处的PDF文件中会出现乱码,注册TrueType字体支持字体的代码,官方文档介绍如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# we know some glyphs are missing, suppress warnings
import reportlab.rl_config
reportlab.rl_config.warnOnMissingFontGlyphs = 0

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf'))
pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf'))
pdfmetrics.registerFont(TTFont('VeraIt', 'VeraIt.ttf'))
pdfmetrics.registerFont(TTFont('VeraBI', 'VeraBI.ttf'))
canvas.setFont('Vera', 32)
canvas.drawString(10, 150, "Some text encoded in UTF-8")
canvas.drawString(10, 100, "In the Vera TT Font!")

对于相似字体可以使用如下代码注册为字体家族:

1
2
from reportlab.pdfbase.pdfmetrics import registerFontFamily
registerFontFamily('Vera',normal='Vera',bold='VeraBd',italic='VeraIt',boldItalic='VeraBI')

如在模版中使用下述代码。如果我们只有 Vera 常规字体,没有粗体或斜体,那么我们必须将所有字体映射到相同的内部字体名称。<b>和<i>标签现在可以安全使用,但会没有效果。

1
2
<font name="Times-Roman" size="14">This is in Times-Roman</font>
<font name="Vera" color="magenta" size="14">and this is in magenta <b>Vera!</b></font>,"Using TTF fonts in paragraphs"

在项目中,我们使用思源中文字体,将相关字体文件保存在项目文件夹fonts之后,在Python代码中头部使用下面的代码注册字符。

1
2
3
4
5
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont('SourceHanSerifSC', '../fonts/SourceHanSerifSC-VF.ttf')) #注册字体
pdfmetrics.registerFont(TTFont('SourceHanSerifSCBold', '../fonts/SourceHanSerifCN-Bold.ttf')) #注册字体

上述代码中TTFont函数的第一参数为字体的内部表示名称。需要使用该名称在在RML模版文件的头部进行如下声明:

1
2
3
4
5
6
7
<document filename="demo.pdf">
<docinit>
<registerCidFont faceName="SourceHanSerifSC" />
<registerCidFont faceName="SourceHanSerifSCBold" />
</docinit>
...
</document>

本文小结

这些背景知识是自己在完成任务的一开始具有的疑问,进而中查阅资料再收集整理成文的,这利于自己,也方便你我。如果你有问题或者不同的见解,欢迎关注我的微信公众号,然后留言讨论。


版权声明:
文章首发于 Jim Wang's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明。