Aprende a crear archivos PDF en Django desde HTML usando wkhtmltopdf.

Cómo crear un PDF a partir de HTML en Django

A diferencia de PHP, no hay muchas bibliotecas disponibles para crear archivos PDF a partir de HTML en Python, sin embargo, no es incompatible. En este artículo, aprenderá a crear archivos PDF usando wkhtmltopdf en Django.

wkhtmltopdf es una herramienta de línea de comandos para convertir HTML en PDF y varios formatos de imagen utilizando el motor de renderizado Qt WebKit. Estos funcionan completamente "sin cabeza" y no requieren un servicio de visualización o visualización.

Requisitos

Necesita wkhtmltopdf disponible en su sistema y accesible en el símbolo del sistema.

  • Windows: puedes descargar un instalador para cada arquitectura (x86 y x64) en el área de instalación . Aunque puede cambiar la ruta del ejecutable wkhtmltopdf más adelante en el código , es recomendable tener wkhtmltopdf accesible como variable de entorno en su sistema. Puede leer cómo crear variables de entorno en Windows en este artículo .
  • Debian / Ubuntu: puedes instalar la distribución de wkhtmltopdf directamente en la consola usando el siguiente comando:
$ sudo apt-get install wkhtmltopdf

¡Advertencia! La versión en repositorios de Debian/Ubuntu tienen una funcionalidad reducida (porque se compiló sin los parches QT de wkhtmltopdf), como agregar esquemas, encabezados, pies de página, TOC, etc. Para usar estas opciones, debe instalar el binario estático del sitio wkhtmltopdf o puedes usar este script .

Visite la página de inicio de wkhtmltopdf para obtener más información aquí .

Implementación

Ahora que tenemos wkhtmltopdf disponible en nuestro entorno, ¡solo necesitamos usarlo! sin embargo, en lugar de manejar los comandos de la consola usted mismo, use PDFKit para crear archivos PDF fácilmente en Django. PDFKit es un contenedor de Python para convertir html a pdf usando el motor de renderizado webkit (wkhtmltopdf) y qt, puede visitar el repositorio en Github para obtener más información .

Incluye la biblioteca PDFKit en tu proyecto django usando el siguiente comando:

$ pip install pdfkit

Como wkhtmltopdf hace el trabajo duro por usted, el uso de PDFKit es realmente simple y cubre casi todos los casos de uso:

  • Crea un PDF a partir de una cadena html.
  • Cree un PDF a partir de una URL web (URL externa o del proyecto).
#import pdfkit into your class
import pdfkit

# Generate PDF from a web URL (maybe only from your project)
pdfkit.from_url('http://google.com', 'out.pdf')
# Generate PDF from a html file.
pdfkit.from_file('file.html', 'out.pdf')
# Generate PDF from a plain html string.
pdfkit.from_string('Hello!', 'out.pdf')

# Save the PDF in a variable
myPdf = pdfkit.from_url('http://google.com', False)

Y básicamente está generando archivos PDF sobre la marcha de manera fácil y rápida.

Ejemplos

Es fácil generar archivos PDF con Django y PDFKit, consulte los siguientes ejemplos:

Guardar PDF en el servidor

Para guardar un PDF localmente, use cualquier método y proporcione la ruta y el nombre del archivo donde se debe guardar el archivo como segundo parámetro.

import pdfkit
from django.http import HttpResponse

def index(request):
    pdf = pdfkit.from_url("http://ourcodeworld.com", "ourcodeworld.pdf")

    return HttpResponse("Everything working good, check out the root of your project to see the generated PDF.")

El ejemplo anterior creará un PDF en la raíz de su proyecto Django .

Devolver PDF como respuesta

Puede recuperar directamente un archivo de PDFKit sin guardarlo en su sistema, solo proporcione False como parámetro de destino.

Puede utilizar el siguiente fragmento para devolver un PDF como respuesta:

import pdfkit
from django.http import HttpResponse

def index(request):
    # Use Falso en lugar de la ruta de salida para guardar PDF en una variable
    pdf = pdfkit.from_url('http://ourcodeworld.com', False)
    response = HttpResponse(pdf,content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'

    return response

Si navegas a la ruta con esta función, el navegador comenzará a descargar el PDF generado por el controlador.

Generar PDF a partir de una ruta de proyecto

Puedes generar un PDF a partir de una ruta (obviamente, debe estar registrado) de su proyecto y utilizar el método pdf.from_url.

import pdfkit
from django.http import HttpResponse

def template(request):
    # Devuelve algo de HTML como respuesta
    return HttpResponse("<h1>Hello World</h1>")

def pdf(request):

    # Crea una URL de nuestro proyecto y ve a la ruta de la plantilla
    projectUrl = request.get_host() + '/template'
    pdf = pdfkit.from_url(projectUrl, False)
    # Generar descarga
    response = HttpResponse(pdf,content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'

    return response

La salida en pdf será un documento con Hello World! como contenido.

Nota: como alternativa, en lugar de crear una solicitud a un punto final de su proyecto, puede representar una plantilla en una variable como html y luego usar el método pdfkit.from_string.

Otros ajustes

Ruta wkhtmltopdf personalizada

Si desea modificar la ruta donde se encuentra wkhtmltopdf, puede cambiarla con el método de configuración de pdfkit:

config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))
pdfkit.from_string("<h1>Hello World</h1>", output_file, configuration=config)

Configuración de PDF

Puede especificar todas las opciones de wkhtmltopdf . Puedes colocar '-' en el nombre de la opción. Si la opción sin valor, uso NoneFalse o '' para el valor dict:

options = {
    'page-size': 'Letter',
    'margin-top': '0.75in',
    'margin-right': '0.75in',
    'margin-bottom': '0.75in',
    'margin-left': '0.75in',
    'encoding': "UTF-8",
    'no-outline': None
}

pdfkit.from_url('http://google.com', 'out.pdf', options=options)

Salida wkhtmltopdf

Por defecto, PDFKit mostrará todos los resultados wkhtmltopdf:

wkhtmltopdf output

Si no lo deseas, debes establecer la opción silenciosa en la configuración del método que utiliza:

options = {
    'quiet': ''
}

pdfkit.from_url('google.com', 'out.pdf', options=options)

Solución de problemas básicos

Hay dos problemas comunes conocidos al usar PDFKit en Python:

IOError - No se encontró el ejecutable wkhtmltopdf

Este error se produce porque no hay distribución wkhtmltopdf en su sistema. En caso de que ya lo haya instalado, probablemente no esté disponible como comando en la consola. Abra la consola del sistema y verifique si existe el comando wkhtmltopdf .

IOError - Error de comando

Algo salió mal con wkhtmltopdf y no se pudo lograr la operación. Intente ejecutar el comando simple en la consola y verifique cualquier posible error (la página web no existe, el archivo no existe, etc.).


Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores