在Django网站中将HTML渲染为PDF

发布于 2021-01-29 15:00:15

对于我的django网站,我正在寻找一种将动态html页面转换为pdf的简单解决方案。

页面包含HTML和Google可视化API的图表(该图表基于javascript,但必须包含这些图表)。

关注者
0
被浏览
88
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尝试从Reportlab解决方案。

    下载并像往常一样使用python setup.py install安装

    您还需要安装以下模块:带有easy_install的xhtml2pdf,html5lib,pypdf。

    这是一个用法示例:

    首先定义此功能:

    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))
    

    然后,您可以像这样使用它:

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

    模板:

    <!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>
    

    希望能帮助到你。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看