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

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • Hey Nadine

    Hey Nadine

    24 Kasım 2006
  • thepoke64738

    thepoke64738

    17 HAZİRAN 2011