将Django模板转换为pdf

时间:2016-06-26 05:36:53

标签: javascript python django pdf

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用付费库,即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

答案 2 :(得分:0)

选项A:刮痧

您可以使用PhantomJSCasperJS之类的内容来浏览和抓取HTML页面。

选项B:生成

您可以使用PyPDF之类的内容作为suggested here

哪个选项更好?

刮痧使您无需维护两个模板。使用Generation,您可以通过专门为PDF编写并隐式拥有两个模板来获得更多控制权。