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

sri*_*sar 34 python reportlab

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

pdf = Canvas('test.pdf')
pdf.setFont('Tahoma', 16)
Run Code Online (Sandbox Code Playgroud)

但如果我使用'Courier'而不是'Tahoma'没有问题.我怎么用Tahoma?

Rei*_*cke 55

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!")
Run Code Online (Sandbox Code Playgroud)

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


Pra*_*dar 10

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',
            )
Run Code Online (Sandbox Code Playgroud)

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

  • 将字体添加到任何目录中的项目中。例如:/project_root/app/lib/reportlabs/fonts/
  • 确保您的设置中有类似 BASE_DIR/ROOT_DIR 的内容:

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    Run Code Online (Sandbox Code Playgroud)
  • 将以下行添加到生成 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'))
    
    Run Code Online (Sandbox Code Playgroud)