Эта страница может содержать автоматически переведенный текст.

Преобразование HTML в PDF в Azure Functions and Azure App Services

Docotic.Pdf предоставляет бесплатное дополнение для преобразования HTML в PDF в .NET. Дополнение использует Chromium во время преобразования. Это помогает получить высокое качество преобразования. Однако есть недостаток — для запуска Chromium в целевой среде нужны разрешения.

Обычно у вас есть полный контроль над выделенными или виртуальными серверами. Но бессерверные или изолированные среды, такие как Azure Functions или AWS Lambda, — это другой случай. Там может быть сложно установить зависимости или запустить Chromium.

В этой статье описано, как можно использовать дополнение HTML to PDF для библиотеки Docotic.Pdf в Azure Functions и Azure App Services на Linux.

Преобразование HTML в PDF в Azure

Преобразование HTML в PDF в Azure на Linux

Azure Functions и App Services работают в песочнице. Чтобы преобразовать HTML в PDF в Azure на Linux, вам нужно сделать следующее:

  1. Предварительно установить зависимости Chromium
  2. Заставить дополнение запускать Chromium без песочницы
  3. Заставить дополнение загружать браузер в настраиваемый путь

Установка зависимостей Chromium в Linux

Начиная с августа 2021 года, среды Linux для Azure Functions и Azure App Services поставляются с уже установленными зависимостями Chromium. Поэтому ничего устанавливать не нужно.

При необходимости можно использовать следующие команды для установки зависимостей Chromium в разных дистрибутивах 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

Заставить дополнение запускать Chromium без песочницы

Вы получите ошибку

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

если запустите стандартный код преобразования HTML в PDF в Azure на Linux:

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

Установите свойство HtmlEngineOptions.UseSandbox в false, и дополнение запустит Chromium без песочницы:

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

Обратите внимание, что отключать песочницу Chromium не рекомендуется. Когда песочница отключена, Chromium потенциально может выполнять вредоносные эксплойты на основе JavaScript. В нашем случае Chromium работает в песочнице Azure, что снижает риск атаки. Чтобы еще больше снизить риски, можно сделать следующее:

  • Обрабатывайте только локальные HTML-шаблоны и доверенные сайты.
  • Запускайте преобразование HTML в PDF в Azure Functions/App Services, изолированных от других сервисов.

Сделать так, чтобы дополнение загружало браузер в настраиваемый путь

Azure Functions и App Services часто запускаются напрямую из ZIP-пакета. В таких случаях нужно указать путь, куда дополнение поместит загруженный Chromium. Это требуется, потому что дополнение не может загрузить Chromium в каталог приложения или запустить его оттуда. Используйте свойство HtmlEngineOptions.Path, чтобы указать настраиваемый путь для загруженного Chromium. Этот пример кода C# показывает, как загрузить Chromium во временную папку текущего пользователя:

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

Вот и все! Используйте код выше, чтобы преобразовать HTML в PDF в Azure на Linux с помощью дополнения Docotic.Pdf.HtmlToPdf.

Преобразование HTML в PDF в Azure на Windows

В настоящее время (февраль 2024), Azure Functions и Azure App Services на Windows не позволяют запускать Chromium. При запуске вы получите следующую ошибку:

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.

Таким образом, Azure Functions и Azure App Services на Windows в данный момент не поддерживаются дополнением.

Преобразование HTML в PDF в Docker-контейнере

Есть еще один вариант использования дополнения HTML to PDF в Azure. Можно запускать преобразование в Docker-контейнере. Просто установите зависимости в Dockerfile и отключите песочницу Chromium в коде C#. Ниже приведен пример Dockerfile для преобразования HTML в PDF в приложении 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"]

А вот пример Dockerfile для похожего приложения Azure Function:

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