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

Convierta 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 utiliza Chromium durante la conversión. Eso ayuda a obtener una gran calidad de conversión. Sin embargo, existe un inconveniente: necesita permisos para ejecutar Chromium en un entorno de destino.

Por lo general, usted tiene control total sobre los servidores virtuales o dedicados. Pero los entornos sin servidor o de espacio aislado como Azure Functions o AWS Lambda son una historia diferente. Puede resultar complicado instalar dependencias o ejecutar Chromium allí.

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

Conversion HTML en PDF dans Azure

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

Las funciones de Azure y los servicios de aplicaciones se ejecutan en un [sandbox] (https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox). Debería hacer lo siguiente para convertir HTML a PDF en Azure en Linux:

  1. Preinstalar las dependencias de Chromium
  2. Haga que el complemento ejecute Chromium con la zona de pruebas deshabilitada
  3. Cree una ruta personalizada para el navegador de descarga de complementos

Instalar dependencias de Chromium en Linux

Desde agosto de 2021, los entornos Linux para Azure Functions y Azure App Services vienen con dependencias de Chromium preinstaladas. Por lo tanto, no es necesario instalar nada.

Si es necesario, puede utilizar los siguientes comandos para instalar dependencias de Chromium en diferentes distribuciones de 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

Haga que el complemento ejecute Chromium con la zona de pruebas deshabilitada

Recibirás el error

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

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

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

Establezca la propiedad PdfEngineOptions.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(..))
        pdf.Save("output.pdf");
}

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

  • Procese únicamente plantillas HTML locales y sitios web confiables.
  • Ejecute la conversión de HTML a PDF en Azure Functions/App Services aislado de otros servicios.

Crear navegador de descarga de complementos en una ruta personalizada

Las funciones de Azure y los servicios de aplicaciones a menudo se ejecutan directamente desde un paquete ZIP. En tales casos, debe especificar una ruta donde el complemento colocará el Chromium descargado. Esto es necesario porque el complemento no puede descargar Chromium en el directorio de la aplicación ni iniciarlo desde allí. Utilice la propiedad PdfEngineOptions.Path para especificar una ruta personalizada para el Chromium descargado. Este código C# de muestra 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(..))
        pdf.Save("output.pdf");
}

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

Ejecute 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. Recibirá 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 lo tanto, el complemento no admite Azure Functions y Azure App Services en Windows en este momento.

Convertir HTML a PDF en un contenedor Docker

Existe otra opción para usar el complemento HTML a PDF en Azure. Puede ejecutar la conversión en un contenedor Docker. Simplemente instale las dependencias en un Dockerfile y desactive la zona de pruebas de Chromium en código C#. A continuación se muestra un Dockerfile de muestra para la conversión de 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í hay un Dockerfile de muestra para una aplicación de funciones de Azure 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