Эта страница может содержать автоматически переведенный текст.
Конвертировать HTML в PDF в Azure Functions и Azure App Services
Docotic.Pdf предоставляет бесплатное дополнение для преобразования HTML в PDF в .NET. Дополнение использует Chromium во время конвертации. Это помогает добиться отличного качества конвертации. Однако есть и отрицательная сторона — вам нужны разрешения для запуска Chromium в целевой среде.
9.6.17807 9.6.1780714,868 прошло Всего загрузок NuGet 5,134,090
Обычно у вас есть полный контроль над выделенными или виртуальными серверами. Но средах без сервера или в песочнице, как, например, в 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(..))
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