이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.
Azure Functions 및 Azure App Services에서 HTML을 PDF로 변환
Docotic.Pdf는 .NET에서 HTML을 PDF로 변환을 위한 무료 추가 기능을 제공합니다. 추가 기능은 변환 중에 Chromium을 사용합니다. 이는 뛰어난 변환 품질을 얻는 데 도움이 됩니다. 그러나 단점이 있습니다. 대상 환경에서 Chromium을 실행하려면 권한이 필요합니다.
9.5.17615-dev 9.5.17615-dev14,813건의 테스트 통과 총 NuGet 다운로드 4,924,084
일반적으로 전용 서버나 가상 서버를 완벽하게 제어할 수 있습니다. 그러나 Azure Functions 또는 AWS Lambda와 같은 서버리스 또는 샌드박스 환경은 이야기가 다릅니다. 종속성을 설치하거나 Chromium을 실행하는 것이 어려울 수 있습니다.
이 문서에서는 Linux의 Azure Functions 및 Azure App Services에서 Docotic.Pdf 라이브러리용 HTML-PDF 추가 기능을 사용하는 방법을 설명합니다.
Linux의 Azure에서 HTML을 PDF로 변환 실행
Azure Functions 및 App Services는 샌드박스에서 실행됩니다. Linux의 Azure에서 HTML을 PDF로 변환하려면 다음을 수행해야 합니다.
- Chromium 종속성 사전 설치
- 비활성화된 샌드박스를 사용하여 추가 기능 실행 Chromium 만들기
- 애드온 다운로드 브라우저를 사용자 정의 경로로 만듭니다.
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