Как использовать собственный шрифт с weasyprint

У меня есть приложение django, и я хотел бы создать PDF-файл из своего представления django. Я использую weasyprint, и по какой-то причине он не принимает мой пользовательский шрифт. URL-адрес шрифта работает, и когда я отображаю тот же html с тем же шрифтом, я вижу правильный шрифт, но мой pdf отображается с неправильным шрифтом. Я также пробовал строку шрифта base64, но не повезло. Мой код рендеринга:

import os
from weasyprint import HTML, CSS
from weasyprint.fonts import FontConfiguration

from django.conf import settings
from django.http import HttpResponse
from django.template.loader import get_template
from django.urls import reverse


def render_to_pdf(template_src, context_dict={}):
    font_config = FontConfiguration()
    font_string = '''
        @font-face {
          font-family: 'Titillium Web';
          font-style: normal;
          font-weight: 300;
          src: local('Titillium Web Light'), local('TitilliumWeb-Light'), url('http://X.X.X.X:8000/static/fonts/titillium_web.woff2') format('woff2');
        }
        *, div {font-family: 'Titillium Web';}
    '''

    template = get_template(template_src)
    rendered_html  = template.render(context_dict)
    pdf_file = HTML(string=rendered_html).write_pdf(stylesheets=[
        CSS(settings.BASE_DIR +  '/gui/executive_summary.css'),
        CSS(string=font_string)],font_config=font_config)
    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'filename="report.pdf"'
    return response

Любая идея, что я делаю неправильно?


person alexarsh    schedule 11.12.2017    source источник


Ответы (3)


Как вы можете прочитать в документации:

WeasyPrint должен поддерживать любой формат шрифта, поддерживаемый FreeType (любой широко используемый формат, кроме WOFF2)

SRC: http://weasyprint.readthedocs.io/en/latest/features.html#fonts

person MattSoft    schedule 13.12.2017
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person yivi; 13.12.2017
comment
я согласен с @yivi, прямая ссылка на самом деле не отвечает на вопрос, и только та часть, которая решает проблему, должна быть включена в качестве ответа, не говоря уже о том, что документация weasyprint на самом деле не дает точного решения проблем со шрифтами. - person Ahmed Farahat; 22.05.2018
comment
Исходный веб-сайт, похоже, изменился, и он больше не включает исключение, касающееся WOFF2. Тем не менее, WOFF2 по-прежнему не работает. Кто-нибудь знает, поддерживается ли он сейчас? - person balu; 11.06.2020
comment
woff2_compress — это инструмент, который преобразует шрифты WOFF2 в шрифты TrueType (.ttf). См. github.com/google/woff2. Затем вы можете использовать строку src: url(file://path/to/truetype/yourfont.ttf) в своем CSS. - person Jerry Penner; 14.05.2021

есть два способа: 1) загрузить шрифт онлайн и вставить ссылку в URL. например: @font-face { font-family: Gentium; src: url(http://example.com/fonts/Gentium.otf); }

2) если вы хотите использовать шрифт из локального каталога. например :@font-face{ font-family: Gothan Narrow; src: url(file:///home/javed/Downloads/fonts/GothamNarrow-Light.otf) }

person Javed Gouri    schedule 13.03.2019
comment
Добавление абсолютного пути @font-face { font-family: kalpurush; источник: URL-адрес (файл:///mnt/d/djangoprojects/dj-boot-modal/librarydb/static/librarydb/fonts/kalpurush.ttf); } решил мою проблему. - person Lone Rider; 22.01.2021

Если в вашем CSS есть @font-face правила, вам нужно создать объект FontConfiguration:

fromweasyprintimport HTML, CSS
from weasyprint.fonts import FontConfiguration

font_config = FontConfiguration()
html = HTML(string='<h1>The title</h1>')
css = CSS(string='''
    @font-face {
        font-family: Gentium;
        src: url(http://example.com/fonts/Gentium.otf);
    }
    h1 { font-family: Gentium }''', font_config=font_config)
html.write_pdf(
    '/tmp/example.pdf', stylesheets=[stylesheet],
    font_config=font_config)

https://weasyprint.readthedocs.io/en/stable/tutorial.html?highlight=FontConfiguration

person weaming    schedule 04.10.2018