이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.

Azure Functions 및 Azure App Services에서 HTML을 PDF로 변환

Docotic.Pdf는 .NET에서 HTML을 PDF로 변환할 수 있는 무료 추가 기능을 제공합니다. 이 추가 기능은 변환 중에 Chromium을 사용합니다. 이를 통해 뛰어난 변환 품질을 얻을 수 있습니다. 그러나 단점이 있습니다. 대상 환경에서 Chromium을 실행할 권한이 필요합니다.

일반적으로 전용 서버나 가상 서버에서는 완전한 제어가 가능합니다. 하지만 Azure Functions나 AWS Lambda 같은 서버리스 또는 샌드박스 환경은 다릅니다. 이러한 환경에서는 종속성을 설치하거나 Chromium을 실행하는 것이 어려울 수 있습니다.

이 문서에서는 Linux의 Azure Functions 및 Azure App Services에서 Docotic.Pdf 라이브러리용 HTML to PDF 추가 기능을 사용하는 방법을 설명합니다.

Azure에서 HTML을 PDF로 변환

Azure의 Linux에서 HTML을 PDF로 변환 실행

Azure Functions와 App Services는 샌드박스에서 실행됩니다. Azure의 Linux에서 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

Azure의 Linux에서 기본 HTML to 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(url);
pdf.Save("output.pdf");

Chromium 샌드박스를 비활성화하는 것은 권장되지 않습니다. 샌드박스가 비활성화되면 Chromium이 악의적인 JavaScript 기반 익스플로잇을 실행할 수 있습니다. 이 경우 Chromium은 Azure 샌드박스에서 실행되므로 공격 위험이 줄어듭니다. 위험을 더 줄이려면 다음을 수행할 수 있습니다.

  • 로컬 HTML 템플릿과 신뢰할 수 있는 웹사이트만 처리합니다.
  • 다른 서비스와 분리된 Azure Functions/App Services에서 HTML을 PDF로 변환을 실행합니다.

사용자 지정 경로로 브라우저를 다운로드하도록 추가 기능 설정

Azure Functions 및 App Services는 종종 ZIP 패키지에서 직접 실행됩니다. 이러한 경우, 추가 기능이 다운로드한 Chromium을 저장할 경로를 지정해야 합니다. 이는 추가 기능이 애플리케이션 디렉터리에 Chromium을 다운로드하거나 그 위치에서 실행할 수 없기 때문입니다. 다운로드한 Chromium의 사용자 지정 경로를 지정하려면 HtmlEngineOptions.Path 속성을 사용합니다. 다음 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(url);
pdf.Save("output.pdf");

이것으로 끝입니다! 위 코드를 사용하여 Docotic.Pdf.HtmlToPdf 추가 기능을 통해 Azure의 Linux에서 HTML을 PDF로 변환합니다.

Azure의 Windows에서 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을 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