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

Convertir HTML a PDF en Azure Functions y Azure App Services

Docotic.Pdf proporciona un complemento gratuito para conversión de HTML a PDF en .NET. El complemento usa Chromium durante la conversión. Eso ayuda a obtener una gran calidad de conversión. Sin embargo, hay una desventaja: necesitas permisos para ejecutar Chromium en un entorno de destino.

Normalmente, tienes control completo sobre servidores dedicados o virtuales. Pero los entornos sin servidor o aislados, como Azure Functions o AWS Lambda, son otra historia. Puede ser complicado instalar dependencias o ejecutar Chromium allí.

Este artículo describe cómo puedes usar el complemento HTML to PDF de la biblioteca Docotic.Pdf en Azure Functions y Azure App Services en Linux.

Conversión de HTML a PDF en Azure

Ejecutar la conversión de HTML a PDF en Azure en Linux

Azure Functions y App Services se ejecutan en un sandbox. Necesitarías hacer lo siguiente para convertir HTML a PDF en Azure en Linux:

  1. Preinstalar las dependencias de Chromium
  2. Hacer que el complemento ejecute Chromium con el sandbox deshabilitado
  3. Hacer que el complemento descargue el navegador en una ruta personalizada

Instalar dependencias de Chromium en Linux

Desde agosto de 2021, los entornos Linux para Azure Functions y Azure App Services incluyen dependencias de Chromium preinstaladas. Por tanto, no necesitas instalar nada.

Si es necesario, puedes usar los siguientes comandos para instalar las dependencias de Chromium en distintas distribuciones Linux.

# Debian
apt-get -y install chromium

# CentOS
yum -y install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc

Hacer que el complemento ejecute Chromium con el sandbox deshabilitado

Obtendrás el error

Failed to launch browser! Running as root without --no-sandbox is not supported

si ejecutas el código predeterminado de conversión de HTML a PDF en Azure en Linux:

using var converter = await HtmlConverter.CreateAsync();
// ...

Establece la propiedad HtmlEngineOptions.UseSandbox en false y el complemento iniciará Chromium sin el sandbox:

var engineOptions = new HtmlEngineOptions
{
    UseSandbox = false
};
using var converter = await HtmlConverter.CreateAsync(engineOptions);
using var pdf = await converter.CreatePdfAsync(url);
pdf.Save("output.pdf");

Ten en cuenta que no se recomienda deshabilitar el Chromium sandbox. Cuando el sandbox está deshabilitado, Chromium puede ejecutar potencialmente exploits maliciosos basados en JavaScript. En nuestro caso, Chromium se ejecuta en el sandbox de Azure, lo que reduce el riesgo de ataque. Puedes hacer lo siguiente para reducir aún más los riesgos:

  • Procesa solo plantillas HTML locales y sitios web de confianza.
  • Ejecuta la conversión de HTML a PDF en Azure Functions/App Services aislados de otros servicios.

Hacer que el complemento descargue el navegador en una ruta personalizada

Azure Functions y App Services a menudo se ejecutan directamente desde un paquete ZIP. En tales casos, debes especificar una ruta donde el complemento colocará el Chromium descargado. Esto es necesario porque el complemento no puede descargar Chromium al directorio de la aplicación ni iniciarlo desde allí. Usa la propiedad HtmlEngineOptions.Path para especificar una ruta personalizada para el Chromium descargado. Este código de ejemplo en C# muestra cómo descargar Chromium en la carpeta temporal del usuario actual:

var engineOptions = new HtmlEngineOptions
{
    Path = System.IO.Path.GetTempPath(),
    UseSandbox = false
};
using var converter = await HtmlConverter.CreateAsync(engineOptions);
using var pdf = await converter.CreatePdfAsync(url);
pdf.Save("output.pdf");

¡Eso es todo! Usa el código anterior para convertir HTML a PDF en Azure en Linux usando el complemento Docotic.Pdf.HtmlToPdf.

Ejecutar la conversión de HTML a PDF en Azure en Windows

Actualmente (febrero de 2024), Azure Functions y Azure App Services en Windows no permiten ejecutar Chromium. Obtendrás el siguiente error al iniciar:

System.ComponentModel.Win32Exception (14001): The application has failed to start because its
side-by-side configuration is incorrect. Please see the application event log or use the
command-line sxstrace.exe tool for more detail.

Por tanto, Azure Functions y Azure App Services en Windows no son compatibles con el complemento en este momento.

Convertir HTML a PDF en un contenedor Docker

Hay otra opción para usar el complemento HTML to PDF en Azure. Puedes ejecutar la conversión en un contenedor Docker. Solo instala las dependencias en un Dockerfile y deshabilita el sandbox de Chromium en el código C#. Aquí tienes un Dockerfile de ejemplo para convertir HTML a PDF en una aplicación ASP.NET Core:

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

RUN apt-get update && apt-get install -y chromium

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["HtmlToPdfWebApp/HtmlToPdfWebApp.csproj", "HtmlToPdfWebApp/"]
RUN dotnet restore "HtmlToPdfWebApp/HtmlToPdfWebApp.csproj"
COPY . .
WORKDIR "/src/HtmlToPdfWebApp"
RUN dotnet build "HtmlToPdfWebApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HtmlToPdfWebApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "HtmlToPdfWebApp.dll"]

Y aquí tienes un Dockerfile de ejemplo para una aplicación Azure Function similar:

FROM mcr.microsoft.com/azure-functions/dotnet:3.0 AS base
WORKDIR /home/site/wwwroot
EXPOSE 80

RUN apt-get update && apt-get install -y chromium

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["HtmlToPdfFunction/HtmlToPdfFunction.csproj", "HtmlToPdfFunction/"]
RUN dotnet restore "HtmlToPdfFunction/HtmlToPdfFunction.csproj"
COPY . .
WORKDIR "/src/HtmlToPdfFunction"
RUN dotnet build "HtmlToPdfFunction.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HtmlToPdfFunction.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /home/site/wwwroot
COPY --from=publish /app/publish .
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true