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

Azure Functions 및 Azure App Services에서 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 App Services에서 Docotic.Pdf 라이브러리용 HTML-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 템플릿과 신뢰할 수 있는 웹사이트만 처리하세요.
  • 다른 서비스와 격리된 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(..))
        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-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