Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>As mentioned by other people the best way to do this is to generate a template then convert the result, using one of the many libraries around, into a PDF. This method provides you with the usual amount of control over your templates, for example using tags.</p> <p>I've used the previously mentioned ReportLab/Pisa setup but found it to be quite limiting, most layouts have to be built using tables and many parts of the CSS2 spec aren't implemented yet.</p> <p>An easier to use library is <a href="http://code.google.com/p/wkhtmltopdf/" rel="nofollow noreferrer">wkhtmltopdf</a> which is a headless distribution of WebKit. This has the benefit of rendering your templates like any webkit browser would and thus letting you use webkit specific extras, such as parts of the CSS3 spec that exist in WebKit.</p> <p>Using the wrapper library <a href="https://github.com/incuna/django-wkhtmltopdf" rel="nofollow noreferrer">django-wkhtmltopdf</a> you can <code>render_to_pdf</code> in your view instead of the usual Django <code>render_to_response</code>.</p> <p>Disclaimer: I am a contributor to this library.</p> <h2>Update</h2> <p>This library has been converted to CBVs and most of the information below (which I'll leave to help add some context) is now implemented in the library itself for convenience.</p> <p>See the <a href="http://django-wkhtmltopdf.readthedocs.org/en/latest/index.html#quickstart" rel="nofollow noreferrer">quickstart</a> docs for an example of how to implement the below code block. If you need to use more advanced usage you can subclass <code>PDFTemplateView</code> and add various options like filename and the margins.</p> <p>An example view:</p> <pre><code>from django.shortcuts import render_to_response from wkhtmltopdf import render_to_pdf def pdf(request): context.update({'objects': ModelA.objects.filter(p_id=100)}) kwargs = {} if request.GET and request.GET.get('as', '') == 'html': render_to = render_to_response else: render_to = render_to_pdf kwargs.update(dict( filename='model-a.pdf', margin_top=0, margin_right=0, margin_bottom=0, margin_left=0)) return render_to('pdf.html', context, **kwargs) </code></pre> <p>The conditional statement here lets you pass ?as=html to the view so you can develop in the browser. It's a bit of an ugly way to do it currently but there are plans to fix this in a release soon.</p> <p>Using this view you could loop the contents of <code>objects</code> in your view as you would normally and even extend your base template. I've normally used a different stylesheet specifically for the PDFs for maintainability and readability of the styles as you need to do a few things differently for PDFs, such as setting a min-height if you want to keep your footer block in the same place.</p> <p>On this note, you can create header and footer templates that will be used on each page of your PDF by passing them into render_to_pdf as part of <code>kwargs</code>.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload