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