Не отображаются кириллические символы при генерации pdf файла в django с помощью xhtml2pdf

Есть функция-представление, которая должна генерировать pdf-файл из формы, если форма валидна. С латинскими символами все работает вполне корректно. При использовании кириллицы, вместо текста появляются черные квадраты. Исходя из прочитанного мною - проблема в том, что при генерации страницы не подтягивается кириллический шрифт. Шрифт нужно указывать в <stile> html-шаблона. Но, чтоб xhtml2pdf корректно отработала с путем к файлу, нужно использовать функцию, которая предоставлена разработчиками и называется link_callback. Она вызывается при генерации pdf файла pisa_status = pisa.CreatePDF(html, dest=response, encoding='UTF-8', link_callback=link_callback) Без нее шрифт не используется и остается проблема с "черными квадратами". С ней же возникает ошибка

TTFError at /create/ Can't open file "C:\Users\23-PC\AppData\Local\Temp\tmpnmzb0b9c.ttf"

Которую я не представляю как исправить.

def generate_pdf(request):
    if request.method == 'POST':
        form = CourtOrderForm(request.POST)
        if form.is_valid():
            template_path = 'court_order/create.html'
            context = form.cleaned_data
            response = HttpResponse(content_type='application/pdf')
            response['Content-Disposition'] = 'filename="report.pdf"'
            template = get_template(template_path)
            html = template.render(context)

            pisa_status = pisa.CreatePDF(
                html, dest=response, encoding='UTF-8', link_callback=link_callback)
            if pisa_status.err:
                return HttpResponse('We had some errors <pre>' + html + '</pre>')
            return response

    else:
        form = CourtOrderForm()
    return render(request, 'court_order_form.html', {'form': form})


def link_callback(uri, rel):
    """
    Convert HTML URIs to absolute system paths so xhtml2pdf can access those
    resources
    """
    result = finders.find(uri)
    if result:
        if not isinstance(result, (list, tuple)):
            result = [result]
        result = list(os.path.realpath(path) for path in result)
        path = result[0]
    else:
        sUrl = settings.STATIC_URL  # Typically /static/
        sRoot = settings.STATIC_ROOT  # Typically /home/userX/project_static/
        mUrl = settings.MEDIA_URL  # Typically /media/
        mRoot = settings.MEDIA_ROOT  # Typically /home/userX/project_static/media/

        if uri.startswith(mUrl):
            path = os.path.join(mRoot, uri.replace(mUrl, ""))
        elif uri.startswith(sUrl):
            path = os.path.join(sRoot, uri.replace(sUrl, ""))
        else:
            return uri

    # make sure that file exists
    if not os.path.isfile(path):
        raise Exception(
            'media URI must start with %s or %s' % (sUrl, mUrl)
        )
    return path

А это html страницы create.html

<!DOCTYPE html>
{% load static %}
<html lang="ru">
<head>
    <meta http-equiv="Content-Type" content="text/ html; charset=utf-8"/>
    <title>ФАЙЛПДФ</title>
    <style>
        @font-face {
            font-family: "Alice-Regular";
            src: url("{{ STATIC_URL }}fonts/timesnrcyrmt.ttf") format("truetype");
        }

        body {
            font-family: "timesnrcyrmt";
            font-size: 20px
        }

        div {
            font-family: "timesnrcyrmt";
            font-size: 20px
        }
    </style>
</head>
<body>
<div>Тестт русского языка<br>
    {{ debt_size }}<br>
</div>
</body>
</html>

строку src: url("{{ STATIC_URL }}fonts/timesnrcyrmt.ttf") format("truetype"); я крутил по-всякому - результат всегда один. Как вариант, может быть посоветуете другую библиотеку, где будет проще работать с кириллицей?


Ответы (0 шт):