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

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

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

Docotic.Pdf ライブラリ 9.6.17807 HTMLからPDFへのアドオン 9.6.17807
回帰テスト 14,868人が合格 NuGet の合計ダウンロード数 5,134,090

通常、専用サーバーまたは仮想サーバーを完全に制御できます。 ただし、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())
    ...

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

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

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

それでおしまい! 上記のコードを使用して、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