Python使用Reportlab处理PDF数据 - 字体

138 篇文章 16 订阅

默认字体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查找的默认路径如下:

详情参阅 - 亚图跨际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值