细节知识
默认字体Unicode / UTF8
追溯到2006年,ReportLab做到了这一点,因此您提供给它们的API的所有文本都应使用UTF8或Python Unicode对象。 应该使用canvas.DrawString方法以及在接受文本(即字符串)作为参数的可流动对象中完成此操作。 幸运的是,Python 3的“字符串”默认情况下是Unicode,因此,即使您只使用最新的Python,您也不必考虑这个主题。 但是,如果您使用的是旧版本的Python,并且您的字符串未编码为UTF8,那么如果您给它提供任何非ASCII的字符,则会收到UnicodeDecodeError。
解决方法是将文本编码为UTF8或使用Unicode对象。 如果遇到此类问题,请记住这一点。
标准字体
ReportLab默认情况下带有一组字体。 不需要将它们存储/嵌入到PDF中,因为Adobe的Acrobat Reader保证它们会在那里。 您可以通过调用getAvailableFonts()画布方法来获取可用字体的列表。 这是我收到的列表:
Courier
Courier-Bold
Courier-BoldOblique
Courier-Oblique
Helvetica
Helvetica-Bold
Helvetica-BoldOblique
Helvetica-Oblique
Symbol
Times-Bold
Times-BoldItalic
Times-Italic
Times-Roman
ZapfDingbats
ReportLab支持有限的自动字体替换。 仅当ReportLab引擎检测到您选择的字体中没有的字符时,才会发生这种情况。 在这种情况下,ReportLab的引擎将尝试切换到Symbol或ZapfDingbats以显示该字符。 这是一个快速演示:
您将注意到,获取字体列表所需要做的就是调用getAvailableFonts方法。 运行此代码时,您将在PDF中获得以下内容:
其他Type-1字体
如果需要嵌入非标准字体,则将需要几个字体描述文件。 一种需要采用Adobe AFM(Adobe字体度量)格式,另一种则需要PFB(打印机字体二进制)格式。 Adobe AFM文件实际上是ASCII,可以告诉ReportLab字体的字形。 字体的字形描述了高度,宽度,边框信息和其他字体指标。 PFB描述字体的形状,并且为二进制格式,因此,如果没有十六进制编辑器或类似工具,您将无法阅读它。 我以前不得不使用这些文件将检查字体嵌入到PDF中。
幸运的是,ReportLab实际上包括一种称为DarkGardenMK的开源字体,它们与ReportLab一起分发在其字体文件夹中。 让我们写一个小样的演示,展示如何在我们的PDF中嵌入此字体:
这是一个相当复杂的过程。 首先,我们有import。 请注意,我们需要pdfmetrics来注册字体。 然后,我们创建演示功能并通过获取ReportLab的安装位置来构建字体文件夹。 我添加了print()语句,以便您查找该文件夹的位置,以防您要浏览它。 接下来,我们获得AFM和PFB文件的路径。 现在,我们终于可以在ReportLab中注册该字体了。 该过程首先实例化pdfmetrics的EmbeddedType1Face类,并将其传递给AFM和PFB文件路径。 接下来,我们通过调用registerTypeFace来注册字体的外观。 有趣的是,我意外地发现,如果不调用该函数,代码就可以正常工作,因此我不确定为什么需要进行健全性检查以外的其他原因。
无论如何,下一步是通过将字体名称,外观名称和编码传递给它来实例化Font类。 然后,您可以通过调用registerFont来注册字体。 现在,我们可以实际在PDF中使用该字体了。 这是我运行此代码时得到的结果:
您还可以在rl_settings.py中编辑T1字体搜索路径,该路径位于ReportLab安装位置。 您将需要设置的变量称为T1SearchPath。 在我的系统上,默认值如下所示:
TrueType字体
使用ReportLab在PDF中添加TrueType字体要比嵌入Type-1字体要简单一些。 让我们看一下TrueType字体嵌入与Type-1有何不同:
第一个更改是我们需要从reportlab.pdfbase.ttfonts导入TTFont。 然后,我们通过向其传递字体名称和字体文件路径来创建该类的实例。 然后,就像上一节中使用Type-1字体一样,调用registerFont。 其余代码几乎相同。
我还要指出,您应该注意一个registerFontFamily方法。 此方法将允许您将字体的粗体,斜体和粗斜体版本映射到相同的名称。 当然,如果您拥有字体的所有不同版本,则也可以使用此功能注册这些名称。 这是您用于Vera字体的签名:
如您所见,您只需将字体的各种样式的名称传递给适当的参数。
包含TrueType字体的另一种方法是在rl_settings.py中设置字体搜索路径,其方式与T1搜索路径的设置方式几乎相同。 对于TrueType字体,您将需要设置TTFSearchPath变量。 ReportLab查找的默认路径如下:
如果您的字体位于这些路径之一中,则可以稍微简化代码,因为您将不再需要包含整个路径:
亚洲字体
字体之间切换
详情参阅Python使用Reportlab处理PDF数据 - 字体viadean.com