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

  • ChasesAndCrashes

    ChasesAndCra

    31 Temmuz 2009
  • gsipek

    gsipek

    20 Temmuz 2007
  • MyCyberAcademy

    MyCyberAcade

    2 EKİM 2011