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

Конвертировать HTML в PDF в Azure Functions и Azure App Services

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

Библиотека Docotic.Pdf 9.5.17615-dev Дополнение HTML в PDF 9.5.17615-dev
Регрессионные тесты 14,813 прошло Всего загрузок NuGet 4,924,084

Обычно у вас есть полный контроль над выделенными или виртуальными серверами. Но средах без сервера или в песочнице, как, например, в 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(..))
        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(..))
        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. Вы можете запустить преобразование в Докер-контейнере. Просто установите зависимости в 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