默认字体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数据 - 字体相关推荐

  1. Python使用Reportlab处理PDF数据 - 图形和图表

    简述 reportlab.graphics子程序包是作为一组独立程序开始的. 今天,它已完全集成到ReportLab工具包的其余部分中. 图形子软件包为开发人员提供了一组强大的功能,可用于创建图表和图 ...

  2. Python使用Reportlab处理PDF数据 - 其他可流动(flowable)

    简述 ReportLab还可以使用其他几个Flowable. 在本本中,我们将研究以下Flowable: Preformatted XPreformatted Image Spacer PageBre ...

  3. Python使用Reportlab处理PDF数据 - 自定义页眉和页脚

    有许多文档和报告要求您在首页或每页上都有页眉. 例如,如果您要为律师或法官生成报告,那么几乎可以肯定,所有页面上都需要合伙人信息. 在大多数医疗机构或医院中生成报告时也是如此. 他们的固定器必须以某种 ...

  4. 【Python办公自动化】使用reportlab制作pdf报告

    原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接.作者信息和本声明. Python使用folium制作地图并生成png图片 第一章 folium的方法和类的介绍(思维导图) 第二章 ...

  5. python使用fpdf创建pdf文件包含:页眉、页脚并嵌入logo图片、设置使用中文字体

    python使用fpdf创建pdf文件包含:页眉.页脚并嵌入logo图片.设置使用中文字体 #python使用fpdf创建页眉.页脚并嵌入logo图片.设置使用中文字体 from fpdf impor ...

  6. python使用fpdf生成pdf文件章节(chapter),包含:页眉、页脚、章节主题、数据排版等;

    python使用fpdf生成pdf文件章节(chapter),包含:页眉.页脚.章节主题.数据排版等: #仿真数据 The year 1866 was marked by a bizarre deve ...

  7. python使用fpdf生成pdf文件:配置多种语言字体写入多种文字

    python使用fpdf生成pdf文件:配置多种语言字体写入多种文字 目录

  8. python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项

    一.python库camelot安装及使用中的一些注意事项 1)camelot方法有两种解析模式:流解析(stream).格子解析(lattice),其中格子解析能够保留表格完整的样式,对于复杂表格来 ...

  9. Python自动化办公【PDF文件自动化】

    PDF 文件可以分为可编辑型PDF 文件与扫描型PDF 文件,内容可以复制,是可编辑型PDF文件,反之则是扫描型PDF 文件.简单理解扫描型PDF文件是由一张张图像构建而成. 读取PDF文件内容 1. ...

  10. python 读取文件读出来是什么格式-深入学习python解析并读取PDF文件内容的方法...

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

最新文章

  1. 挑战极限--有本事拿.Net+SQL SERVER试试4秒极限!
  2. 对象的多态(核心、困难、重点)
  3. matlab 矢量化,matlab矢量化编程简要
  4. (二)双线性插值python实现
  5. Python 中如何自动导入缺失的库?
  6. ubuntu15.10 gvim php,IDE---Gvim之ubuntu下配置php的ide开发工具
  7. python循环一段代码_Python循环语句代码详解:while、for、break
  8. 自编自适应中值滤波器
  9. springboot+vue公务员考试信息管理系统java
  10. python概率分布拟合_用Python实现概率分布
  11. python编程语言的缺点-多种编程语言的优缺点梳理
  12. 感抗和容抗的计算及说明
  13. 破解Navicat Premium数据库账号密码
  14. 酒美网宣布完成B轮融资 投资方或为罗斯柴尔德家族
  15. Java复习打卡day40
  16. 洛谷 P1085 不高兴的津津 C语言
  17. 程序员必备技能:橡皮鸭程序调试法
  18. 给博客添加一个浮动小人
  19. 【C语言入门】编写程序,输入ASCII,输出相应字符。
  20. clock gating门控时钟

热门文章

  1. python mql4跟单_MT4本地跟单EA设置教程 -
  2. 五大主流数据库深度对比!数据库开发、管理看这篇就够了
  3. word如何批量免费转PDF
  4. 接口压力测试工具(推荐)
  5. adb通过usb连接手机
  6. DBN(深度置信网络)
  7. opencv + freeimage 播放gif
  8. qnap威联通作文件服务器,QNAP 威联通 TS-453A NAS存储服务器 开箱初体验
  9. RoboWare Studio入门教程(一)
  10. 【问题解决】D:\Users10476\AppData\Local\Programs\Microsoft vsCode\unins000.exe 尝试在目标目录创建文件时发生一个错误:拒绝访问。.