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

Funciones de HTML a PDF

Puede convertir HTML a PDF utilizando la biblioteca Docotic.Pdf. Consulte los recursos mencionados en esta página para descubrir cómo crear hermosos archivos PDF a partir de sus datos.

Proceso de conversión de HTML a PDF

Necesitaría el complemento HTML a PDF para conversiones de HTML a PDF. Este es un complemento gratuito para la biblioteca Docotic.Pdf. El complemento también está disponible en el archivo zip con los binarios de la biblioteca.

Biblioteca Docotic.Pdf 9.5.17615-dev Complemento de HTML a PDF 9.5.17615-dev
Pruebas de regresión 14,813 pasaron Descargas totales de NuGet 4,924,084

Referencia API

En nuestro sitio, proporcionamos la referencia de API para el complemento de HTML a PDF.

Artículos

Lea lo siguiente para saber más sobre la conversión de HTML a PDF en código C# y VB.NET.

Código de muestra

La conversión de HTML a PDF es el término que describe la variedad de tareas relacionadas. Las siguientes secciones describen estas tareas con más detalle.

Conversión de HTML a PDF con C#

Para comenzar, deberá instalar el complemento. Utilice el Administrador de paquetes para instalar el complemento HTML a PDF desde NuGet.

Install-Package BitMiracle.Docotic.Pdf.HtmlToPdf

El complemento proporciona una API solo asincrónica. Lo diseñamos para que funcione con controladores de eventos asincrónicos y métodos asincrónicos. Puede utilizar el complemento en Windows Forms, WPF, ASP.NET y aplicaciones de consola.

El código HTML a PDF de C# se ve así:

using var converter = await HtmlConverter.CreateAsync();
var uri = new Uri("https://bitmiracle.com/pdf-library/html-pdf/");
using var pdf = await converter.CreatePdfAsync(uri);
pdf.Save("out.pdf");

El código crea una instancia del convertidor de HTML a PDF. Luego, el código utiliza la instancia para crear un PDF a partir de HTML. Puede continuar trabajando con documento PDF, pero el código de ejemplo solo guarda el documento.

Si su aplicación de consola utiliza una versión anterior de C# y no tiene async Main, no se preocupe. Aún puede usar el complemento en su aplicación.

El siguiente código muestra cómo convertir una URL a PDF mediante un método sincrónico regular:

Task.Run(async () =>
{
    using var converter = await HtmlConverter.CreateAsync();
    var uri = new Uri("https://bitmiracle.com/pdf-library/html-pdf/");
    using var pdf = await converter.CreatePdfAsync(uri);
    pdf.Save("out.pdf");
}).GetAwaiter().GetResult();

Las aplicaciones VB.NET utilizan un código similar. A continuación, se incluye un fragmento que muestra cómo convertir HTML a PDF en VB.NET.

Task.Run(
    Async Function()
        Using converter = Await HtmlConverter.CreateAsync()
            Dim uri = New Uri("https://bitmiracle.com/pdf-library/html-pdf/")
            Using pdf = Await converter.CreatePdfAsync(uri)
                pdf.Save("out.pdf")
            End Using
        End Using
    End Function
).GetAwaiter().GetResult()

Descargue proyectos de prueba completos desde nuestro repositorio de GitHub:

Convertir una cadena HTML a PDF en C#

Una de las tareas más habituales es generar un PDF a partir de HTML en una aplicación C# o VB.NET. El proceso puede comenzar con una plantilla que la aplicación rellena con datos de una base de datos. No es raro que un usuario de un sitio web cree la plantilla, los datos o ambos.

El código HTML generado o cargado automáticamente puede adoptar la forma de un archivo o una cadena. El complemento proporciona un método que acepta una ruta de archivo. Utilice el método para convertir un archivo HTML a PDF en código C#. El código siguiente es para el caso en el que tiene una cadena.

using var converter = await HtmlConverter.CreateAsync();

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

El código HTML puede contener referencias relativas a imágenes, scripts y archivos CSS. Para convertir correctamente dicho código, deberá utilizar las opciones de conversión. A continuación, se muestra cómo especificar una URL base mediante las opciones:

using var converter = await HtmlConverter.CreateAsync();

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("out.pdf");

Nuestro repositorio de GitHub contiene el proyecto de prueba completo.

Ejecutar JavaScript antes de la conversión

La API complementaria proporciona una forma de ejecutar un código JS antes de la conversión. El código puede generar o modificar dinámicamente el contenido HTML. Por ejemplo, puede alternar elementos o hacer que se cargue contenido dinámico.

El siguiente código muestra cómo retrasar la conversión de HTML a PDF hasta que JavaScript haya finalizado.

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
var js = @"document.body.style.backgroundColor = 'green';";
options.Start.SetStartAfterScriptRun(js);

var url = new Uri("https://google.com");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("out.pdf");

El fragmento anterior utiliza un código muy simple solo para ilustrar el enfoque. Para ver un ejemplo más real, consulte la aplicación de muestra correspondiente en nuestro repositorio de GitHub. La aplicación muestra cómo manejar una página que carga dinámicamente su contenido. El código JavaScript de la aplicación desplaza la página hasta que no haya más contenido nuevo. Después de eso, se realiza la conversión a PDF.

Ignorar errores SSL

Al enviar solicitudes seguras para cargar HTML, el complemento verifica si el certificado SSL que autentica la identidad de un sitio web y permite una conexión cifrada es válido y confiable.

De forma predeterminada, el complemento generará una excepción si el conversor de HTML a PDF no confía en el certificado por algún motivo. Si comprende el riesgo de aceptar un certificado que no es de confianza, puede indicarle al complemento que omita las comprobaciones.

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("out.pdf");

Para obtener el código completo, dirígete al repositorio de ejemplos de Docotic.Pdf.

Proporcionar contraseña para páginas protegidas

Algunas páginas web requieren autenticación para acceder a ellas. Cuando accedes a una URL segura que requiere autenticación HTTP, el navegador te pide que proporciones un nombre de usuario y una contraseña.

Utilizando las opciones de conversión, puedes indicarle a la API que proporcione credenciales para las páginas web que requieren inicio de sesión.

Este código C# muestra cómo convertir HTML protegido con contraseña a PDF

using var converter = await HtmlConverter.CreateAsync();
var url = new Uri("http://httpbin.org/basic-auth/foo/bar");

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

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

Encuentre la muestra de trabajo completa en el repositorio de muestras.

Esperar antes de la conversión

Retrasar la conversión de HTML a PDF puede ser útil si la página se actualiza constantemente durante un tiempo después de cargarse. Suele suceder cuando se trabaja con contenido dinámico generado por JavaScript o llamadas AJAX.

La prueba Acid 3 es un ejemplo perfecto de una página que se beneficiaría de un retraso antes de la conversión. La prueba ejecuta la cantidad de comprobaciones necesarias para evaluar la capacidad de un navegador para representar correctamente páginas web complejas. Estas comprobaciones llevan tiempo. Pruebe a cambiar el tiempo de espera en el siguiente código para ver cómo afecta a los resultados de la conversión.

var options = new HtmlConversionOptions();
options.Start.SetStartAfterDelay(10 * 1000);

using var converter = await HtmlConverter.CreateAsync();
var url = new Uri("http://acid3.acidtests.org/");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("out.pdf");

El código anterior muestra cómo convertir HTML a PDF con retraso. Si bien el tiempo adicional ayuda a obtener mejores resultados, tenga en cuenta que agregar retrasos puede afectar el rendimiento. Los retrasos insuficientes pueden afectar negativamente la calidad de la conversión. Un enfoque alternativo al uso de un retraso es utilizar un script que se ejecutaría hasta que la página esté lista.

Puede obtener el proyecto de prueba completo en el repositorio de ejemplos Docotic.Pdf.

La API de HTML a PDF puede agregar bloques de encabezado y pie de página repetibles en las páginas generadas. El convertidor crea los bloques a partir de las plantillas HTML especificadas en las opciones de conversión. Recomendamos usar estilos en línea y URI de datos para las imágenes dentro de las plantillas.

El convertidor coloca los encabezados y pies de página dentro de los márgenes de la página. Dado que los márgenes de la página son pequeños, es posible que el contenido del encabezado y pie de página no sea visible. Recomendamos especificar los márgenes superior e inferior de forma explícita. El tamaño debe coincidir con el tamaño del encabezado y pie de página, respectivamente.

Vea cómo cambiar HTML a PDF y agregar encabezado y pie de página

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
options.Page.HeaderTemplate = File.ReadAllText("header-template.html");
options.Page.MarginTop = 50;

options.Page.FooterTemplate = File.ReadAllText("footer-template.html");
options.Page.MarginBottom = 50;

var url = new Uri("https://www.iana.org/numbers");
using var pdf = await converter.CreatePdfAsync(url, options);
pdf.Save("out.pdf");

El convertidor puede insertar valores como la fecha de conversión y el título del documento en lugares predefinidos dentro de las plantillas. Consulta la descripción de las propiedades HeaderTemplate y FooterTemplate para obtener más información.

El proyecto de prueba y código de plantilla completo se encuentra en el repositorio de ejemplos de Docotic.Pdf.

Contenido de escala

Si trabaja con páginas web con diseños amplios, puede aumentar el tamaño del PDF de salida o reducir el tamaño del contenido para que se ajuste a la página PDF. Para posicionar mejor el contenido escalado, también puede configurar márgenes.

Un PDF con el tamaño adecuado ofrece una mejor experiencia de lectura, ya que los lectores no tendrán que hacer zoom para ver el contenido correctamente. Si el documento HTML es difícil de leer debido al tamaño de fuente pequeño, puedes ampliar el contenido.

De forma predeterminada, la API genera archivos PDF con un tamaño de página igual a A4. No hay márgenes ni ampliación. Con las opciones de conversión, puedes cambiar estos ajustes.

Vea cómo configurar el factor de escala y los márgenes al generar PDF a partir de HTML

using var converter = await HtmlConverter.CreateAsync();

var html = "<html><head><style>body { background-color: coral; margin-top: 100px;}</style></head>" +
"<body><h1>Did you notice the margins and the scale?</h1></body></html>";

var options = new HtmlConversionOptions();
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.CreatePdfFromStringAsync(html, options);
pdf.Save("out.pdf");

El repositorio de muestras Docotic.Pdf contiene el proyecto completo.

Superponer HTML sobre un PDF existente

Hay casos en los que desea utilizar un PDF existente como fondo para el resultado de la conversión. Esto es posible con Docotic.Pdf y el complemento.

Este método implica crear un nuevo PDF a partir del HTML (el contenido de la superposición) y luego fusionarlo con el PDF existente. El documento final incluirá tanto el contenido original como la nueva superposición. Aquí se muestra el código que ilustra el método.

using var converter = await HtmlConverter.CreateAsync();

var options = new HtmlConversionOptions();
options.Page.SetSizeInches(4.13, 5.83);

string htmlCode =
    "<div style=\"position: absolute; top: 270px; right: 100px;\">" +
    "I would like to put this here</div>";
using var htmlPdf = await converter.CreatePdfFromStringAsync(htmlCode, options);

using var pdf = new PdfDocument("pdf-to-merge-with.pdf");
var xObj = pdf.CreateXObject(htmlPdf.Pages[0]);

pdf.Pages[0].Canvas.DrawXObject(xObj, 0, 0);
pdf.Save("out.pdf");

Es importante especificar un tamaño de página para la superposición. Por lo general, el tamaño debe ser igual al tamaño de la página que desea superponer. Luego, deberá generar el nuevo PDF con el contenido de la superposición. Tenga en cuenta que el fondo es transparente de manera predeterminada. Puede cambiar el fondo ejecutando un script antes de la conversión si es necesario.

Es hora de abrir el PDF existente. Este documento debe crear un XObject a partir de una página del PDF generado. Luego, el código dibuja el XObject sobre la página existente.

El proyecto de prueba completo con un PDF fuente de ejemplo se encuentra en el repositorio de muestras de Docotic.Pdf.

Convertir SVG a PDF en C#

Utilice el convertidor de HTML a PDF para crear un PDF a partir de imágenes con gráficos vectoriales escalables. El siguiente código muestra la forma más sencilla de realizar la conversión:

using var converter = await HtmlConverter.CreateAsync();
var uri = new Uri("https://bitmiracle.com/images/team.svg");
using var pdf = await converter.CreatePdfAsync(uri);
pdf.Save("out.pdf");

El convertidor utiliza el ancho y/o la altura especificados en la imagen SVG para producir una salida de alta calidad del tamaño correcto.

Puede generar una salida de un tamaño diferente mediante las opciones de personalización. Es posible agregar la imagen convertida a otro PDF.

Consulta el proyecto de prueba completo en GitHub.