該頁面可以包含自動翻譯的文字。

在 Azure Functions 和 Azure 應用程式服務中將 HTML 轉換為 PDF

Docotic.Pdf 為 .NET 中的 HTML 到 PDF 轉換 提供免費插件。 此附加元件在轉換過程中 使用 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 可能具有挑戰性。

本文介紹如何在 Linux 上的 Azure Functions 和 Azure 應用程式服務中使用 Docotic.Pdf 函式庫的 HTML 轉 PDF 外掛程式。

Azure 中的 HTML 到 PDF 轉換

在 Linux 上的 Azure 中執行 HTML 到 PDF 轉換

Azure Functions 和應用程式服務在沙 箱 中運作。 您需要執行以下操作才能 在 Linux 上的 Azure 中將 HTML 轉換為 PDF: 1.預安裝Chromium依賴

  1. 使附加元件在禁用沙箱的情況下運作 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())
    ...

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