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

  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • TeachMeComputer

    TeachMeCompu

    31 EKİM 2009
  • TheRightTire

    TheRightTire

    14 EKİM 2009