Questa pagina può contenere testo tradotto automaticamente.

Convertire HTML in PDF in Azure Functions e Azure App Services

Docotic.Pdf fornisce un componente aggiuntivo gratuito per la conversione da HTML a PDF in .NET. Il componente aggiuntivo usa Chromium durante la conversione. Questo aiuta a ottenere un'elevata qualità di conversione. Tuttavia, c'è uno svantaggio: servono autorizzazioni per eseguire Chromium nell'ambiente di destinazione.

In genere, hai il pieno controllo su server dedicati o virtuali. Ma gli ambienti serverless o sandboxed come Azure Functions o AWS Lambda sono un'altra storia. Potrebbe essere difficile installare dipendenze o eseguire Chromium lì.

Questo articolo descrive come puoi usare il componente aggiuntivo HTML to PDF per la libreria Docotic.Pdf in Azure Functions e Azure App Services su Linux.

Conversione da HTML a PDF in Azure

Eseguire la conversione da HTML a PDF in Azure su Linux

Azure Functions e App Services vengono eseguiti in una sandbox. Per convertire HTML in PDF in Azure su Linux, devi fare quanto segue:

  1. Preinstallare le dipendenze di Chromium
  2. Far eseguire al componente aggiuntivo Chromium con la sandbox disabilitata
  3. Far scaricare al componente aggiuntivo il browser in un percorso personalizzato

Installare le dipendenze di Chromium su Linux

Da agosto 2021, gli ambienti Linux per Azure Functions e Azure App Services includono dipendenze di Chromium preinstallate. Quindi, non devi installare nulla.

Se necessario, puoi usare i seguenti comandi per installare le dipendenze di Chromium in diverse distribuzioni 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

Far eseguire il componente aggiuntivo Chromium con la sandbox disabilitata

Riceverai l'errore

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

se esegui il codice predefinito di conversione da HTML a PDF in Azure su Linux:

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

Imposta la proprietà HtmlEngineOptions.UseSandbox su false e il componente aggiuntivo avvierà Chromium senza 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");

Nota che disabilitare la sandbox di Chromium non è consigliato. Quando la sandbox è disabilitata, Chromium può potenzialmente eseguire exploit malevoli basati su Javascript. Nel nostro caso, Chromium viene eseguito nella sandbox di Azure, il che riduce il rischio di attacco. Puoi fare quanto segue per ridurre ulteriormente i rischi:

  • Elabora solo template HTML locali e siti Web attendibili.
  • Esegui la conversione da HTML a PDF in Azure Functions/App Services isolati da altri servizi.

Far scaricare al componente aggiuntivo il browser in un percorso personalizzato

Azure Functions e App Services spesso vengono eseguiti direttamente da un pacchetto ZIP. In questi casi, devi specificare un percorso in cui il componente aggiuntivo salverà Chromium scaricato. Questo è necessario perché il componente aggiuntivo non può scaricare Chromium nella directory dell'applicazione né avviarlo da lì. Usa la proprietà HtmlEngineOptions.Path per specificare un percorso personalizzato per Chromium scaricato. Questo esempio di codice C# mostra come scaricare Chromium nella cartella temporanea dell'utente corrente:

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

Tutto qui! Usa il codice sopra per convertire HTML in PDF in Azure su Linux usando il componente aggiuntivo Docotic.Pdf.HtmlToPdf.

Eseguire la conversione da HTML a PDF in Azure su Windows

Attualmente (febbraio 2024), Azure Functions e Azure App Services su Windows non consentono l'esecuzione di Chromium. In fase di avvio riceverai il seguente errore:

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.

Pertanto, al momento Azure Functions e Azure App Services su Windows non sono supportati dal componente aggiuntivo.

Convertire HTML in PDF in un contenitore Docker

Esiste un'altra opzione per usare il componente aggiuntivo HTML to PDF in Azure. Puoi eseguire la conversione in un contenitore Docker. Basta installare le dipendenze in un Dockerfile e disabilitare la sandbox di Chromium nel codice C#. Ecco un Dockerfile di esempio per la conversione da HTML a PDF in un'applicazione 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"]

Ed ecco un Dockerfile di esempio per un'app Azure Function simile:

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