该页面可以包含自动翻译的文本。
在 Azure Functions 和 Azure 应用服务中将 HTML 转换为 PDF
Docotic.Pdf 为 .NET 中的 HTML 到 PDF 转换 提供免费插件。 该附加组件在转换过程中 使用 Chromium。 这有助于获得出色的转换质量。 但是,有一个缺点 - 您需要在目标环境中运行 Chromium 的 权限。
9.5.17615-dev 9.5.17615-dev14,813 通过 NuGet 总下载量 4,924,084
通常,您可以完全控制专用或虚拟服务器。 但 Azure Functions 或 AWS Lambda 等无服务器或沙盒环境则是另 一回事。 在那里安装依赖项或运行 Chromium 可能具有挑战性。
本文介绍如何在 Linux 上的 Azure Functions 和 Azure 应用服务中使用 Docotic.Pdf 库的 HTML 转 PDF 插 件。
在 Linux 上的 Azure 中运行 HTML 到 PDF 转换
Azure Functions 和应用服务在沙箱 中运行。 您需要执行以下操作才能在 Linux 上的 Azure 中将 HTML 转换为 PDF:
- 预安装Chromium依赖
- 使附加组件在禁用沙箱的情况下运行 Chromium
- 将插件下载浏览器设置为自定义路径
在 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())
...
将 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 模板和受信任的网站。
- 在与其他服务隔离的 Azure Functions/App Services 中运行 HTML 到 PDF 转换。
将附加下载浏览器设置为自定义路径
Azure Functions 和应用服务通常直接从 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");
}
就是这样! 使用上面的代码在 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