Questa pagina può contenere testo tradotto automaticamente.

Converti HTML in PDF in Funzioni di Azure e Servizi app di Azure

Docotic.Pdf fornisce un componente aggiuntivo gratuito per la conversione da HTML a PDF in .NET. Il componente aggiuntivo utilizza Chromium durante la conversione. Ciò aiuta a ottenere un’ottima qualità di conversione. Tuttavia, c'è uno svantaggio: sono necessarie le autorizzazioni per eseguire Chromium in un ambiente di destinazione.

Di solito, hai il controllo completo sui server dedicati o virtuali. Ma gli ambienti serverless o sandbox come Funzioni di Azure o AWS Lambda sono una storia diversa. Potrebbe essere difficile installare dipendenze o eseguire Chromium lì.

Questo articolo descrive come usare il componente aggiuntivo HTML to PDF per la libreria Docotic.Pdf in Funzioni di Azure e Servizi app di Azure in Linux.

Conversione da HTML a PDF in Azure

Esegui la conversione da HTML a PDF in Azure su Linux

Funzioni di Azure e Servizi app vengono eseguiti in una sandbox. Dovresti effettuare le seguenti operazioni per convertire HTML in PDF in Azure su Linux:

  1. Preinstallare le dipendenze di Chromium
  2. Fai in modo che il componente aggiuntivo esegua Chromium con sandbox disabilitato
  3. Imposta il browser di download dei componenti aggiuntivi su un percorso personalizzato

Installa le dipendenze di Chromium su Linux

Da agosto 2021, gli ambienti Linux per Funzioni di Azure e Servizi app di Azure vengono forniti con dipendenze Chromium preinstallate. Quindi non è necessario installare nulla.

Se necessario, puoi utilizzare 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

Fai eseguire il componente aggiuntivo Chromium con sandbox disabilitato

Riceverai l'errore

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

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

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

Imposta la proprietà PdfEngineOptions.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(..))
        pdf.Save("output.pdf");
}

Tieni presente che la disattivazione di Chromium sandbox non è consigliata. Quando la sandbox è disabilitata, Chromium può potenzialmente eseguire exploit dannosi 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 maggiormente i rischi:

  • Elabora solo modelli HTML locali e siti Web attendibili.
  • Esegui la conversione da HTML a PDF in Funzioni di Azure/Servizi app isolati da altri servizi.

Imposta il browser di download dei componenti aggiuntivi su un percorso personalizzato

Funzioni e servizi app di Azure spesso eseguono direttamente da un pacchetto ZIP. In questi casi, dovresti specificare un percorso in cui il componente aggiuntivo inserirà il Chromium scaricato. Ciò è necessario perché il componente aggiuntivo non può scaricare Chromium nella directory dell'applicazione o avviarlo da lì. Utilizza la proprietà PdfEngineOptions.Path per specificare un percorso personalizzato per il Chromium scaricato. Questo codice C# di esempio 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(..))
        pdf.Save("output.pdf");
}

Questo è tutto! Usare il codice precedente per convertire HTML in PDF in Azure su Linux usando il componente aggiuntivo Docotic.Pdf.HtmlToPdf.

Esegui la conversione da HTML a PDF in Azure su Windows

Attualmente (febbraio 2024), Funzioni di Azure e Servizi app di Azure in Windows non consentono l'esecuzione di Chromium. Riceverai il seguente errore all'avvio:

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 Funzioni di Azure e Servizi app di Azure in Windows non sono supportati dal componente aggiuntivo.

Converti HTML in PDF in un contenitore Docker

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