Diese Seite kann automatisch übersetzten Text enthalten.

Konvertieren Sie HTML in PDF in Azure Functions und Azure App Services

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 trägt dazu bei, eine hervorragende Konvertierungsqualität zu erzielen. Es gibt jedoch einen Nachteil: Sie benötigen Berechtigungen, um Chromium in einer Zielumgebung auszuführen.

Docotic.Pdf-Bibliothek 9.5.17573-dev HTML-zu-PDF-Add-on 9.5.17573-dev
Regressionstests 14,726 bestanden NuGet-Downloads insgesamt 4,765,230

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

In diesem Artikel wird beschrieben, 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

Führen Sie die HTML-zu-PDF-Konvertierung in Azure unter Linux aus

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

  1. Chromium-Abhängigkeiten vorinstallieren
  2. Lassen Sie das Add-on Chromium mit deaktivierter Sandbox ausführen
  3. Legen Sie für den Add-on-Download-Browser einen benutzerdefinierten Pfad fest

Installieren Sie Chromium-Abhängigkeiten unter Linux

Seit August 2021 verfügen Linux-Umgebungen für Azure Functions und Azure App Services über vorinstallierte Chromium-Abhängigkeiten. Sie müssen also nichts installieren.

Bei Bedarf 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

Lassen Sie das Add-on Chromium mit deaktivierter Sandbox ausführen

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

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

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

Legen Sie für den Add-on-Download-Browser einen benutzerdefinierten Pfad fest

Azure Functions und App Services werden oft direkt aus einem ZIP-Paket ausgeführt. In solchen Fällen sollten Sie einen Pfad angeben, in dem das Add-on das heruntergeladene Chromium ablegt. Dies ist erforderlich, da das Add-on Chromium nicht in das Anwendungsverzeichnis herunterladen oder von dort aus starten kann. Verwenden Sie die Eigenschaft HtmlEngineOptions.Path, um einen benutzerdefinierten Pfad für das heruntergeladene Chromium anzugeben. Dieser Beispiel-C#-Code 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(..))
        pdf.Save("output.pdf");
}

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

Führen Sie die HTML-zu-PDF-Konvertierung in Azure unter Windows aus

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

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 derzeit nicht vom Add-on unterstützt.

Konvertieren Sie HTML in PDF in einem Docker-Container

Es gibt 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 einfach Abhängigkeiten in einer Docker-Datei und deaktivieren Sie die Chromium-Sandbox im C#-Code. Hier ist eine Beispiel-Dockerdatei 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-Dockerdatei für eine ähnliche Azure-Funktions-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