Cette page peut contenir du texte traduit automatiquement.

Convertir du HTML en PDF dans Azure Functions et Azure App Services

Docotic.Pdf fournit un module complémentaire gratuit pour la conversion HTML en PDF dans .NET. Le module complémentaire utilise Chromium lors de la conversion. Cela permet d’obtenir une excellente qualité de conversion. Cependant, il existe un inconvénient: vous avez besoin d'autorisations pour exécuter Chromium dans un environnement cible.

Habituellement, vous avez un contrôle total sur les serveurs dédiés ou virtuels. Mais les environnements sans serveur ou en bac à sable comme Azure Functions ou AWS Lambda sont une autre histoire. Il peut être difficile d'installer des dépendances ou d'y exécuter Chromium.

Cet article décrit comment utiliser le module complémentaire HTML vers PDF pour la bibliothèque Docotic.Pdf dans Azure Functions et Azure App Services sous Linux.

Conversion HTML en PDF dans Azure

Exécuter la conversion HTML en PDF dans Azure sous Linux

Azure Functions et App Services s'exécutent dans un bac à sable. Vous devrez procéder comme suit pour convertir du HTML en PDF dans Azure sous Linux :

  1. Pré-installer les dépendances de Chromium
  2. Faire en sorte que le module complémentaire exécute Chromium avec le bac à sable désactivé
  3. Créez un navigateur de téléchargement complémentaire sur un chemin personnalisé

Installer les dépendances Chromium sur Linux

Depuis août 2021, les environnements Linux pour Azure Functions et Azure App Services sont livrés avec des dépendances Chromium préinstallées. Vous n’avez donc rien besoin d’installer.

Si nécessaire, vous pouvez utiliser les commandes suivantes pour installer les dépendances Chromium dans différentes distributions 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

Faire en sorte que le module complémentaire exécute Chromium avec le bac à sable désactivé

Vous obtiendrez l'erreur

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

si vous exécutez le code de conversion HTML en PDF par défaut dans Azure sous Linux :

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

Définissez la propriété PdfEngineOptions.UseSandbox sur false et le module complémentaire lancera Chromium sans le bac à sable :

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

Notez que la désactivation de Chromium sandbox n'est pas recommandée. Lorsque le bac à sable est désactivé, Chromium peut potentiellement exécuter des exploits malveillants basés sur Javascript. Dans notre cas, Chromium s’exécute dans le sandbox Azure, ce qui réduit le risque d’attaque. Vous pouvez faire ce qui suit pour réduire davantage les risques :

  • Traitez uniquement les modèles HTML locaux et les sites Web de confiance.
  • Exécutez la conversion HTML en PDF dans Azure Functions/App Services isolés des autres services.

Créer un navigateur de téléchargement complémentaire sur un chemin personnalisé

Azure Functions et App Services sont souvent exécutés directement à partir d'un package ZIP. Dans de tels cas, vous devez spécifier un chemin où le module complémentaire placera le Chromium téléchargé. Ceci est nécessaire car le module complémentaire ne peut pas télécharger Chromium dans le répertoire de l'application ni le lancer à partir de là. Utilisez la propriété PdfEngineOptions.Path pour spécifier un chemin personnalisé pour le Chromium téléchargé. Cet exemple de code C# montre comment télécharger Chromium dans le dossier temporaire de l'utilisateur actuel :

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");
}

C'est ça! Utilisez le code ci-dessus pour convertir du HTML en PDF dans Azure sous Linux à l'aide du module complémentaire Docotic.Pdf.HtmlToPdf.

Exécuter la conversion HTML en PDF dans Azure sous Windows

Actuellement (février 2024), Azure Functions et Azure App Services sur Windows ne permettent pas d'exécuter Chromium. Vous obtiendrez l'erreur suivante au lancement :

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.

Ainsi, Azure Functions et Azure App Services sur Windows ne sont pas pris en charge par le module complémentaire pour le moment.

Convertir du HTML en PDF dans un conteneur Docker

Il existe une autre option pour utiliser le module complémentaire HTML vers PDF dans Azure. Vous pouvez exécuter la conversion dans un conteneur Docker. Installez simplement les dépendances dans un Dockerfile et désactivez le bac à sable Chromium dans le code C#. Voici un exemple de Dockerfile pour la conversion HTML en PDF dans une application 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"]

Et voici un exemple de Dockerfile pour une application Azure Function similaire :

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