SORU
4 EYLÜL 2009, Cuma


Render Django sitedeki PDF için HTML

Django destekli sitem için, dinamik html sayfaları pdf dönüştürmek için kolay bir çözüm arıyorum.

Sayfaları HTML ve Google görselleştirme API grafikler javascript tabanlı, henüz bu grafikler bir zorunluluktur da dahil olmak üzere) vardır.

CEVAP
4 EYLÜL 2009, Cuma


Reportlab çözümü deneyin.

Bunu indirin ve python setup.py yükleme ile her zamanki gibi yükleyin

Ayrıca aşağıdaki modülleri yüklemeniz gerekir: easy_install ile xhtml2pdf, html5lib, pypdf.

Burada kullanım örneği:

İlk önce bu fonksiyonu tanımlayın:

import cStringIO as StringIO
from xhtml2pdf import pisa
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
from cgi import escape


def render_to_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()

    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result)
    if not pdf.err:
        return HttpResponse(result.getvalue(), content_type='application/pdf')
    return HttpResponse('We had some errors<pre>%s</pre>' % escape(html))

O zaman bu gibi kullanabilirsiniz:

def myview(request):
    #Retrieve data or whatever you need
    return render_to_pdf(
            'mytemplate.html',
            {
                'pagesize':'A4',
                'mylist': results,
            }
        )

Şablon:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>My Title</title>
        <style type="text/css">
            @page {
                size: {{ pagesize }};
                margin: 1cm;
                @frame footer {
                    -pdf-frame-content: footerContent;
                    bottom: 0cm;
                    margin-left: 9cm;
                    margin-right: 9cm;
                    height: 1cm;
                }
            }
        </style>
    </head>
    <body>
        <div>
            {% for item in mylist %}
                RENDER MY CONTENT
            {% endfor %}
        </div>
        <div id="footerContent">
            {%block page_foot%}
                Page <pdf:pagenumber>
            {%endblock%}
        </div>
    </body>
</html>

Umarım yardımcı olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MusicDeluxeTV

    MusicDeluxeT

    14 Mayıs 2010
  • TheRightTire

    TheRightTire

    14 EKİM 2009
  • Videojug

    Videojug

    25 EKİM 2006