如何在python的reportlab Canvas中设置任何字体?

Posted

技术标签:

【中文标题】如何在python的reportlab Canvas中设置任何字体?【英文标题】:How to set any font in reportlab Canvas in python? 【发布时间】:2011-06-21 10:57:01 【问题描述】:

我正在使用 reportlab 创建 pdf。当我尝试使用以下方法设置字体时,我得到一个KeyError:

pdf = Canvas('test.pdf')
pdf.setFont('Tahoma', 16)

但如果我使用'Courier' 而不是'Tahoma' 则没有问题。如何使用 Tahoma?

【问题讨论】:

【参考方案1】:

Perhabs Tahoma 是 TrueType 字体,您需要先注册它。根据 ReportLab 的用户指南,您需要这样做:

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!")

canvas 对象有一个getAvailableFonts 方法,该方法应该返回所有当前注册(因此可用)的字体。

【讨论】:

谢谢你让我开心,它成功了,有没有办法以这种方式使用 opentype 字体... 上次我检查它不支持opentype。最近我需要使用一个OTF,我可以用fontforge将它转换为TTF。但由于 OTF 是一种较新的格式,您可能会失去一些功能。对我来说幸运的是,当时并没有什么不同。 我想使用 Consolas 字体,但它似乎是 opentype,这就是我问的原因。无论如何,谢谢你的好建议.. 虽然我注册了我从互联网上下载的字体之一。并且在调用 getAvailableFonts 方法时也会出现。但是当我尝试使用谷歌翻译写一个复制的字符时,我在生成的 pdf 中找到了相同的矩形框。我可以知道我哪里出错了吗? 很棒,特别是对于那些需要使用 iso-8859-2 的人。嗯,节省了我很多时间,谢谢。【参考方案2】:

从Reiner's answer开始。

有一点就完美了。

Reportlab 仅搜索预定义文件夹中的字体:

TTFSearchPath = (
            'c:/winnt/fonts',
            'c:/windows/fonts',
            '/usr/lib/X11/fonts/TrueType/',
            '/usr/share/fonts/truetype',
            '/usr/share/fonts',             #Linux, Fedora
            '/usr/share/fonts/dejavu',      #Linux, Fedora
            '%(REPORTLAB_DIR)s/fonts',      #special
            '%(REPORTLAB_DIR)s/../fonts',   #special
            '%(REPORTLAB_DIR)s/../../fonts',#special
            '%(CWD)s/fonts',                #special
            '~/fonts',
            '~/.fonts',
            '%(XDG_DATA_HOME)s/fonts',
            '~/.local/share/fonts',
            #mac os X - from
            #http://developer.apple.com/technotes/tn/tn2024.html
            '~/Library/Fonts',
            '/Library/Fonts',
            '/Network/Library/Fonts',
            '/System/Library/Fonts',
            )

如果您尝试使用从 Internet 下载的 ttf 字体,并且希望该字体在您的所有服务器上都可用,我建议如下:

将字体添加到项目中的任意目录。例如:/project_root/app/lib/reportlabs/fonts/

确保您的设置中有 BASE_DIR/ROOT_DIR 之类的内容:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

将以下行添加到生成 pdf 的 python 文件中:

import reportlab
from django.conf import settings
reportlab.rl_config.TTFSearchPath.append(str(settings.BASE_DIR) + '/app/lib/reportlabs/fonts')
pdfmetrics.registerFont(TTFont('Copperplate', 'Copperplate-Gothic-Bold.ttf'))

【讨论】:

虽然我注册了我从互联网上下载的字体之一。并且在调用 getAvailableFonts 方法时也会出现。但是当我尝试使用谷歌翻译写一个复制的字符时,我在生成的 pdf 中找到了相同的矩形框。我可以知道我哪里出错了吗?【参考方案3】:

通过将 DejaVuSans 字体添加到应用程序解决了我的问题。 这是代码的sn-p

pdfmetrics.registerFont(TTFont('DejaVuSans','DejaVuSans.ttf'))

并使用 UTF8 进行所有编码。:)

【讨论】:

以上是关于如何在python的reportlab Canvas中设置任何字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python的reportlab Canvas中设置任何字体?

如何将整个表格与 Python Reportlab 库对齐?

Python Reportlab PDF - 在页面上居中文本

如何遍历 ReportLab 的 rml 文件中的列表

如何在reportlab中手动将新页面添加到PDF文档?

Python reportlab用画布保存到指定位置