Aprende a generar un PDF a partir de HTML usando wkhtmltopdf con C#.

Cómo generar un PDF a partir de HTML usando wkhtmltopdf con C# en WinForms

Para los desarrolladores web, es mucho más fácil crear un PDF a partir del formato HTML, básicamente porque proporciona una mejor opción para administrar el PDF. Para esta tarea, los desarrolladores web utilizan bibliotecas como wkhtmltopdf. wkhtmltopdf es una herramienta de línea de comandos para convertir HTML en PDF utilizando el motor de renderizado QT Webkit. Estos funcionan completamente "sin cabeza" y no requieren un servicio de visualización o visualización.

En este artículo, aprenderá a usar wkhtmltopdf fácilmente con C # en su aplicación Windows Forms.

Requisitos

  • Necesitará Visual Studio con NuGet Package Manager (> = 2010).

En nuestro caso, vamos a utilizar Visual Studio Community, ¡así que comencemos!

1. Instale Pechkin

Para generar un PDF a partir de un archivo HTML con C # en Windows Forms, vamos a usar Pechkin , el .NET Wrapper para wkhtmltopdf  DLL, biblioteca que usa el motor Webkit para convertir páginas HTML a PDF. Pechkin está disponible como un paquete NuGet, en la mayoría de los casos debe usar SynchronizedPechkin ya que protege el código multiproceso para que no bloquee la biblioteca. Pero para un uso simple desde un hilo, puede usar SimplePechkin directamente.

Nota

Pechkin incluye la última versión de wkhtmltox DLL en el proyecto (y en el paquete NuGet) junto con sus dependencias, y se copia en la carpeta de compilación en la compilación del proyecto. Por lo tanto, no es necesario instalar ningún requisito previo antes de usar la biblioteca en la computadora.

Instale el paquete con Visual Studio, accediendo al administrador de paquetes NuGET. Haga clic derecho en su proyecto en el Explorador de soluciones en la parte superior derecha de Visual Studio y seleccione Administrar paquetes NuGet en el menú desplegable:

Solution explorer nuget packages

Ahora desde la ventana emergente busque el paquete Pechkin.Synchronized, selecciónelo e instálelo en su proyecto:

Pechkin.Synchronized NuGET package visual studio

Una vez que finalice la configuración, podrá utilizar el contenedor en su proyecto.

2. Genera un PDF

El método Convert convierte una cadena HTML (o un objeto de configuración) a PDF con la configuración dada y devuelve matrices de bytes que almacenan los datos binarios del PDF.

Nota

Con todos los ejemplos, la variable pdfContent generará solo el contenido del PDF y no verá nada , por lo tanto, no olvide escribir el contenido creado en un archivo siguiendo el paso # 3.

A. Generar PDF simple a partir de una cadena HTML

Puede crear un PDF rápidamente con un objeto de configuración global vacío. Importe el tipo Pechkin en su clase:

using Pechkin;

Y luego crea el contenido del PDF con el siguiente fragmento:

byte[] pdfContent = new SimplePechkin(new GlobalConfig()).Convert("<html><body><h1>Hello world!</h1></body></html>");

B. Generar PDF desde un sitio web

En lugar de una cadena HTML simple, puede representar un sitio web a través de su URL con el SetPageUrimétodo en la configuración. Importe el Pechkin.Synchronized tipo en la parte superior de su clase:

using Pechkin.Synchronized;

Y luego use el siguiente código para crear un PDF desde un sitio web:

// crear objeto de configuración global
GlobalConfig gc = new GlobalConfig();

// configúralo usando notación fluida
// Recuerda importar el siguiente tipo:
// usando System.Drawing.Printing;
//
// una nueva instancia de Márgenes con márgenes de 1 pulgada.
gc.SetMargins(new Margins(100, 100, 100, 100))
    .SetDocumentTitle("Test document")
    .SetPaperSize(PaperKind.Letter)
    // Establecer en orientacion vertical
    //.SetPaperOrientation(true)
;

// Crear convertidor
IPechkin pechkin = new SynchronizedPechkin(gc);

// Crear objeto de configuración de documento
ObjectConfig configuration = new ObjectConfig();

// y configúrelo usando notación fluida también
configuration.SetCreateExternalLinks(false)
    .SetFallbackEncoding(Encoding.ASCII)
    .SetLoadImages(true)
    .SetPageUri("http://ourcodeworld.com");

// Genera el PDF con la configuración dada
// El método Convert devolverá una matriz de bytes con el contenido del PDF
// Deberás usar otro método para guardar el PDF (mencionado en el paso # 3)
byte[] pdfContent = pechkin.Convert(configuration);

C. Generar PDF a partir de un archivo HTML local

Para crear un PDF a partir de un archivo HTML local, puede hacerlo proporcionando la ruta del archivo local del archivo con el método SetPageUri (de la misma manera que lo hace con un sitio web) pero al mismo tiempo, permita el uso de recursos locales. con el  SetAllowLocalContentmétodo (tenga en cuenta que debe agregar como prefijo  file:///a la ruta del archivo html). Importe el tipo Pechkin.Synchronized en la parte superior de su clase:

using Pechkin.Synchronized;

Y use el siguiente código para crear un PDF a partir de un archivo HTML local:

// crear objeto de configuración global
GlobalConfig gc = new GlobalConfig();

// configúralo usando notación fluida
// Recuerda importar el siguiente tipo:
// usando System.Drawing.Printing;
//
// una nueva instancia de Márgenes con márgenes de 1 pulgada.
gc.SetMargins(new Margins(100, 100, 100, 100))
    .SetDocumentTitle("Test document")
    .SetPaperSize(PaperKind.Letter);

// Crear convertidor
IPechkin pechkin = new SynchronizedPechkin(gc);

// Crear objeto de configuración de documento
ObjectConfig configuration = new ObjectConfig();


string HTML_FILEPATH = "C:/Users/sdkca/Desktop/example.html";

// y configúrelo usando notación fluida también
configuration
.SetAllowLocalContent(true)
.SetPageUri(@"file:///" + HTML_FILEPATH);

// Genera el PDF con la configuración dada
// El método Convert devolverá una matriz de bytes con el contenido del PDF
// Deberás usar otro método para guardar el PDF (mencionado en el paso # 3)
byte[] pdfContent = pechkin.Convert(configuration);

Ahora que sabe cómo generar el contenido de un PDF, solo necesita aprender a guardarlo.

3. Guarde el PDF

Como se mencionó anteriormente, Pechkin genera un PDF y devuelve los datos como una matriz de bytes, lo que significa que deberá escribir esos datos de alguna manera usted mismo. Escribiremos el PDF en un archivo usando la FileStreamclase incluida en el ensamblaje System.IO. Con FileStream puede leer, escribir, abrir y cerrar archivos en un sistema de archivos, así como manipular otros identificadores del sistema operativo relacionados con archivos, incluidas las canalizaciones, la entrada estándar y la salida estándar. Antes de usarlo, importe el siguiente tipo con la directiva using en la parte superior de su clase:

using System.IO;

Y luego, use la clase para crear un archivo con el ByteArray devuelto como contenido. Puede utilizar el siguiente método que espera como primer parámetro la ruta absoluta del archivo y como segundo parámetro los datos a escribir (contenido pdf):

/// <summary>
/// Escribe una matriz de bytes (formato devuelto por SimplePechkin) en un archivo
/// </summary>
/// <param name="_FileName"></param>
/// <param name="_ByteArray"></param>
/// <returns></returns>
public bool ByteArrayToFile(string _FileName, byte[] _ByteArray)
{
    try
    {
        // Abrir archivo para leer
        FileStream _FileStream = new FileStream(_FileName, FileMode.Create, FileAccess.Write);
        // Escribe un bloque de bytes en esta secuencia utilizando datos de una matriz de bytes.
        _FileStream.Write(_ByteArray, 0, _ByteArray.Length);

        // Cerrar secuencia de archivos
        _FileStream.Close();

        return true;
    }
    catch (Exception _Exception)
    {
        Console.WriteLine("Excepción detectada en el proceso al intentar guardar: {0}", _Exception.ToString());
    }
    
    return false;
}

Entonces se puede utilizar como se muestra en el siguiente ejemplo:

// PDF simple de cadena
byte[] pdfBuffer = new SimplePechkin(new GlobalConfig()).Convert("<html><body><h1>Hello world!</h1></body></html>");

// Carpeta donde se creará el archivo
string directory = "C:\\Users\\sdkca\\Desktop\\";
// Nombre del PDF
string filename = "hello_world.pdf";

if (ByteArrayToFile(directory + filename, pdfBuffer))
{
    Console.WriteLine("PDF Succesfully created");
}
else
{
    Console.WriteLine("Cannot create PDF");
}

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