I\'m trying to generate a pdf from template using this snippet:
def write_pdf(template_src, context_dict):
template = get_template(template_src)
context
I am using xhtml2pdf version 0.2.4 I faced the same issue and I was able to resolve using this encoding:
def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
# PDF
pdf = pisa.pisaDocument(BytesIO(html.encode("utf-8")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return None
Then in my views, I have defined like:
def download_pdf(request, pk):
item = get_object_or_404(object, id=pk)
if item:
context ={
'item': item
}
template_name = 'template.html'
pdf = render_to_pdf(template_name, context)
return HttpResponse(pdf, content_type='application/pdf')
else:
messages.info(request, 'Item not found')
return redirect('home')
My HTML:
{% load static %}
{% load humanize %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/gif" href="{% static 'images/profile.png' %}" />
<title>{{ item.scientific_name}}</title>
<link rel="stylesheet" href="{% static 'style/Bootstrap/css/bootstrap.min.css' %}">
<style>
@page {
size: letter;
margin: 2cm;
@frame footer_frame {
/* Another static Frame */
-pdf-frame-content: footer_content;
left: 50pt;
width: 512pt;
top: 760pt;
height: 50px;
}
table {
-pdf-keep-with-next: true;
}
}
ul {
list-style-type: none;
}
ul li span {
font-weight: bold;
}
</style>
You need to modify your django template. Add a new font face in the stylesheet that will link to a font file with characters used in your document. And that font file must be accessible from your server (under Ubuntu you can find files with fonts in /usr/share/fonts/truetype/ directory). For example:
@font-face {
font-family: DejaMono;
src: url(font/DejaVuSansMono.ttf);
}
Then if you have next HTML code:
<div>Some non-latin characters</div>
you can display that text in DejaMono font with this CSS rule:
div { font-family: DejaMono; }
This works for me when I generate PDF documents with cyrillic characters.
Try replacing
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
with
pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')
Or checkout this answer to html to pdf for a Django site?
I faced the same problem with cyrillic characters.
The solution contained two steps: 1. Point out the font file in your HTML file
<style type="text/css">
@font-face {
font-family: Arial; src: url("files/arial.ttf");
}
body {
font-family: Arial;
}
</style>
2. Give "pisa" root path (so that it find font file by relative path) in my case it was something like this
pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT)
because fonts were placed at PATH_TO_DJANGO_PROJECT/files/arial.ttf
This does work for me:
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')
If you are calling createPDF instead of the pisaDocument method, you can use
pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')