Эта страница может содержать автоматически переведенный текст.
Преобразование 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 на Linux
Azure Functions и App Services работают в песочнице. Чтобы преобразовать HTML в PDF в Azure на Linux, вам нужно сделать следующее:
- Предварительно установить зависимости Chromium
- Заставить дополнение запускать Chromium без песочницы
- Заставить дополнение загружать браузер в настраиваемый путь
Установка зависимостей 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