該頁面可以包含自動翻譯的文字。
在 Azure Functions 和 Azure 應用程式服務中將 HTML 轉換為 PDF
Docotic.Pdf 為 .NET 中的 HTML 到 PDF 轉換 提供免費插件。 此附加元件在轉換過程中 使用 Chromium。 這有助於獲得出色的轉換品質。 但是,有一個缺點 - 您需要在目標環境中執行 Chromium 的 權限。
9.5.17664-dev 9.5.17664-dev14,820 已通過 NuGet 總下載量 4,998,853
通常,您可以完全控制專用或虛擬伺服器。 但 Azure Functions 或 AWS Lambda 等無伺服器或沙盒環境則是另 一回事。 在那裡安裝依賴項或運行 Chromium 可能具有挑戰性。
本文介紹如何在 Linux 上的 Azure Functions 和 Azure 應用程式服務中使用 Docotic.Pdf 函式庫的 HTML 轉 PDF 外掛程式。
在 Linux 上的 Azure 中執行 HTML 到 PDF 轉換
Azure Functions 和應用程式服務在沙 箱 中運作。 您需要執行以下操作才能 在 Linux 上的 Azure 中將 HTML 轉換為 PDF: 1.預安裝Chromium依賴
- 使附加元件在禁用沙箱的情況下運作 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