Para emitir un ticket en formato HTML y PDF después de obtener el CAE, puedes seguir estos pasos:
- Generar el HTML: Descarga un HTML de ejemplo y personalízalo con los datos de tu factura. Puedes usar Jinja2 para renderizar el HTML con los datos de tu comprobante. Aquí tienes un ejemplo de cómo hacerlo en Python:
from jinja2 import Template
# Leemos el HTML descargado
html = open("./bill.html").read()
# Iniciamos el template con el HTML
template = Template(html)
# Generamos el HTML con los datos de nuestro comprobante
template_html = template.render(
business_data=business_data,
bill=bill,
items=items,
billing_data=billing_data,
overall=overall,
qr_code_image=qr_code_image
)
- Crear el PDF: Usa
pdfkitpara convertir el HTML en un PDF. Asegúrate de tenerwkhtmltopdfinstalado. Aquí tienes un ejemplo de cómo hacerlo:
import pdfkit
# Guardamos el PDF como Comprobante.pdf
pdfkit.from_string(template_html, 'Comprobante.pdf')
Si prefieres usar el Afip SDK para crear el PDF, puedes hacerlo de la siguiente manera:
from afip import Afip
# CUIT que emitió la factura
CUIT = 20409378472
afip = Afip({"CUIT": CUIT})
# Generamos el PDF
name = "PDF de prueba"
options = {
"width": 8,
"marginLeft": 0.4,
"marginRight": 0.4,
"marginTop": 0.4,
"marginBottom": 0.4
}
res = afip.ElectronicBilling.createPDF({
"html": template_html,
"file_name": name,
"options": options
})
# Mostramos la URL del archivo creado
print(res["file"])
Para más detalles, consulta la documentación de Afip SDK.
¿Te gustaría más detalles sobre algún paso en particular?
Sources:
OK, pero que datos coloca en el PDF si no sabe que productos tienen que figurar ni tampoco los valores de cada uno?
@user OK, pero que datos coloca en el PDF si no sabe que productos tienen que figurar ni tampoco los valores de cada uno?
Parece que los detalles de los productos o servicios no se envían a AFIP, sino que se incluyen en el PDF que generas para el cliente. Según Afip SDK Documentation, debes preparar los datos del comprobante, incluyendo los detalles de los productos o servicios, antes de generar el PDF. Estos datos se pasan al template HTML que luego se convierte en PDF.
Para incluir los productos y sus valores, debes crear un diccionario o lista con los detalles de cada producto o servicio, como el nombre, cantidad, precio, etc., y luego pasarlos al template HTML. Aquí tienes un ejemplo de cómo podrías estructurar los datos:
items = [
{
'code': '001',
'name': 'Producto A',
'quantity': '2',
'measurement_unit': 'Unidad',
'price': '50.00',
'subtotal': '100.00'
},
{
'code': '002',
'name': 'Producto B',
'quantity': '1',
'measurement_unit': 'Unidad',
'price': '75.00',
'subtotal': '75.00'
}
]
Estos datos se integran en el HTML mediante un motor de plantillas como Jinja2, y luego se genera el PDF con pdfkit o el método createPDF del Afip SDK.
¿Te gustaría más detalles sobre cómo integrar estos datos en el HTML?
Sources:
@user Si, quiero mas detalles sobre como integrar estos datos usando Jinja2
Para integrar los datos de los productos en el HTML usando Jinja2, sigue estos pasos:
- Prepara el HTML con marcadores de posición: Asegúrate de que tu archivo
bill.htmltenga marcadores de posición para los datos que deseas integrar. Por ejemplo:
<!DOCTYPE html>
<html>
<head>
<title>Factura</title>
</head>
<body>
<h1>Factura</h1>
<p>Cliente: {{ billing_data.name }}</p>
<p>Fecha: {{ bill.date }}</p>
<table>
<thead>
<tr>
<th>Código</th>
<th>Nombre</th>
<th>Cantidad</th>
<th>Precio</th>
<th>Subtotal</th>
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td>{{ item.code }}</td>
<td>{{ item.name }}</td>
<td>{{ item.quantity }}</td>
<td>{{ item.price }}</td>
<td>{{ item.subtotal }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<p>Total: {{ overall.total }}</p>
</body>
</html>
- Renderiza el HTML con Jinja2: Usa Jinja2 para reemplazar los marcadores de posición con los datos reales de tu factura.
from jinja2 import Template
# Leemos el HTML descargado
html = open("./bill.html").read()
# Iniciamos el template con el HTML
template = Template(html)
# Datos de ejemplo
billing_data = {'name': 'Pepe Perez'}
bill = {'date': '2025-03-01'}
items = [
{'code': '001', 'name': 'Producto A', 'quantity': '2', 'price': '50.00', 'subtotal': '100.00'},
{'code': '002', 'name': 'Producto B', 'quantity': '1', 'price': '75.00', 'subtotal': '75.00'}
]
overall = {'total': '175.00'}
# Generamos el HTML con los datos de nuestro comprobante
template_html = template.render(
billing_data=billing_data,
bill=bill,
items=items,
overall=overall
)
- Genera el PDF: Usa
pdfkitpara convertir el HTML renderizado en un PDF.
import pdfkit
# Guardamos el PDF como Comprobante.pdf
pdfkit.from_string(template_html, 'Comprobante.pdf')
Este proceso te permitirá integrar los datos de los productos en el HTML y generar un PDF listo para enviar al cliente.
Sources: