SDK para Python
Conversión CFDI a PDF
El SDK de Python para la conversión de CFDI a PDF te permite procesar comprobantes de cualquier tipo, ya sean de Ingreso, Egreso, Traslado, Nómina o Pago, tanto de las versiones CFDI 4.0 como de la CFDI 3.3. Además, te ofrece control total sobre la personalización del diseño del PDF.
Instalación
pip install redocmx
Copiar
Conversión
A continuación, se presenta un ejemplo práctico de cómo utilizar redocmx para convertir un CFDI a PDF de manera instantánea.
from redocmx import RedocmxClient
# Inicializa Redoc con tu API key.
redoc = RedocmxClient('api_key')
# Cargar la ruta del XML del CFDI.
cfdi = redoc.cfdi.from_file('./cfdi.xml')
try:
# Convertir el CFDI a PDF.
pdf = cfdi.to_pdf()
# Guardar el PDF del CFDI en el sistema de archivos.
with open('./resultado.pdf', 'wb') as pdf_file:
pdf_file.write(pdf.to_buffer())
except Exception as e:
print("Se produjo un error durante la conversión:", e)
Copiar
Personalización del PDF
Para personalizar el PDF generado a partir de tu CFDI, puedes utilizar la addenda de Redoc, diseñada específicamente para ofrecer una experiencia de uso sencilla y rápida. Consiste en un XML de estructura predefinida que te permite personalizar el resultado de tu PDF de manera eficiente y directa.
from redocmx import RedocmxClient
# Inicializa Redoc con tu API key.
redoc = RedocmxClient('api_key')
# Cargar la ruta del XML de la Addenda de Redoc.
addenda = redoc.addenda.from_file('./addenda.xml')
# Cargar la ruta del XML del CFDI.
cfdi = redoc.cfdi.from_file('./cfdi.xml')
# Aplica addenda al CFDI.
cfdi.set_addenda(addenda)
try:
# Convertir el CFDI a PDF.
pdf = cfdi.to_pdf()
# Guardar el PDF del CFDI en el sistema de archivos.
with open('./resultado.pdf', 'wb') as pdf_file:
pdf_file.write(pdf.to_buffer())
except Exception as e:
print("Se produjo un error durante la conversión:", e)
Copiar
Ejemplo para personalizar CFDI a PDF
Avanzado
Para personalizar la conversión de CFDI a PDF, se utiliza una addenda de Redoc en XML con Python. Cada solicitud de conversión usa una addenda para personalizar el PDF (ajustes como logo e idioma entre muchos otros más). El resultado es un documento PDF almacenado, personalizado según las especificaciones del cliente.
from redocmx import RedocmxClient
"""
Datos de ejemplo de las solicitudes, tu puedes definirlos y usar los que quieras.
"""
requests = [
{ "client_id": "123", "cfdi_path": "./cfdi-123.xml", "language": "es" },
{ "client_id": "456", "cfdi_path": "./cfdi-456.xml", "language": "en" }
];
"""
Inicializa la instancia de Redoc con la clave API.
Recomendación:
Para evitar colocar directamente la clave en tu código,
puedes definirla en la variable de entorno REDOC_API_KEY
y usar RedocmxClient() sin parámetros.
"""
redoc = RedocmxClient("api_key")
"""
Carga una addenda de Redoc desde un archivo XML.
Esta addenda es reutilizable para todas las conversiones de CFDI a PDF.
"""
addenda = redoc.addenda.from_file("./addenda.xml")
"""
Función asíncrona para procesar cada solicitud de CFDI individualmente.
"""
def processCfdi(request):
try:
"""
Carga el archivo XML del CFDI del cliente especificado en la solicitud.
"""
cfdi = redoc.cfdi.from_file(request["cfdi_path"]);
"""
Aplica la addenda al CFDI.
Opcional:
Utiliza un dictionario de llave-valor para personalizas aspectos
como el logotipo y el idioma para distintos clientes.
Es importante usar prefijos únicos en las claves para evitar
conflictos, como CUSTOM_VALUE_CLIENT_ID y CUSTOM_VALUE_LANGUAGE.
"""
cfdi.set_addenda(addenda, {
"CUSTOM_VALUE_CLIENT_ID": request["client_id"],
"CUSTOM_VALUE_LANGUAGE": request["language"]
});
"""
Convierte el CFDI en PDF.
Opcional:
Si tienes estilos personalizados creados en la interfaz web de
Redoc, puedes referenciarlos aquí.
Ten en cuenta que los valores específicos en la addenda pueden
sobrescribir los ajustes de estos estilos predefinidos.
"""
pdf = cfdi.to_pdf({
"style_pdf": "client-" + request["client_id"]
});
"""
Almacena el PDF generado.
"""
with open("./resultado-" + request["client_id"] + ".pdf", "wb") as pdf_file:
pdf_file.write(pdf.to_buffer())
except Exception as e:
print("Se produjo un error durante la conversión:", e)
for request in requests:
processCfdi(request)
Copiar
Métodos
redoc
Método |
---|
redoc.cfdi.from_file( filePath ) Instancia Cfdi- Carga el contenido de un archivo del sistema para convertir un CFDI a PDF.
- El archivo debe ser XML válido para un CFDI.
|
redoc.cfdi.from_string( xmlContent ) Instancia Cfdi- Carga el contenido de un CFDI a partir de una cadena de texto
- La cadena de texto debe ser de un CFDI valido.
|
redoc.addenda.from_file( filePath ) Instancia Addenda- Carga el contenido de un archivo del sistema para usar como addenda y personalizar los PDF.
- El archivo debe ser XML válido de la addenda de Redoc, ver addenda.
|
redoc.addenda.from_string( xmlContent ) Instancia Addenda- Carga el contenido de una addenda de Redoc a partir de una cadena de texto
- La cadena de texto debe ser de un XML valido de la adenda de Redoc, ver addenda.
|
cfdi
Método | Descripción |
---|---|
cfdi.set_addenda( addenda ) | Opcional recibe una instancia de la addenda de redoc para tener control total sobre el diseño del PDF final. |
cfdi.to_pdf( PdfConversionOptions ) |
Retorna Instancia Pdf
Convierte el CFDI a PDF de forma síncrona y retorna una instancia de la clase Pdf
|
Método | Descripción |
---|---|
pdf.to_buffer() |
Retorna Buffer
Devuelve el documento PDF en formato buffer, listo para ser almacenado o enviado en una respuesta HTTP.
|
pdf.get_transaction_id() |
Retorna String - UUID
Un ID único para la solicitud de transacción al servicio de redoc.
|
pdf.get_total_pages() |
Retorna Integer
El número total de páginas generadas para el archivo PDF.
|
pdf.get_total_time_ms() |
Retorna Integer
Tiempo en milisegundos que toma convertir el CFDI a PDF.
|
pdf.get_metadata() |
Retorna Diccionario - CfdiMetadata
Retorna un diccionario con metadatos del CFDI convertido.
|
Tipos
PdfConversionOptions
Opción | Descripción |
---|---|
style_pdf |
Nombre del estilo utilizado en la conversión, disponible para creación a través de la interfaz web de tu cuenta.
Es posible emplear tanto los estilos como la addenda; sin embargo, si optas por ambos, considera que la addenda puede modificar parcialmente la configuración establecida por los estilos.
Crear un estilo
|
email_to | Próximamente... |
CfdiMetadata
Opción | Descripción |
---|---|
Próximamente... | Próximamente... |