该页面可以包含自动翻译的文本。

在 Azure Functions 和 Azure 应用服务中将 HTML 转换为 PDF

Docotic.Pdf 为 .NET 中的 HTML 到 PDF 转换 提供免费插件。 该附加组件在转换过程中 使用 Chromium。 这有助于获得出色的转换质量。 但是,有一个缺点 - 您需要在目标环境中运行 Chromium 的 权限。

Docotic.Pdf 库 9.3.16943-dev HTML 转 PDF 插件 9.3.16943-dev
回归测试 14,638 通过 NuGet 总下载量 4,145,451

通常,您可以完全控制专用或虚拟服务器。 但 Azure Functions 或 AWS Lambda 等无服务器或沙盒环境则是另 一回事。 在那里安装依赖项或运行 Chromium 可能具有挑战性。

本文介绍如何在 Linux 上的 Azure Functions 和 Azure 应用服务中使用 Docotic.Pdf 库的 HTML 转 PDF 插 件。

Azure 中的 HTML 到 PDF 转换

在 Linux 上的 Azure 中运行 HTML 到 PDF 转换

Azure Functions 和应用服务在沙箱 中运行。 您需要执行以下操作才能在 Linux 上的 Azure 中将 HTML 转换为 PDF:

  1. 预安装Chromium依赖
  2. 使附加组件在禁用沙箱的情况下运行 Chromium
  3. 将插件下载浏览器设置为自定义路径

在 Linux 上安装 Chromium 依赖项

自 2021 年 8 月起,Azure Functions 和 Azure 应用服务的 Linux 环境附带预安装的 Chromium 依赖项。 因 此,您不需要安装任何东西。

如有必要,您可以使用以下命令在不同的 Linux 发行版中安装 Chromium 依赖项。

# 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

如果在 Linux 上的 Azure 中运行默认的 HTML 到 PDF 转换代码:

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

PdfEngineOptions.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 模板和受信任的网站。
  • 在与其他服务隔离的 Azure Functions/App Services 中运行 HTML 到 PDF 转换。

将附加下载浏览器设置为自定义路径

Azure Functions 和应用服务通常直接从 ZIP 包运 行。 在这种情况下,您应该指 定附加组件放置下载的 Chromium 的路径。 这是必需的,因为附加组件无法将 Chromium 下载到应用程序目录或 从那里启动它。 使用PdfEngineOptions.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");
}

就是这样! 使用上面的代码在 Linux 上的 Azure 中使用 Docotic.Pdf.HtmlToPdf 附加组 件 将 HTML 转换为 PDF。

在 Windows 上的 Azure 中运行 HTML 到 PDF 转换

目前(2024 年 2 月),Windows 上的 Azure Functions 和 Azure 应用服务不允许运行 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.

因此,该附加组件目前不支持 Windows 上的 Azure Functions 和 Azure 应用服务。

在 Docker 容器中将 HTML 转换为 PDF

还有另一个选项可以在 Azure 中使用 HTML 到 PDF 插件。 您可以在 Docker 容器中运行转换。 只需在 Dockerfile 中安装依赖项并在 C# 代码中禁用 Chromium 沙箱即可。 以下是在 ASP.NET Core 应用程序中用于 将 HTML 转换为 PDF 的示例 Dockerfile:

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"]

以下是类似 Azure Function 应用程序的示例 Dockerfile:

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