このページには自動翻訳されたテキストを含めることができます。

Azure Functions と Azure App Services で HTML を PDF に変換する

Docotic.Pdf は、.NET での HTML から PDF への変換 用の無料アドオンを提供します。 アドオンは変換中に Chromium を使用します。 これは、優れた変換品質を得るのに役立ちます。 ただし、 ターゲット環境で Chromium を実行するには権限が必要という欠点があります。

Docotic.Pdf ライブラリ 9.3.17014-dev HTMLからPDFへのアドオン 9.3.17014-dev
回帰テスト 14,645人が合格 NuGet の合計ダウンロード数 4,172,488

通常、専用サーバーまたは仮想サーバーを完全に制御できます。 ただし、Azure Functions や AWS Lambda な どのサーバーレス環境やサンドボックス環境では話が異なります。 そこで依存関係をインストールした り、Chromium を実行したりするのは難しい場合があります。

この記事では、Linux 上の Azure Functions および Azure App Services で Docotic.Pdf ライブラリの HTML to PDF アドオンを使用する方法について説明します。

Azure での HTML から PDF への変換

Linux 上の Azure で HTML から PDF への変換を実行する

Azure Functions と App Services は サンドボック ス で実行されます。 Linux 上の Azure で HTML を PDF に変換するには、次の操作を行う必要があります。

  1. Chromium の依存関係をプリインストールする
  2. サンドボックスを無効にしてアドオンを Chromium で実行する
  3. アドオン ダウンロード ブラウザーをカスタム パスに作成します

Linux に Chromium の依存関係をインストールする

2021 年 8 月以降、Azure Functions と Azure App Services の 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 テンプレートと信頼できる Web サイトのみを処理します。
  • 他のサービスから分離された Azure Functions/App Services で HTML から PDF への変換を実行します。

アドオンのダウンロード ブラウザをカスタム パスに作成する

Azure Functions と App Services は多くの場合 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");
}

それでおしまい! 上記のコードを使用して、Docotic.Pdf.HtmlToPdf アドオ ン を使用して Linux 上の Azure で HTML を PDF に変換します。

Windows 上の Azure で HTML から PDF への変換を実行する

現在 (2024 年 2 月)、Windows 上の Azure Functions と Azure App Services では 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 App Services は、現時点ではアドオンではサポートさ れていません。

DockerコンテナでHTMLをPDFに変換する

Azure で HTML to 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