如何在Django中转换html于pdf?

dtcbnfnu  于 2023-05-08  发布在  Go
关注(0)|答案(2)|浏览(118)

我从Django开始,我使用HTML,我想转换为PDF。我有这个视图,我通过id获取在我的DB中注册的数据:

def contrato(request, id):
return render(request,'contrato\contrato.html', {'asociado': get_queryset(id)})

这给我呈现了下面的html,它很简单:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CPS</title>
    
</head>
<body>
    <h1>Contrato de Prestación de Servicios</h1>
    <div>         
        <ul>
            {% for dato in asociado %}
            <li>Función/Título: {{ dato.job_title }}</li>
            <li>nombre completo: {{ dato.first_name }} {{ dato.last_name }}</li>
            <li>Email: {{ dato.email }}</li>
            <li>RFC: {{ dato.rfc }}</li>
            <li>CURP: {{ dato.curp }}</li>
            <li>Clabe: {{ dato.interbank_key }}</li>
            <li>País:  {{ dato.country }}</li>
            <li>Status:  {{ dato.status }}</li>
            <li>Creado: {{dato.created}}</li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>

我如何将此HTML转换为PDF与注册数据下载。我只实现了一个空的PDF(没有数据)或只有H1头。
我将感谢任何帮助!

bf1o4zei

bf1o4zei1#

在没有外部库的情况下这样做将是非常复杂的,并且涉及到将HTML转换为PDF。
相反,你可能会想使用像xhtml2pdf这样的库。
首先pip install xhtml2pdf。然后更新您的控制器功能:

from xhtml2pdf import pisa
  
  # ...
  
  def contrato(request, id):
    if request.path_info.split('.')[-1] == "pdf"
      return render_pdf(request, 'contrato/contrato.html', {'asociado': get_queryset(id)})

    return render(request, 'contrato\contrato.html', {'asociado': get_queryset(id)})

  def render_pdf(request, template_path, context)
    filename = f'{template_path.split('.')[0]}.pdf'
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = f'attachment; filename="{filename}"'

    template = get_template(template_path)
    html = template.render(context)

    pisa_status = pisa.CreatePDF(html, dest=response)

    if pisa_status.err:
      return HttpResponse(f'We had some errors <pre>{html}</pre>')

    return response

对于更高级的用例,您可能需要参考上面链接的文档。

hs1rzwqc

hs1rzwqc2#

您可以使用wkhtml2pdf,它将需要一个HTML文档,并将生成一个pdf文件,然后将生成的文件返回给用户,类似于以下内容

from django.http import FileResponse
def contrato(request, id):
   HTML =  render(request,'contrato\contrato.html', {'asociado': get_queryset(id)}).content
   f = open("/tmp/report.html","w")
   f.write(HTML)
   f.close()
   import subprocess
   subprocess.run("wkhtml2pdf /tmp/report.html /tmp/report.pdf")
   return FileResponse(open("/tmp/report.pdf","rb"), as_attachment=True)

相关问题