- html5lib==0.95
- pisa==3.0.33
- reportlab==2.7
Crie um arquivo chamado report.py na raiz do seu projeto com o conteúdo abaixo:
# -*- coding: utf-8 -*-
from django import http
from django.conf import settings
from django.http import HttpResponse
from django.template import Context
from django.template import RequestContext
from django.template.loader import get_template
from django.template.loader import render_to_string
import cgi, os
import cStringIO as StringIO
import ho.pisa as pisa
def fetch_resources(uri, rel):
path = os.path.join(settings.STATIC_PATH, uri.replace(settings.MEDIA_URL, ""))
return path
def write_to_pdf(template_src, context_dict, filename):
template = get_template(template_src)
context = Context(context_dict)
html = template.render(context)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, link_callback=fetch_resources)
if not pdf.err:
response = http.HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=%s.pdf' % filename
response.write(result.getvalue())
# OPCIONAL, CASO QUEIRA GERAR O ARQUIVO EM DISCO
f = open('%s/uploads/projetos/%s.pdf' % (settings.MEDIA_ROOT, filename), 'w+')
f.write(result.getvalue())
f.close()
return response
return http.HttpResponse('Problema ao gerar PDF: %s' % cgi.escape(html))
Crie a view que será responsável pela chamada da geração do PDF:
from app.report import write_to_pdf
def projeto2pdf(request, slug=None):
projeto = get_object_or_404(Projeto, slug=slug)
response = write_to_pdf('template_pdf.html', {'projeto': projeto}, projeto.slug)
return response
Caso seu template possua alguma imagem, lembre-se de colocar nos src das tags img apenas o caminho a partir do caminho definido na def fetch_resorces do arquivo report.py
... <img src="site/img/sua_imagem.png" alt="imagem" width="176" height="103"> ...
Agora basta criar a url para a chamada da view:
...url(r'^projeto2pdf/(?P<slug>[-\w]+)/$', 'projeto2pdf', name='projeto2pdf'), ...
hasta!