Esta página puede contener texto traducido automáticamente.

Convertir HTML a PDF en C# y VB.NET

Si ya ha invertido gran parte de su tiempo y dinero en crear contenido en formato HTML, es posible que desee crear archivos PDF a partir de ese HTML. Este enfoque es una dirección natural para cualquiera que quiera evitar la duplicación de trabajo.

Para una reutilización exitosa de las inversiones, la conversión debe realizarse mediante programación y el PDF resultante debe ser lo más parecido visualmente posible al HTML de origen.

Conversión de HTML a PDF

API para conversión de HTML a PDF en aplicaciones .NET

El complemento gratuito de HTML a PDF para la biblioteca Docotic.Pdf proporciona una API para dichas conversiones. Tanto el complemento como la biblioteca se pueden utilizar desde aplicaciones web y de escritorio creadas para marcos .NET y .NET Core.

Biblioteca Docotic.Pdf 9.3.17036-dev Complemento de HTML a PDF 9.3.17036-dev
Pruebas de regresión 14,665 pasaron Descargas totales de NuGet 4,191,515

El complemento es una biblioteca .NET de HTML a PDF que utiliza Chromium durante la conversión. Antes de cada conversión, el complemento comprueba automáticamente si ya se ha descargado el Chromium compatible más reciente. Se reutilizará cualquier versión elegible ya descargada. Si no se encuentra ninguna versión elegible, el complemento descarga una antes de la conversión. Se espera que cumpla con los mismos estándares web que Google Chrome (R).

El complemento puede generar PDF a partir de HTML en entornos Windows, macOS y Linux. Lea cómo configurar el complemento en Linux en el artículo sobre la conversión de HTML a PDF en Azure.

El complemento está disponible en NuGet y también está incluido en el zip con binarios de la biblioteca. Para probar la biblioteca sin restricciones del modo de evaluación, puede obtener la clave de licencia gratuita por tiempo limitado aquí.

Conversión simple de HTML a PDF C#

Usando la API de HTML a PDF, el código de conversión de C# puede verse así:

static async Task convertUrlToPdfAsync(string urlString, string pdfFileName)
{
    using (var converter = await HtmlConverter.CreateAsync())
    {
        using (var pdf = await converter.CreatePdfAsync(new Uri(urlString)))
            pdf.Save(pdfFileName);
    }
}

Es bastante simple. Sólo se requieren dos convocatorias para producir un documento PDF. Como puede ver, la API es asincrónica y no proporciona ningún método sincrónico.

En los casos en que desee llamar a la API desde algún código síncrono, puede utilizar el siguiente contenedor:

Task.Run(async () =>
{
    await convertUrlToPdfAsync("https://bitmiracle.com/", "output.pdf");
}).GetAwaiter().GetResult();

Tenga en cuenta que, en general, no se recomienda llamar a métodos asíncronos de forma sincrónica, así que use el contenedor solo cuando no tenga otra opción.

Proporcionamos código de muestra que muestra cómo utilizar la API desde aplicaciones de consola tanto síncronas como asíncronas. Además, hay códigos de muestra para aplicaciones Windows Forms y WPF.

También existe el grupo de ejemplos HTML a PDF. Cada muestra viene en versión C# y VB.NET.

Cree un PDF con una cadena HTML o un archivo en C# y VB.NET

Es fácil convertir una cadena HTML a PDF con la API. La cadena puede contener un documento HTML completo o simplemente un fragmento. El convertidor creará un PDF a partir del código HTML.

var html = "<body><br/><br/><br/><h1>Hello, World<h1></body>";
using (var pdf = await converter.CreatePdfFromStringAsync(html))
    pdf.Save("output.pdf");

Puedes especificar una URL base para todos los enlaces relativos en el código HTML que vas a convertir. Aquí hay un fragmento de código sobre cómo convertir HTML a PDF con una URL base en C#.

var incompleteHtml = "<img src=\"/images/team.svg\"></img>";
var options = new HtmlConversionOptions();
options.Load.BaseUri = new Uri("https://bitmiracle.com/");
using (var pdf = await converter.CreatePdfFromStringAsync(incompleteHtml, options))
    pdf.Save("output.pdf");

Convertir un archivo HTML es casi lo mismo que convertir una URL. Simplemente use la sobrecarga CreatePdfAsync que acepta una ruta en lugar de una URL. La URL base y otras opciones también son compatibles al convertir un archivo HTML a PDF en código C# o VB.NET.

var sampleHtmlPath = @"C:\path\to\sample.html";
using (var pdf = await converter.CreatePdfAsync(sampleHtmlPath))
    pdf.Save("output.pdf");

También puede convertir imágenes SVG a PDF usando la API.

Utilice tamaño de página, márgenes y escala personalizados

Puede configurar cualquier conversión de HTML a PDF C# proporcionando opciones de conversión a métodos de creación de PDF.

Aquí hay un fragmento de código que muestra cómo configurar el tamaño, los márgenes y la escala de la página de salida en C#:

using (var converter = await HtmlConverter.CreateAsync())
{
    var options = new HtmlConversionOptions();

    // También puede especificar si la orientación de la página debe ser horizontal y 
    // puede proporcionar un tamaño en puntos o pulgadas.
    options.Page.SetSize(PdfPaperSize.ItalyEnvelope);

    options.Page.MarginLeft = 10;
    options.Page.MarginTop = 20;
    options.Page.MarginRight = 30;
    options.Page.MarginBottom = 40;

    options.Page.Scale = 1.5;

    using (var pdf = await converter.CreatePdfAsync(url, options))
        pdf.Save("output.pdf");
}

Puede especificar plantillas de encabezado y pie de página utilizando las opciones de página. Las plantillas utilizan código HTML normal compatible con algunas variables. Estas variables son date, title, url, pageNumber y totalPages.

Se recomienda utilizar estilos en línea y URI de datos para imágenes.

Es posible que desee especificar los márgenes superior e inferior de la página. Sin márgenes, el encabezado o el pie de página pueden quedar oscurecidos por el contenido de la página.

El código de muestra Convertir HTML a PDF con encabezado y pie de página en C# o VB.NET muestra cómo utilizar las variables y los URI de datos en las plantillas.

Conversión de HTML a PDF C# protegida con contraseña

Puede crear PDF incluso si una página HTML está protegida por un par de nombre de usuario y contraseña. Es tan fácil como configurar las opciones de autenticación dentro de HtmlConversionOptions.

var options = new HtmlConversionOptions();
options.Authentication.SetCredentials("foo", "bar");

using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

También es fácil si la página necesita algunas cookies configuradas para funcionar correctamente. Simplemente agregue esas cookies a las opciones. Aquí es cómo:

var options = new HtmlConversionOptions();
options.Cookies.Add(new Cookie("sessionID", "my-session-ID"));

using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

Retrasar el inicio de la conversión

De forma predeterminada, la conversión comienza inmediatamente después de la carga. Pero hay casos en los que la página necesita algo de tiempo para asentarse. Por ejemplo, cuando realiza algunos cálculos y actualiza el contenido una vez que esos cálculos están listos.

Al utilizar las opciones de inicio de conversión, puede retrasar la conversión durante un número específico de milisegundos.

// Espere 10 segundos antes de iniciar la conversión.
var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

A veces es necesario ejecutar un script para alternar elementos en la página cargada o para realizar la carga dinámica de contenido. Esto también es posible:

var options = new HtmlConversionOptions();
var js = @"
    async function scrollDownUntilYouCantAnyMore() {
        await new Promise((resolve, reject) => {
            // Omitido por brevedad
            }, 400);
        });
    }
    scrollDownUntilYouCantAnyMore();
";
options.Start.SetStartAfterScriptRun(js);
using (var pdf = await converter.CreatePdfAsync(url, options))
    pdf.Save("output.pdf");

El código de muestra HTML a PDF después de ejecutar un script en C# o VB.NET contiene la función scrollDownUntilYouCantAnyMore completa. El ejemplo muestra cómo ejecutar un script antes de las conversiones de HTML a PDF.

Convierta HTML a PDF en .NET ignorando errores de SSL

Durante una conversión, puede ocurrir un error de SSL. Estos errores suelen ocurrir debido a certificados autofirmados o que no son de confianza. Los certificados revocados y caducados pueden hacer que el conversor de HTML a PDF también genere excepciones.

Puede ignorar los errores de SSL si comprende por qué ocurren y está seguro de que es seguro ignorarlos. Para ignorar los errores de SSL durante una conversión de HTML a PDF, utilice las opciones del motor con IgnoreSslErrors = true.

var engineOptions = new HtmlEngineOptions
{
    IgnoreSslErrors = true
};
using (var converter = await HtmlConverter.CreateAsync(engineOptions))
{
    var url = new Uri("https://self-signed.badssl.com/");
    using (var pdf = await converter.CreatePdfAsync(url))
        pdf.Save("output.pdf");
}

Coloque contenido HTML sobre páginas PDF

Hay casos en los que es posible que necesites convertir HTML y colocar el resultado de la conversión encima de algunas páginas PDF existentes. Por ejemplo, cuando tenga la imagen de un formulario, es posible que desee colocar algo sobre las áreas vacías de esa imagen. El resultado se verá como un formulario completo.

Para colocar HTML convertido sobre contenido PDF existente, deberá:

  • crear páginas PDF con fondo transparente desde HTML
  • crear XObjects a partir de las páginas convertidas
  • dibujar esos XObjects en páginas PDF existentes.

El código de muestra Convertir HTML y colocarlo sobre contenido PDF existente en C# o VB.NET muestra todos los pasos. Por favor, eche un vistazo a la muestra.