Подтвердить что ты не робот

Как установить любой шрифт в reportlab Canvas в python?

Я использую reportlab для создания PDF файлов. Когда я пытаюсь установить шрифт, используя следующий метод, я получаю KeyError:

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

Но если я использую 'Courier' вместо 'Tahoma', это не проблема. Как я могу использовать Tahoma?

4b9b3361

Ответ 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, который должен возвращать все зарегистрированные в настоящий момент (и, следовательно, используемые) шрифты.

Ответ 2

Начните с ответа Райнера.

Это прекрасно с одной оговоркой.

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__)))
    
  • добавьте следующую строку в файл Python, который генерирует PDF:

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

Ответ 3

Добавляя шрифт DejaVuSans к приложению, моя проблема решена. Вот фрагмент кода

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

И используйте UTF8 для всего кодирования.:)