SDK para C#

Conversión CFDI a PDF

El SDK de C# 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

  dotnet add package Redocmx
  

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.

  using Redocmx;

class App
{
    static async Task Main(string[] args)
    {
        // Inicializa Redoc con tu API key.
        var redoc = new Redoc("api_key");

        // Cargar la ruta del XML del CFDI.
        var cfdi = redoc.Cfdi.FromFile("./cfdi.xml");

        try
        {
            // Convertir el CFDI a PDF.
            var pdf = await cfdi.ToPdfAsync();

            // Guardar el PDF del CFDI en el sistema de archivos.
            await File.WriteAllBytesAsync("./resultado.pdf", pdf.Buffer);

        }
        catch (Exception ex)
        {
            Console.Error.WriteLine($"Se produjo un error durante la conversión:': {ex.Message}");
        }
    }
}

  

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.

  using Redocmx;

class App
{
    static async Task Main(string[] args)
    {
        // Inicializa Redoc con tu API key.
        var redoc = new Redoc("api_key");

        // Cargar la ruta del XML de la Addenda de Redoc.
        var addenda = redoc.Addenda.FromFile("./addenda.xml");

        // Cargar la ruta del XML del CFDI.
        var cfdi = redoc.Cfdi.FromFile("./cfdi.xml");

        // Aplica addenda al CFDI.
        cfdi.SetAddenda(addenda);

        try
        {
            // Convertir el CFDI a PDF.
            var pdf = await cfdi.ToPdfAsync();

            // Guardar el PDF del CFDI en el sistema de archivos.
            await File.WriteAllBytesAsync("./resultado.pdf", pdf.Buffer);

        }
        catch (Exception ex)
        {
            Console.Error.WriteLine($"Se produjo un error durante la conversión:': {ex.Message}");
        }
    }
}

  

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

  using Redocmx;

public class Request
{
    public required string ClientId { get; set; }
    public required string CfdiPath { get; set; }
    public required string Language { get; set; }
}

public class App
{
    public static async Task Main(string[] args)
    {
        /*
          Datos de ejemplo de las solicitudes, tu puedes definirlos y usar los que quieras.
        */
        List<Request> requests = new()
        {
            new Request { ClientId = "123", CfdiPath = "./cfdi-123.xml", Language = "es" },
            new Request { ClientId = "456", CfdiPath = "./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.
        */
        Redoc 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.
        */
        Addenda addenda = redoc.Addenda.FromFile("./addenda.xml");

        foreach (Request request in requests)
        {
            await ProcessCfdiAsync(request, redoc, addenda);
        }
    }

    /*
      Función asíncrona para procesar cada solicitud de CFDI individualmente.
    */
    public static async Task ProcessCfdiAsync(Request request, Redoc redoc, Addenda addenda)
    {
        try
        {
            /*
              Carga el archivo XML del CFDI del cliente especificado en la solicitud.
            */
            Cfdi cfdi = redoc.Cfdi.FromFile(request.CfdiPath);

            /*
              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, new Dictionary<string, string>
            {
                { "CUSTOM_VALUE_CLIENT_ID", request.ClientId },
                { "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 pdf = await cfdi.ToPdfAsync(new Dictionary<string, string>
            {
                { "style_pdf", "client-" + request.ClientId }
            });

            /*
              Almacena el PDF generado.
            */
            await File.WriteAllBytesAsync("./resultado-" + request.ClientId + ".pdf", pdf.Buffer);

        }
        catch (Exception e)
        {
            Console.WriteLine("Se produjo un error durante la conversión: " + e.Message);
        }
    }
}
  

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.ToPdfAsync( 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.Buffer
Buffer
Devuelve el documento PDF en formato buffer, listo para ser almacenado o enviado en una respuesta HTTP.
pdf. TransactionId
String - UUID
Un ID único para la solicitud de transacción al servicio de redoc.
pdf.TotalPages
Integer
El número total de páginas generadas para el archivo PDF.
pdf.TotalTimeMs
Integer
Tiempo en milisegundos que toma convertir el CFDI a PDF.
pdf.Metadata
Diccionario - CfdiMetadata
Retorna un diccionario 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...