SDK para Node.js

Conversión CFDI a PDF

El SDK de Node.js 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

  npm install redocmx --save
  

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.

  import fs from 'node:fs/promises'
import Redoc from 'redocmx'

// Inicializa Redoc con tu API key.
const redoc = new Redoc('api_key');

// Cargar la ruta del XML del CFDI.
const cfdi = redoc.cfdi.fromFile('./cfdi.xml');

try {

  // Convertir el CFDI a PDF.
  const pdf = await cfdi.toPdf();
  
  // Guardar el PDF del CFDI en el sistema de archivos.
  await fs.writeFile('./resultado.pdf', pdf.toBuffer());

} catch (err) {
  console.error('Se produjo un error durante la conversión:', err);
}
  

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.

  import fs from 'node:fs/promises'
import Redoc from 'redocmx'

// Inicializa Redoc con tu API key.
const redoc = new Redoc('api_key');

// Cargar la ruta del XML de la Addenda de Redoc.
const addenda = redoc.addenda.fromFile('./addenda.xml');

// Cargar la ruta del XML del CFDI.
const cfdi = redoc.cfdi.fromFile('./cfdi.xml');

// Aplica addenda al CFDI.
cfdi.setAddenda(addenda)

try {

  // Convertir el CFDI a PDF.
  const pdf = await cfdi.toPdf();
  
  // Guardar el PDF del CFDI en el sistema de archivos.
  await fs.writeFile('./resultado.pdf', pdf.toBuffer());

} catch (err) {
  console.error('Se produjo un error durante la conversión:', err);
}
  

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 Node.js. 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.

  import fs from 'node:fs/promises';
import Redoc from 'redocmx';

/*
  Datos de ejemplo de las solicitudes, tu puedes definirlos y usar los que quieras.
*/
const 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 new Redoc() sin parámetros.
*/
const redoc = new Redoc('api_key');

/*
  Carga una addenda de Redoc desde un archivo XML. 
  Esta addenda es reutilizable para todas las conversiones de CFDI a PDF.
*/
const addenda = redoc.addenda.fromFile('./addenda.xml');

/*
  Función asíncrona para procesar cada solicitud de CFDI individualmente.
*/
async function processCfdi(request) {
  try {

    /*
      Carga el archivo XML del CFDI del cliente especificado en la solicitud.
    */
    const cfdi = redoc.cfdi.fromFile(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.setAddenda(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.
    */
    const pdf = await cfdi.toPdf({ 
      style_pdf: `client-${request.client_id}` 
    });
    
    /*
      Almacena el PDF generado.
    */
    await fs.writeFile(`./resultado-${request.client_id}.pdf`, pdf.toBuffer());
  } catch (err) {
    console.error(`Error en la conversión para el cliente ${request.client_id}:`, err);
  }
}

(async () => {
  for (const request of requests) {
    await processCfdi(request);
  }
})();

  

Métodos

Método

redoc.cfdi.fromFile( 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.fromString( 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.fromFile( 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.fromString( 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 aadenda de Redoc, ver addenda.
Método Descripción
cfdi.setAddenda( addenda ) Opcional recibe una instancia de la addenda de redoc para tener control total sobre el diseño del PDF final.
cfdi.toPdf( PdfConversionOptions )
Retorna Promise<Pdf>
Convierte el CFDI a PDF de forma asíncrona y retorna una instancia de la clase Pdf
Método Descripción
pdf.toBuffer()
Retorna Buffer
Devuelve el documento PDF en formato buffer, listo para ser almacenado o enviado en una respuesta HTTP.
pdf.getTransactionId()
Retorna String - UUID
Un ID único para la solicitud de transacción al servicio de redoc.
pdf.getTotalPages()
Retorna Integer
El número total de páginas generadas para el archivo PDF.
pdf.getTotalTimeMs()
Retorna Integer
Tiempo en milisegundos que toma convertir el CFDI a PDF.
pdf.getMetadata()
Retorna Objeto - CfdiMetadata
Retorna un objeto con metadatos del CFDI convertido.

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