Advertisement
Guest User

Untitled

a guest
Jun 5th, 2013
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. #-*- coding: utf-8 -*-
  2. import StringIO
  3. import os
  4.  
  5. from django.utils import html
  6. from django.conf import settings
  7. from django.http.response import HttpResponse
  8. from django.template.context import RequestContext
  9. from django.template.loader import render_to_string
  10. from django.views.generic import View
  11.  
  12. from sx.pisa3 import pisa
  13.  
  14.  
  15. class PdfView(View):
  16. pdf_template = None
  17.  
  18. _resource_replacements = (
  19. (settings.MEDIA_URL, settings.MEDIA_ROOT),
  20. (settings.STATIC_URL, settings.STATIC_ROOT),
  21. ('../fonts/', settings.STATIC_ROOT + '/fonts/') # must be after STATIC_URL replacement
  22. )
  23.  
  24. def _get_html(self, payload, context=None):
  25. payload.update({'media': self._media})
  26. return render_to_string(self.pdf_template, payload, context_instance=context)
  27.  
  28. def _get_pdf(self, markup):
  29. pdf_file = StringIO.StringIO()
  30. pdf = pisa.pisaDocument(markup.encode("UTF-8"), pdf_file,
  31. link_callback=self._fetch_resources)
  32. return not pdf.err, pdf_file.getvalue()
  33.  
  34. def _get_payload(self, *args, **kwargs):
  35. return {} # Should be overridden in children
  36.  
  37. def _fetch_resources(self, uri, rel):
  38. for old_val, new_val in self._resource_replacements:
  39. if old_val in uri:
  40. uri = os.path.join(new_val, uri.replace(old_val, ""))
  41. return uri
  42.  
  43. def get(self, request, *args, **kwargs):
  44. as_html = kwargs.get('as_html', False)
  45. self._media = 'screen' if as_html else 'print'
  46. markup = self._get_html(self._get_payload(*args, **kwargs), RequestContext(request))
  47. if as_html:
  48. return HttpResponse(markup)
  49. else:
  50. pdf_success, pdf_file = self._get_pdf(markup)
  51. if pdf_success:
  52. response = HttpResponse(pdf_file, mimetype='application/pdf')
  53. response['Content-Disposition'] = 'attachment; filename=list.pdf'
  54.  
  55. else:
  56. response = HttpResponse("Error generating PDF" + html.escape(markup))
  57. return response
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement