Cómo generar HTML a PDF con .NET en Azure

Cómo utilizar C# para HTML-to-PDF con IronPDF en Azure Function

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDF genera, manipula y lee documentos PDF en plataformas Azure, incluidos sitios web MVC y Azure Functions. Esta guía muestra cómo implementar la conversión de HTML a PDF en Azure Functions con la configuración y optimización adecuadas para entornos de producción. Para las empresas españolas, Azure ofrece la región Spain Central (Madrid) que permite el alojamiento de datos dentro del territorio nacional, satisfaciendo los requisitos de residencia de datos impuestos por la LOPDGDD (Ley Orgánica de Protección de Datos y Garantía de los Derechos Digitales) y supervisados por la AEPD. Esto es especialmente relevante para los ISVs que desarrollan plataformas de generación de facturas VeriFactu y Facturae, donde los documentos PDF contienen datos fiscales sensibles que deben procesarse bajo legislación española de protección de datos.

Si estás ejecutando Azure Functions dentro de un contenedor Docker, por favor consulta este tutorial de Azure Docker en Linux en su lugar.

Inicio rápido: Conversión de HTML a PDF con IronPDF en Azure

Comience a convertir HTML a PDF en sus aplicaciones Azure utilizando IronPDF. Esta guía rápida demuestra cómo renderizar una URL como un documento PDF utilizando los métodos de API de IronPDF. Este ejemplo muestra la sencillez de IronPDF para integrar funciones PDF en soluciones Azure. Sigue el ejemplo para empezar a generar PDF sin perder el formato y poner en marcha tu proyecto Azure rápidamente.

  1. Instala IronPDF con el Administrador de Paquetes NuGet

    PM > Install-Package IronPdf
  2. Copie y ejecute este fragmento de código.

    var pdf = new IronPdf.ChromePdfRenderer()
        .RenderHtmlAsPdf("<h1>Hello Azure!</h1>")
        .SaveAs("output-azure.pdf");
  3. Despliegue para probar en su entorno real

    Comienza a usar IronPDF en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer

Tutorial de cómo hacerlo

¿Cómo configuro mi proyecto?

¿Qué paquete IronPDF debo instalar?

El primer paso es instalar IronPDF usando NuGet:

Install-Package IronPdf

Alternativamente, instala manualmente el .dll usando el enlace de descarga directa de IronPDF para Azure.

Para opciones de instalación más avanzadas, consulte nuestra completa Guía de paquetes NuGet.

¿Qué opciones de Azure necesito configurar?

¿Qué nivel de alojamiento Azure debo elegir?

Azure Basic B1 es el nivel de alojamiento mínimo requerido para las necesidades de renderización. Si está creando un sistema de alto rendimiento, esto puede necesitar ser actualizado. El nivel B1 proporciona recursos suficientes para el Motor de Renderizado PDF de Chrome que potencia la conversión de HTML a PDF de IronPDF.

AdvertenciaSi no seleccionas un Tipo de Plan de plan de servicio de aplicación, puede resultar en que IronPDF no pueda renderizar documentos PDF.

Formulario de creación de Azure Function App con la opción App service plan resaltada en el desplegable Plan Type

¿Por qué debo desmarcar la opción "Ejecutar desde archivo de paquete"

Al publicar su aplicación Azure Functions, asegúrese de que Run from package file NO esté seleccionado. Esta opción crea una implementación de sólo lectura que impide que IronPDF extraiga las dependencias de tiempo de ejecución necesarias durante la ejecución.

El cuadro de diálogo de publicación de Azure Functions muestra la opción

¿Cómo se configura .NET 6?

Microsoft eliminó recientemente las bibliotecas de imágenes de .NET 6+, rompiendo muchas API heredadas. Por lo tanto, es necesario configurar su proyecto para permitir aún estas llamadas a API heredadas.

  1. En Linux, configure Installation.LinuxAndDockerDependenciesAutoConfig=true; para asegurar que libgdiplus esté instalado en la máquina
  2. Añada lo siguiente al archivo .csproj para su proyecto .NET 6:
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
    XML
  3. Cree un archivo en su proyecto llamado runtimeconfig.template.json y rellénelo con lo siguiente:

    {
      "configProperties": {
        "System.Drawing.EnableUnixSupport": true
      }
    }
  4. Finalmente, añada la siguiente línea al principio de su programa para habilitar el soporte Unix para System.Drawing:
    System.AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true);
    System.AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true);
    System.AppContext.SetSwitch("System.Drawing.EnableUnixSupport", True)
    $vbLabelText   $csharpLabel

¿Cuándo debo utilizar Docker en Azure?

Una forma de ganar control, acceso a fuentes SVG, y la capacidad de controlar el rendimiento en Azure es usar aplicaciones y funciones de IronPDF dentro de Contenedores Docker. Este enfoque proporciona un mejor control sobre el entorno de ejecución y elimina muchas limitaciones específicas de cada plataforma.

Tenemos un tutorial completo de IronPDF Azure Docker para instancias Linux y Windows, y se recomienda su lectura.

¿Cómo es el código de la función Azure?

Este ejemplo produce automáticamente entradas de log en el registrador integrado de Azure (ver ILogger log). Para obtener información detallada sobre las configuraciones de registro, consulte nuestra Guía de registro personalizado.

[FunctionName("PrintPdf")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ILogger log, ExecutionContext context)
{
    log.LogInformation("Entered PrintPdf API function...");

    // Apply license key
    IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY-1EF01";

    // Configure logging
    IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.Custom;
    IronPdf.Logging.Logger.CustomLogger = log;
    IronPdf.Logging.Logger.EnableDebugging = false;

    // Configure IronPdf settings
    Installation.LinuxAndDockerDependenciesAutoConfig = false;
    Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;

    try
    {
        log.LogInformation("About to render pdf...");

        // Create a renderer and render the URL as PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.google.com/");

        log.LogInformation("Finished rendering pdf...");

        // Return the rendered PDF as a file download
        return new FileContentResult(pdf.BinaryData, "application/pdf") { FileDownloadName = "google.pdf" };
    }
    catch (Exception e)
    {
        log.LogError(e, "Error while rendering pdf");
    }

    return new OkObjectResult("OK");
}
[FunctionName("PrintPdf")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ILogger log, ExecutionContext context)
{
    log.LogInformation("Entered PrintPdf API function...");

    // Apply license key
    IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY-1EF01";

    // Configure logging
    IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.Custom;
    IronPdf.Logging.Logger.CustomLogger = log;
    IronPdf.Logging.Logger.EnableDebugging = false;

    // Configure IronPdf settings
    Installation.LinuxAndDockerDependenciesAutoConfig = false;
    Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;

    try
    {
        log.LogInformation("About to render pdf...");

        // Create a renderer and render the URL as PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.google.com/");

        log.LogInformation("Finished rendering pdf...");

        // Return the rendered PDF as a file download
        return new FileContentResult(pdf.BinaryData, "application/pdf") { FileDownloadName = "google.pdf" };
    }
    catch (Exception e)
    {
        log.LogError(e, "Error while rendering pdf");
    }

    return new OkObjectResult("OK");
}
<FunctionName("PrintPdf")>
Public Shared Async Function Run(<HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route := Nothing)> ByVal req As HttpRequest, ByVal log As ILogger, ByVal context As ExecutionContext) As Task(Of IActionResult)
	log.LogInformation("Entered PrintPdf API function...")

	' Apply license key
	IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY-1EF01"

	' Configure logging
	IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.Custom
	IronPdf.Logging.Logger.CustomLogger = log
	IronPdf.Logging.Logger.EnableDebugging = False

	' Configure IronPdf settings
	Installation.LinuxAndDockerDependenciesAutoConfig = False
	Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled

	Try
		log.LogInformation("About to render pdf...")

		' Create a renderer and render the URL as PDF
		Dim renderer As New ChromePdfRenderer()
		Dim pdf = renderer.RenderUrlAsPdf("https://www.google.com/")

		log.LogInformation("Finished rendering pdf...")

		' Return the rendered PDF as a file download
		Return New FileContentResult(pdf.BinaryData, "application/pdf") With {.FileDownloadName = "google.pdf"}
	Catch e As Exception
		log.LogError(e, "Error while rendering pdf")
	End Try

	Return New OkObjectResult("OK")
End Function
$vbLabelText   $csharpLabel

Ejemplo avanzado de renderizado de cadenas HTML

Para situaciones más complejas que impliquen HTML personalizado con estilo CSS, puede utilizar las funciones HTML String to PDF:

[FunctionName("RenderHtmlWithCss")]
public static async Task<IActionResult> RenderHtmlWithCss(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("Processing HTML to PDF request");

    // Read HTML content from request body
    string htmlContent = await new StreamReader(req.Body).ReadToEndAsync();

    // Configure renderer with custom options
    var renderer = new ChromePdfRenderer()
    {
        RenderingOptions = new ChromePdfRenderOptions()
        {
            MarginTop = 20,
            MarginBottom = 20,
            MarginLeft = 10,
            MarginRight = 10,
            CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true
        }
    };

    try
    {
        // Add custom CSS
        string styledHtml = $@"
            <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; padding: 20px; }}
                    h1 {{ color: #2c3e50; }}
                    .highlight {{ background-color: #f1c40f; padding: 5px; }}
                </style>
            </head>
            <body>
                {htmlContent}
            </body>
            </html>";

        var pdf = renderer.RenderHtmlAsPdf(styledHtml);

        return new FileContentResult(pdf.BinaryData, "application/pdf") 
        { 
            FileDownloadName = "styled-document.pdf" 
        };
    }
    catch (Exception ex)
    {
        log.LogError(ex, "Failed to render HTML to PDF");
        return new BadRequestObjectResult("Error processing HTML content");
    }
}
[FunctionName("RenderHtmlWithCss")]
public static async Task<IActionResult> RenderHtmlWithCss(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("Processing HTML to PDF request");

    // Read HTML content from request body
    string htmlContent = await new StreamReader(req.Body).ReadToEndAsync();

    // Configure renderer with custom options
    var renderer = new ChromePdfRenderer()
    {
        RenderingOptions = new ChromePdfRenderOptions()
        {
            MarginTop = 20,
            MarginBottom = 20,
            MarginLeft = 10,
            MarginRight = 10,
            CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true
        }
    };

    try
    {
        // Add custom CSS
        string styledHtml = $@"
            <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; padding: 20px; }}
                    h1 {{ color: #2c3e50; }}
                    .highlight {{ background-color: #f1c40f; padding: 5px; }}
                </style>
            </head>
            <body>
                {htmlContent}
            </body>
            </html>";

        var pdf = renderer.RenderHtmlAsPdf(styledHtml);

        return new FileContentResult(pdf.BinaryData, "application/pdf") 
        { 
            FileDownloadName = "styled-document.pdf" 
        };
    }
    catch (Exception ex)
    {
        log.LogError(ex, "Failed to render HTML to PDF");
        return new BadRequestObjectResult("Error processing HTML content");
    }
}
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Azure.WebJobs
Imports Microsoft.Azure.WebJobs.Extensions.Http
Imports Microsoft.AspNetCore.Http
Imports Microsoft.Extensions.Logging
Imports IronPdf

Public Module HtmlToPdfFunction

    <FunctionName("RenderHtmlWithCss")>
    Public Async Function RenderHtmlWithCss(
        <HttpTrigger(AuthorizationLevel.Function, "post", Route:=Nothing)> req As HttpRequest,
        log As ILogger) As Task(Of IActionResult)

        log.LogInformation("Processing HTML to PDF request")

        ' Read HTML content from request body
        Dim htmlContent As String = Await New StreamReader(req.Body).ReadToEndAsync()

        ' Configure renderer with custom options
        Dim renderer As New ChromePdfRenderer() With {
            .RenderingOptions = New ChromePdfRenderOptions() With {
                .MarginTop = 20,
                .MarginBottom = 20,
                .MarginLeft = 10,
                .MarginRight = 10,
                .CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print,
                .PrintHtmlBackgrounds = True,
                .CreatePdfFormsFromHtml = True
            }
        }

        Try
            ' Add custom CSS
            Dim styledHtml As String = $"
                <html>
                <head>
                    <style>
                        body {{ font-family: Arial, sans-serif; padding: 20px; }}
                        h1 {{ color: #2c3e50; }}
                        .highlight {{ background-color: #f1c40f; padding: 5px; }}
                    </style>
                </head>
                <body>
                    {htmlContent}
                </body>
                </html>"

            Dim pdf = renderer.RenderHtmlAsPdf(styledHtml)

            Return New FileContentResult(pdf.BinaryData, "application/pdf") With {
                .FileDownloadName = "styled-document.pdf"
            }
        Catch ex As Exception
            log.LogError(ex, "Failed to render HTML to PDF")
            Return New BadRequestObjectResult("Error processing HTML content")
        End Try
    End Function

End Module
$vbLabelText   $csharpLabel

Para gestionar licencias en sus Azure Functions, consulte nuestra documentación Using License Keys.

¿Cuáles son los problemas conocidos?

¿Por qué no se renderizan las fuentes SVG en planes de alojamiento compartido?

Una limitación es que la visión general de la plataforma de alojamiento Azure no soporta servidores cargando fuentes SVG, como las fuentes de Google, en sus niveles de aplicaciones web compartidas más baratos. Esto se debe a las restricciones de seguridad que impiden el acceso a objetos gráficos de Windows GDI+.

Recomendamos usar una guía de Contenedor Docker para Windows o Linux para IronPDF o tal vez un VPS en Azure para sortear este problema donde se requiere la mejor renderización de fuentes.

¿Por qué Azure Free Tier Hosting es lento?

Los niveles gratuitos y compartidos de Azure, y el plan de consumo, no son adecuados para la renderización de PDF. Recomendamos el plan de alojamiento B1 de Azure/plan Premium, que es el que usamos nosotros mismos. El proceso de HTML to PDF es un 'trabajo' significativo para cualquier computadora - similar a abrir y renderizar una página web en su propia máquina. Se utiliza un motor de navegador real, por lo tanto, necesitamos aprovisionar adecuadamente y esperar tiempos de renderizado similares a los de una máquina de escritorio de potencia similar.

¿Cómo puedo depurar Azure Functions localmente?

Para el desarrollo y las pruebas locales, consulte nuestra guía sobre Debugging Azure Functions Project on Local Machine. Esto ayuda a identificar y resolver problemas antes de desplegar en Azure.

¿Dónde puedo encontrar los registros de Azure?

A la hora de solucionar problemas de generación de PDF, los registros de Azure son muy valiosos. Consulte nuestra guía Azure Log Files para obtener instrucciones sobre cómo acceder e interpretar los registros específicos de las operaciones de IronPDF.

¿Cómo puedo crear una solicitud de soporte técnico?

Para crear un ticket de solicitud, consulte la guía Cómo realizar una solicitud de soporte de ingeniería para IronPDF.

Bestes prácticas para la producción

  1. Siempre use niveles de hosting apropiados - B1 o superior para un rendimiento confiable
  2. Configura correctamente el log - Usa Azure Application Insights para monitoreo de producción
  3. Maneja excepciones con cuidado - Implementa lógica de reintento para fallas transitorias
  4. Optimiza el contenido HTML - Minimiza recursos externos y usa imágenes codificadas en base64 cuando sea posible
  5. Prueba exhaustivamente - Valida la generación de PDFs localmente antes del despliegue en Azure
  6. Monitorizar el uso de recursos - Realizar un seguimiento del consumo de memoria y CPU para escalar adecuadamente

IronPDF en Azure para ISVs de facturación española

Las plataformas de facturación electrónica desarrolladas en España tienen requisitos particulares que afectan al diseño de la arquitectura en Azure:

  • Residencia de datos en Spain Central: La LOPDGDD exige que los datos de carácter personal de ciudadanos españoles se traten conforme al RGPD y, en muchos contratos públicos, que residan en territorio de la UE o España. Azure Spain Central (Madrid) permite desplegar las Azure Functions que generan los PDF de facturas VeriFactu sin que los datos abandonen el suelo español. La AEPD puede exigir documentación de las transferencias internacionales de datos, algo que se evita por completo con esta región.

  • Generación serverless de facturas Facturae: Los ISVs que implementan el flujo B2G de Facturae (envío a FACe, la plataforma estatal de facturas electrónicas) utilizan Azure Functions desencadenadas por colas de mensajes. Cuando una empresa emite una factura a un organismo público, la Function genera el PDF adjunto en IronPDF, adjunta la firma PAdES con el certificado FNMT de la empresa y lanza el envío a FACe, todo en un flujo asíncrono sin servidor.

  • Alta disponibilidad para el SII: El SII (Suministro Inmediato de Información) exige comunicar los registros de IVA a la AEAT en cuatro días. Un fallo en la generación de PDF puede bloquear el pipeline de cumplimiento. Los planes Premium de Azure Functions ofrecen tiempo de ejecución ilimitado y escalado automático, evitando los tiempos de espera del plan de consumo que pueden interrumpir la generación de PDF en cargas pico de fin de mes.

  • Integración con Cl@ve y FNMT: Las plataformas de facturación que autentican a los usuarios mediante Cl@ve (el sistema de identificación electrónica del ciudadano español) o certificados digitales FNMT necesitan acceder a recursos internos durante la generación del PDF. Azure Virtual Network Integration permite que las Functions accedan a servidores de validación internos, servicios de sellado de tiempo y repositorios de certificados sin exponer estos recursos a internet.

  • Cumplimiento eIDAS para firmas PDF: Las facturas electrónicas con valor legal en España deben utilizar firmas PAdES reconocidas bajo el reglamento eIDAS. Al combinar IronPDF con Azure Key Vault para el almacenamiento seguro de certificados, los ISVs pueden implementar flujos de firma en Azure Functions que generen y firmen PDFs de facturas VeriFactu de forma centralizada y auditable.

Preguntas Frecuentes

¿Cuál es el nivel mínimo de alojamiento Azure necesario para la generación de PDF?

IronPDF requiere el nivel B1 de Azure Basic como nivel mínimo de alojamiento para las necesidades de renderización de PDF. El nivel B1 proporciona recursos suficientes para el motor de renderizado de PDF de Chrome que impulsa las capacidades de conversión de HTML a PDF de IronPDF.

¿Qué paquete debo instalar para Azure Functions basado en Windows?

Para Azure Functions basadas en Windows, instale el paquete IronPDF de NuGet. Este paquete está optimizado para entornos Windows y proporciona capacidades completas de generación de PDF con el motor de renderizado de Chrome.

¿Cómo convierto HTML a PDF en Azure Functions?

Puede convertir HTML a PDF con una sola línea de código utilizando ChromePdfRenderer de IronPDF. Simplemente crea una nueva instancia y llama a RenderHtmlAsPdf() con tu contenido HTML, luego guarda el archivo PDF resultante.

¿Qué ocurre si no selecciono el plan App Service correcto?

Si no se selecciona un tipo de plan de servicio App, IronPDF puede no renderizar los documentos PDF. La configuración adecuada del entorno de alojamiento Azure es esencial para que el motor de renderización de PDF funcione correctamente.

¿Por qué debe desmarcarse la opción "Ejecutar desde archivo de paquete" al publicar?

Al publicar la aplicación Azure Functions, la opción "Ejecutar desde archivo de paquete" debe estar desmarcada para garantizar que IronPDF pueda acceder y utilizar correctamente sus componentes de renderización y dependencias en el entorno Azure.

¿Puedo utilizar Azure Functions basadas en Linux para la generación de PDF?

Sí, para Azure Functions basadas en Linux, utilice el paquete IronPdf.Linux de NuGet. Este paquete está optimizado específicamente para entornos Linux y ofrece las mismas capacidades de generación de PDF.

¿Y si necesito un mayor rendimiento en la generación de PDF?

Para los sistemas de alto rendimiento, es posible que necesite actualizar más allá del nivel B1. IronPDF se adapta a sus recursos Azure, lo que le permite gestionar mayores demandas de generación de PDF seleccionando niveles de rendimiento superiores.

¿Por qué elegir Azure Spain Central para aplicaciones de facturación electrónica española?

La región Azure Spain Central (Madrid) permite alojar los datos de facturación dentro del territorio nacional, cumpliendo los requisitos de residencia de datos de la LOPDGDD supervisados por la AEPD. Esto es crítico para ISVs que procesan datos fiscales VeriFactu y Facturae, ya que ciertos contratos con la Administración Pública española exigen que los datos no abandonen el suelo nacional o la UE.

¿Cómo integrar IronPDF con la firma PAdES en Azure para facturas VeriFactu?

Los ISVs pueden combinar IronPDF con Azure Key Vault para almacenar el certificado FNMT de la empresa de forma segura y firmar los PDFs de facturas VeriFactu con firma PAdES conforme a eIDAS. La Azure Function genera el PDF con IronPDF, recupera el certificado de Key Vault, aplica la firma PAdES y envía el documento firmado a la AEAT, todo en un flujo serverless sin exponer las claves privadas al sistema de archivos del servidor.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 19,014,616 | Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronPdf
ejecutar una muestra Mira cómo tu HTML se convierte en PDF.