Как преобразовать html в pdf в django?

Я начинаю работать с Django, работаю с HTML и хочу конвертировать в pdf. У меня есть представление, в котором я получаю данные, зарегистрированные в моей БД по id:

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

This renders me the following html, it is something simple:

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

Буду благодарен за любую помощь!

Вы можете использовать wkhtml2pdf, которому понадобится HTML документ и он сгенерирует pdf файл, затем вернет сгенерированный файл пользователю, что-то вроде этого

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 FileStream(open("/tmp/report.pdf","rb"), as_attachment=True)

Выполнить это без внешней библиотеки будет довольно сложно и потребует транспонирования 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

Для более сложных случаев использования вам, вероятно, стоит обратиться к документации, ссылка на которую приведена выше.

Вернуться на верх