django – pisa: aggiunta di immagini all’output PDF

Sto usando un esempio standard dal web ( http://www.20seven.org/journal/2008/11/pdf-generation-with-pisa-in-django.html ) per convertire una vista / modello django in un PDF.

Esiste un modo “facile” per includere le immagini (da un URL o un riferimento sul server) nel modello in modo che vengano visualizzate nel PDF?

Ho ottenuto il lavoro delle immagini. il codice è il seguente:

from django.http import HttpResponse from django.template.loader import render_to_string from django.template import RequestContext from django.conf import settings import ho.pisa as pisa import cStringIO as StringIO import cgi import os def dm_monthly(request, year, month): html = render_to_string('reports/dmmonthly.html', { 'pagesize' : 'A4', }, context_instance=RequestContext(request)) result = StringIO.StringIO() pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources ) if not pdf.err: return HttpResponse(result.getvalue(), mimetype='application/pdf') return HttpResponse('Gremlins ate your pdf! %s' % cgi.escape(html)) def fetch_resources(uri, rel): path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, "")) return path 

Questo è stato preso liberamente da http://groups.google.com/group/xhtml2pdf/browse_thread/thread/4cf4e5e0f4c99f55

Non riuscivo a far apparire le immagini nonostante avessi provato ogni soluzione che potevo trovare su google. Ma questo fudge ha funzionato per me come la versione da riga di comando di pisa visualizza le immagini ok:

  from tempfile import mkstemp # write html to a temporary file # can used NamedTemporaryFile if using python 2.6+ fid, fname = mkstemp(dir='/tmp') f = open(fname, 'w+b') f.write(html) f.close() # now create pdf from the html cmd = 'xhtml2pdf "%s"' % fname os.system(cmd) os.unlink(fname) # get the content of the pdf filename = fname+'.pdf' pdf = open(filename, 'r') content = pdf.read() pdf.close() os.unlink(pdf.name) # return content response = HttpResponse(content, mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=draft.pdf' 

Questo ha funzionato dove le immagini avevano o un url o il nome completo del percorso, ad es.

   
 def render_to_pdf( template_src, context_dict): template = get_template(template_src) context = Context(context_dict) html = template.render(context) result = StringIO.StringIO() if page has an image.something: pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources) else no image.something : pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")),result) if not pdf.err: return HttpResponse(result.getvalue(), mimetype='examination_report/pdf') return HttpResponse('We had some errors
%s

' % escape(html)) def fetch_resources(uri, rel): if os.sep == '\\': # deal with windows and wrong slashes uri2 = os.sep.join(uri.split('/')) else:# else, just add the untouched path. uri2 = uri path = '%s%s' % (settings.SITE_ROOT, uri2) return path

Tutto il codice sopra non ha funzionato per me. Alla fine ho funzionato mettendo la procedura get_full_path. Quindi il codice finale sembra così

 def render_to_pdf( template_src, context_dict): now = datetime.now() filename = now.strftime('%Y-%m-%d') + '.pdf' 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, path=path) if not pdf.err: response = HttpResponse(result.getvalue(), mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename="'+filename+'"' return response return HttpResponse('We had some errors
%s

' % escape(html)) def get_full_path_x(request): full_path = ('http', ('', 's')[request.is_secure()], '://', request.META['HTTP_HOST'], request.path) return ''.join(full_path)

È sempre ansible aggiungere le immagini successivamente con IText / ISharp.

Puoi anche convertire l’immagine in base64.

http://www.motobit.com/util/base64-decoder-encoder.asp

Convertendo in base64 non avrai mai problemi con i link delle immagini.