Не отображаются кириллические символы при генерации 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"); я крутил по-всякому - результат всегда один.
Как вариант, может быть посоветуете другую библиотеку, где будет проще работать с кириллицей?