Я очень неопытен в этом, поэтому у меня проблемы с пониманием предоставленной документации для xhtml2pdf
, так как это очень расплывчато в деталях. Пожалуйста, скажите мне, что я делаю неправильно.
В соответствии с документацией, чтобы преобразовать относительный путь URL в абсолютный, мне нужно использовать предоставленную функцию:
def link_callback(uri, rel):
"""
Convert HTML URIs to absolute system paths so xhtml2pdf can access those
resources
"""
# use short variable names
sUrl = settings.STATIC_URL # Typically /static/
sRoot = settings.STATIC_ROOT # Typically /home/userX/project_static/
mUrl = settings.MEDIA_URL # Typically /static/media/
mRoot = settings.MEDIA_ROOT # Typically /home/userX/project_static/media/
# convert URIs to absolute system paths
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 # handle absolute uri (ie: http://some.tld/foo.png)
# 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
Я добавил точно такую же функцию к своему views.py
и используя эту функцию для генерации pdf (также в views.py
, почти непосредственно взятой из документов):
<code>def PGP_result(request):
data = request.session['form_data']
lietuvosPgp = data['LtPGP']
valstybe = data['pVal']
kastai = data['iKastai']
rezultatas = data['result']
today = timezone.now()
params = {
'LtPgp': lietuvosPgp,
'Valstybe': valstybe,
'Kastai': kastai,
'Rezultatas': rezultatas,
'today': today,
}
template_path = 'PGP_results_pdf.html'
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="test.pdf"'
template = get_template(template_path)
html = template.render(params)
pisaStatus = pisa.CreatePDF(
html, dest=response, link_callback=link_callback
)
if pisaStatus.err:
return HttpResponse('Ups kažkas nepavyko <pre>' + html + '
') ответ возврата
Pdf генерируется, но файл шрифта находится вПапка static/fonts
не используется. Я не могу понять, как правильно написать относительный путь URL, чтобы он был преобразован в абсолютный. Я думаю, что решение должно быть очень простым, но мой недостаток опыта мешает мне найти его (я устал от различных способов написания, но ни один из них не работал).
Мой (текущий) код шаблона (не знаюкак исправить src: url(sUrl/fonts/Arial.ttf)
часть):
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<style type="text/css">
@font-face {
font-family: "Arial"; src: url(sUrl/fonts/Arial.ttf);
}
.container {
font-family: "Arial"
}
</style>
</head>
<body>
<div class="container">
<div class="card">
<div class="card-header">
<h3>Skaičiuota - {{ today | date:"d/m/Y" }}</h3>
</div>
<div class="list-group">
<p>{{ LtPgp }}</p>
<p>{{ Valstybe }}</p>
<p>{{ Kastai }}</p>
<p>{{ Rezultatas }}</p>
</div>
</div>
</div>
</body>
</html>