【问题标题】:Convert Django template to pdf将 Django 模板转换为 pdf
【发布时间】:2016-10-28 09:08:48
【问题描述】:

我的应用程序需要将报告邮寄给客户,因此我需要一种有效的方法将动态模板转换为 pdf 报告(包括通过 chart.js 生成的图像)​​。我已经尝试过 pdfkit,但它需要一个 URL(它很可能在该 URL 上执行 GET,但是模板会在几次 AJAX 调用后生成报告,因此 GET 将只返回带有一些过滤器的普通页面)和它不包含图像(我猜我可以通过使用 dataToURL 将图表图像转换为 png 并保存在服务器上来解决)。

我在这里看到的唯一选择是保存所有动态生成的数据以及 html 标签,并在服务器上重新创建文件,然后转换为 pdf。我确信有更好的解决方案。抱歉,如果这看起来很基本,但我不是专业的程序员。

【问题讨论】:

    标签: javascript python django pdf


    【解决方案1】:

    选项 A:抓取

    您可以使用 PhantomJSCasperJS 之类的东西来导航和抓取 HTML 页面。

    选项 B:生成

    您可以将PyPDF 之类的东西用作suggested here

    哪个选项更好?

    抓取使您不必维护两个模板。借助 Generation,您可以通过专门为 PDF 编写并且隐式拥有两个模板这一事实获得更多控制权。

    【讨论】:

    • 谢谢安东尼 .. 我转向 B :) 鉴于下面的伊恩也指向类似的东西 ..感谢帮助
    【解决方案2】:

    Django 有一些输出 PDF 的选项,其中最灵活的是 ReportLab

    但是,要在传递上下文数据的同时将 Django 模板渲染为 PDF,Weasyprint/xhtml2pdf 非常简单。下面是使用早期 xhtml2pdf 库的示例视图。这是一个标准的 Django 视图。

    需要明确的是,所有这些库都采用 Django 模板,对其进行渲染,然后返回 PDF。有一些限制(例如,比萨只有少数几个可以渲染的 CSS 参数)。无论如何,看看这三个;至少有一个会完全满足您的需要。

    from django_xhtml2pdf.utils import generate_pdf
    
    def myview(request):
        resp = HttpResponse(content_type='application/pdf')
        dynamic_variable = request.user.some_special_something
        context = {'some_context_variable':dynamic_variable}
        result = generate_pdf('my_template.html', file_object=resp, context=context)
        return result
    

    【讨论】:

    • 谢谢维克拉姆!我在整个生产环境中都使用 Pisa,这是一个非常可靠的解决方案。如果这个答案有帮助,请投票或标记为答案,谢谢!
    • 当然,伊恩 ..没有足够的回购协议来投票,但我在你的回答中打了“勾”标记 ..我希望这意味着我接受这个作为答案!
    【解决方案3】:

    您可以使用付费库,即 pdfcrowd,它将网页转换为 pdf。像这样..

    首次安装-

    pip install pdfcrowd
    

    然后使用库 -

    import pdfcrowd
    from django.http import HttpResponse
    
    def generate_pdf_view(request):
        try:
            # create an API client instance
            client = pdfcrowd.Client("username", "apikey")
    
            # convert a web page and store the generated PDF to a variable
            pdf = client.convertURI("http://www.yourwebpage.com")
    
             # set HTTP response headers
            response = HttpResponse(mimetype="application/pdf")
            response["Cache-Control"] = "max-age=0"
            response["Accept-Ranges"] = "none"
            response["Content-Disposition"] = "attachment; filename=google_com.pdf"
    
            # send the generated PDF
            response.write(pdf)
        except pdfcrowd.Error, why:
            response = HttpResponse(mimetype="text/plain")
            response.write(why)
        return response
    

    您可以在这里注册-http://pdfcrowd.com/pricing/api/获取用户名和APIKEY

    【讨论】:

    • 感谢 Ashok,但我正在引导我的冒险,而且定价对我来说有点沉重(考虑到我必须打印的报告数量)..感谢帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2023-02-24
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多