Diese Seite kann automatisch übersetzten Text enthalten.

HTML in Azure Functions und Azure App Services in PDF umwandeln

Docotic.Pdf bietet ein kostenloses Add-on für die HTML-zu-PDF-Konvertierung in .NET. Das Add-on verwendet Chromium während der Konvertierung. Das sorgt für eine hohe Konvertierungsqualität. Allerdings gibt es einen Nachteil: Sie benötigen Berechtigungen, um Chromium in einer Zielumgebung auszuführen.

Normalerweise haben Sie vollständige Kontrolle über dedizierte oder virtuelle Server. Aber serverlose oder isolierte Umgebungen wie Azure Functions oder AWS Lambda sind eine andere Geschichte. Es kann schwierig sein, dort Abhängigkeiten zu installieren oder Chromium auszuführen.

Dieser Artikel beschreibt, wie Sie das HTML-zu-PDF-Add-on für die Docotic.Pdf-Bibliothek in Azure Functions und Azure App Services unter Linux verwenden können.

HTML-zu-PDF-Konvertierung in Azure

HTML-zu-PDF-Konvertierung in Azure unter Linux ausführen

Azure Functions und App Services laufen in einer Sandbox. Sie müssen Folgendes tun, um HTML in Azure unter Linux in PDF zu konvertieren:

  1. Chromium-Abhängigkeiten vorab installieren
  2. Das Add-on Chromium mit deaktivierter Sandbox ausführen lassen
  3. Das Add-on den Browser in einen benutzerdefinierten Pfad herunterladen lassen

Chromium-Abhängigkeiten unter Linux installieren

Seit August 2021 werden Linux-Umgebungen für Azure Functions und Azure App Services mit vorinstallierten Chromium-Abhängigkeiten ausgeliefert. Sie müssen also nichts installieren.

Falls erforderlich, können Sie die folgenden Befehle verwenden, um Chromium-Abhängigkeiten in verschiedenen Linux-Distributionen zu installieren.

# 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

Das Add-on Chromium mit deaktivierter Sandbox ausführen lassen

Sie erhalten den Fehler

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

wenn Sie den standardmäßigen HTML-zu-PDF-Konvertierungscode in Azure unter Linux ausführen:

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

Setzen Sie die Eigenschaft HtmlEngineOptions.UseSandbox auf false, und das Add-on startet Chromium ohne die 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");

Beachten Sie, dass das Deaktivieren der Chromium-Sandbox nicht empfohlen wird. Wenn die Sandbox deaktiviert ist, kann Chromium potenziell bösartige JavaScript-basierte Exploits ausführen. In unserem Fall läuft Chromium in der Azure-Sandbox, was das Angriffsrisiko reduziert. Sie können Folgendes tun, um die Risiken weiter zu verringern:

  • Verarbeiten Sie nur lokale HTML-Vorlagen und vertrauenswürdige Websites.
  • Führen Sie die HTML-zu-PDF-Konvertierung in Azure Functions/App Services aus, die von anderen Diensten isoliert sind.

Das Add-on den Browser in einen benutzerdefinierten Pfad herunterladen lassen

Azure Functions und App Services werden oft direkt aus einem ZIP-Paket ausgeführt. In solchen Fällen sollten Sie einen Pfad angeben, in den das Add-on das heruntergeladene Chromium ablegt. Dies ist erforderlich, weil das Add-on Chromium nicht in das Anwendungsverzeichnis herunterladen oder von dort starten kann. Verwenden Sie die Eigenschaft HtmlEngineOptions.Path, um einen benutzerdefinierten Pfad für das heruntergeladene Chromium anzugeben. Dieses C#-Beispiel zeigt, wie Chromium in den temporären Ordner des aktuellen Benutzers heruntergeladen wird:

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

Das ist alles! Verwenden Sie den obigen Code, um HTML in Azure unter Linux mit dem Docotic.Pdf.HtmlToPdf-Add-on in PDF zu konvertieren.

HTML-zu-PDF-Konvertierung in Azure unter Windows ausführen

Derzeit (Februar 2024) erlauben Azure Functions und Azure App Services unter Windows die Ausführung von Chromium nicht. Beim Start erhalten Sie den folgenden Fehler:

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.

Daher werden Azure Functions und Azure App Services unter Windows vom Add-on derzeit nicht unterstützt.

HTML in einem Docker-Container in PDF umwandeln

Es gibt noch eine weitere Möglichkeit, das HTML-zu-PDF-Add-on in Azure zu verwenden. Sie können die Konvertierung in einem Docker-Container ausführen. Installieren Sie die Abhängigkeiten einfach in einer Dockerfile und deaktivieren Sie die Chromium-Sandbox im C#-Code. Hier ist eine Beispiel-Dockerfile für die HTML-zu-PDF-Konvertierung in einer ASP.NET-Core-Anwendung:

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"]

Und hier ist eine Beispiel-Dockerfile für eine ähnliche Azure-Function-App:

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