如何在Python的ReportLab画布中设置任意字体?

52 投票
3 回答
61518 浏览
提问于 2025-04-16 11:14

我正在使用reportlab来创建PDF文件。当我尝试用下面的方法设置字体时,出现了一个KeyError错误:

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

但是如果我用'Courier'字体,就没有问题。那么我该怎么才能使用Tahoma字体呢?

3 个回答

1

我在应用程序中添加了DejaVuSans字体,这样就解决了我的问题。

下面是相关的代码片段:

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

另外,所有的编码都要使用UTF8格式哦。:)

16

Reiner的回答开始。

这个方法很好,但有一个小问题。

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',
            )

如果你想使用从网上下载的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'))
    
101

也许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方法,这个方法会返回所有当前已注册(也就是可以使用的)字体。

撰写回答