푸터 콘텐츠로 바로가기
IRONPDF 사용하기

IronPDF로 Azure PDF 생성기 생성 (.NET 10 가이드)

IronPDF의 전문 렌더링 엔진과 Azure의 유연한 클라우드 인프라를 결합하면 Azure PDF 생성이 간단해집니다. 이 가이드는 HTML 변환에서 복잡한 문서 조작까지 모든 것을 처리하는 프로덕션 준비된 PDF 생성기를 구축, 배포 및 조정하는 방법을 보여줍니다.

신뢰할 수 있는 클라우드 기반 PDF 생성기를 구축하는 것은 고유한 도전을 제시합니다. 샌드박스 제한, 메모리 제한, 분산 시스템의 복잡성 사이에서 많은 개발자가 프로덕션 준비된 솔루션을 찾기 위해 고군분투합니다. AzureIronPDF가 잘 협력하는 곳이 바로 여기입니다 -- IronPDF는 작업 부하에 맞게 확장하면서 기본 기능을 유지하는 전문적인 PDF 생성을 제공합니다.

당신이 송장을 생성하든, 보고서를 작성하든 웹 콘텐츠를 PDF로 변환하든, 이 가이드는 신뢰할 수 있는 Azure PDF 생성기를 구축하는 방법을 보여줍니다. 성능 및 비용을 조정하면서 간단한 HTML 변환부터 복잡한 문서 조작까지 모든 것을 처리하게 됩니다.

IronPDF 무료 체험판으로 시작하여 클라우드 PDF 솔루션을 구축하는 과정을 따라오세요.

좋은 Azure PDF 생성기의 특성은 무엇인가요?

모든 PDF 솔루션이 클라우드 환경에서 잘 작동하지는 않습니다. 프로덕션 준비된 Azure PDF 생성기는 기본 문서 생성 외에 중요한 요구사항을 충족해야 합니다. 성공을 보장하기 위해 Azure 함수 배포 옵션을 이해해야 합니다.

클라우드 PDF 생성에서 성능은 왜 중요한가요?

성능과 확장성은 솔루션의 성공을 정의합니다. 생성기는 병목 현상 없이 동시 요청을 처리하고, 피크 시 자동으로 확장하며, 복잡한 문서에서도 일관된 응답 시간을 유지해야 합니다. 서버리스 아키텍처의 미세사항을 이해하는 클라우드 환경용으로 구축된 라이브러리를 선택하세요.

Azure 특정 제약 조건을 고려해야 하는가?

Azure 플랫폼은 특정 고려사항을 제공합니다. 앱 서비스 샌드박스는 Win32/그래픽 API를 제한합니다 -- 데스크탑 그래픽 스택을 사용하는 라이브러리는 실패할 수 있습니다. 소비 계획의 메모리 제약으로 인해 더 큰 문서가 실패합니다. 분산 특성으로 인해 효율적인 상태 비저장 작업이 필요합니다. 자세한 Azure 배포 문제 해결을 위해 완전한 문제 해결 문서를 참조하세요.

어떤 엔터프라이즈 기능이 필수적인가?

엔터프라이즈 애플리케이션은 HTML 변환 그 이상이 필요합니다. 최신 PDF 생성기는 JavaScript 렌더링을 지원하고, 복잡한 CSS를 처리하며, 암호화디지털 서명과 같은 보안 기능을 제공해야 합니다. IronPDF는 Chrome 기반 렌더링 엔진으로 이 문제를 해결하며, Azure 배포에 잘 맞습니다.

Azure 앱 서비스s와 Azure 함수의 차이점은 무엇인가요?

Azure 앱 서비스s와 Azure 함수는 둘 다 클라우드 애플리케이션을 호스팅하지만 서로 다른 목적을 제공합니다. 올바른 것을 선택하는 것은 아키텍처, 비용 모델, 배포 접근 방식에 영향을 미칩니다.

Azure 앱 서비스s를 선택하는 방법은?

Azure 앱 서비스s는 웹 애플리케이션, REST API 및 모바일 백엔드에 대해 완전히 관리되는 호스팅을 제공합니다. 지속적인 리소스를 제공하고, 장기 실행 프로세스를 지원하며, 내장 스케일링, 배포 슬롯 및 CI/CD 통합을 포함합니다. 이 기능들은 지속적으로 실행되는 애플리케이션에 이상적입니다.

Azure 함수가 더 나은 선택일 때는?

Azure 함수는 이벤트 기반, 단기 작업에 대해 서버리스 컴퓨팅을 제공합니다. 함수는 트리거될 때만 실행되며(HTTP 요청, 타이머, 메시지 큐), 실행 시간에 대해서만 비용이 청구됩니다. 이들은 백그라운드 작업, 데이터 처리, 자동화 스크립트, 지속적으로 실행되지 않는 마이크로서비스에 적합합니다.

Azure 호스팅 옵션
특징 앱 서비스 Azure 함수
요금 모델 고정 월 비용 실행당
유휴 비용 항상 청구됨 유휴 시 제로
콜드 스타트 위험 최소화 예 (소비 계획)
장시간 실행되는 PDF 지원됨 시간 초과 제한 적용
맞춤 컨테이너 지원됨 프리미엄/전용만

Azure 함수에 IronPDF를 설치하는 방법은?

Azure 함수에서 IronPDF를 설정하려면 적절한 패키지를 선택해야 합니다. 이 라이브러리는 Windows 및 Linux 환경을 위한 옵션을 제공합니다. 적절한 패키지 선택은 최적의 성능을 보장하고 호환성 문제를 피할 수 있습니다.

어떤 IronPDF 패키지를 설치해야 하나요?

Windows 기반 Azure 함수의 경우 NuGet에서 사용할 수 있는 표준 IronPDF 패키지를 사용하세요. Linux 컨테이너의 경우, IronPdf.Linux를 사용하여 패키지에서 실행되는 배포를 통해 더 빠르게 콜드 스타트를 할 수 있습니다.

# NuGet Package Manager (Windows / 앱 서비스)
Install-Package IronPdf

# .NET CLI (cross-platform)
dotnet add package IronPdf
# NuGet Package Manager (Windows / 앱 서비스)
Install-Package IronPdf

# .NET CLI (cross-platform)
dotnet add package IronPdf
SHELL
# Linux / container deployments
Install-Package IronPdf.Linux

# .NET CLI alternative
dotnet add package IronPdf.Linux
# Linux / container deployments
Install-Package IronPdf.Linux

# .NET CLI alternative
dotnet add package IronPdf.Linux
SHELL

Azure 함수에 IronPDF를 어떻게 구성합니까?

.NET 10을 사용하는 적절한 구성과 함께 PDF 생성을 처리하는 전체 Azure Function은 다음과 같습니다 (최상위 진술 사용):

using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;

// Configure IronPDF once at startup
License.LicenseKey = Environment.GetEnvironmentVariable("IronPdfLicenseKey") ?? string.Empty;
Installation.LinuxAndDockerDependenciesAutoConfig = true;
Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
Installation.CustomDeploymentDirectory = "/tmp";

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

host.Run();

// Azure Function class
public class PdfGeneratorFunction
{
    private readonly ILogger _logger;

    public PdfGeneratorFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<PdfGeneratorFunction>();
    }

    [Function("GeneratePdf")]
    public async Task<HttpResponseData> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "generate-pdf")] HttpRequestData req)
    {
        string htmlContent = await req.ReadAsStringAsync() ?? string.Empty;
        var response = req.CreateResponse(HttpStatusCode.OK);

        if (string.IsNullOrWhiteSpace(htmlContent))
        {
            response.StatusCode = HttpStatusCode.BadRequest;
            await response.WriteStringAsync("HTML content is required.");
            return response;
        }

        try
        {
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    MarginLeft = 10,
                    MarginRight = 10,
                    EnableJavaScript = true
                }
            };

            using var pdf = renderer.RenderHtmlAsPdf(htmlContent);
            response.Headers.Add("Content-Type", "application/pdf");
            await response.WriteBytesAsync(pdf.BinaryData);
            _logger.LogInformation("Generated PDF with {PageCount} pages.", pdf.PageCount);
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF.");
            response.StatusCode = HttpStatusCode.InternalServerError;
            await response.WriteStringAsync($"PDF generation failed: {ex.Message}");
            return response;
        }
    }
}
using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using System.Net;

// Configure IronPDF once at startup
License.LicenseKey = Environment.GetEnvironmentVariable("IronPdfLicenseKey") ?? string.Empty;
Installation.LinuxAndDockerDependenciesAutoConfig = true;
Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
Installation.CustomDeploymentDirectory = "/tmp";

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

host.Run();

// Azure Function class
public class PdfGeneratorFunction
{
    private readonly ILogger _logger;

    public PdfGeneratorFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<PdfGeneratorFunction>();
    }

    [Function("GeneratePdf")]
    public async Task<HttpResponseData> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "generate-pdf")] HttpRequestData req)
    {
        string htmlContent = await req.ReadAsStringAsync() ?? string.Empty;
        var response = req.CreateResponse(HttpStatusCode.OK);

        if (string.IsNullOrWhiteSpace(htmlContent))
        {
            response.StatusCode = HttpStatusCode.BadRequest;
            await response.WriteStringAsync("HTML content is required.");
            return response;
        }

        try
        {
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    MarginLeft = 10,
                    MarginRight = 10,
                    EnableJavaScript = true
                }
            };

            using var pdf = renderer.RenderHtmlAsPdf(htmlContent);
            response.Headers.Add("Content-Type", "application/pdf");
            await response.WriteBytesAsync(pdf.BinaryData);
            _logger.LogInformation("Generated PDF with {PageCount} pages.", pdf.PageCount);
            return response;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error generating PDF.");
            response.StatusCode = HttpStatusCode.InternalServerError;
            await response.WriteStringAsync($"PDF generation failed: {ex.Message}");
            return response;
        }
    }
}
Imports IronPdf
Imports Microsoft.Azure.Functions.Worker
Imports Microsoft.Azure.Functions.Worker.Http
Imports Microsoft.Extensions.Logging
Imports System.Net

' Configure IronPDF once at startup
License.LicenseKey = If(Environment.GetEnvironmentVariable("IronPdfLicenseKey"), String.Empty)
Installation.LinuxAndDockerDependenciesAutoConfig = True
Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
Installation.CustomDeploymentDirectory = "/tmp"

Dim host = New HostBuilder() _
    .ConfigureFunctionsWorkerDefaults() _
    .Build()

host.Run()

' Azure Function class
Public Class PdfGeneratorFunction
    Private ReadOnly _logger As ILogger

    Public Sub New(loggerFactory As ILoggerFactory)
        _logger = loggerFactory.CreateLogger(Of PdfGeneratorFunction)()
    End Sub

    <Function("GeneratePdf")>
    Public Async Function Run(
        <HttpTrigger(AuthorizationLevel.Function, "post", Route:="generate-pdf")> req As HttpRequestData) As Task(Of HttpResponseData)

        Dim htmlContent As String = Await req.ReadAsStringAsync() OrElse String.Empty
        Dim response = req.CreateResponse(HttpStatusCode.OK)

        If String.IsNullOrWhiteSpace(htmlContent) Then
            response.StatusCode = HttpStatusCode.BadRequest
            Await response.WriteStringAsync("HTML content is required.")
            Return response
        End If

        Try
            Dim renderer = New ChromePdfRenderer With {
                .RenderingOptions = New ChromePdfRenderOptions With {
                    .MarginTop = 10,
                    .MarginBottom = 10,
                    .MarginLeft = 10,
                    .MarginRight = 10,
                    .EnableJavaScript = True
                }
            }

            Using pdf = renderer.RenderHtmlAsPdf(htmlContent)
                response.Headers.Add("Content-Type", "application/pdf")
                Await response.WriteBytesAsync(pdf.BinaryData)
                _logger.LogInformation("Generated PDF with {PageCount} pages.", pdf.PageCount)
                Return response
            End Using
        Catch ex As Exception
            _logger.LogError(ex, "Error generating PDF.")
            response.StatusCode = HttpStatusCode.InternalServerError
            Await response.WriteStringAsync($"PDF generation failed: {ex.Message}")
            Return response
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

이러한 구성 설정이 왜 중요한가요?

구성 설정은 Azure 배포 성공을 보장합니다. LinuxAndDockerDependenciesAutoConfig는 Chrome 종속성을 올바르게 구성하고, GPU 모드를 비활성화하면 서버리스 렌더링 문제를 방지할 수 있습니다. 배포 디렉터리를 /tmp로 설정하면 제한된 Azure 함수 환경에서 쓰기 권한이 제공되며, 이는 "액세스 거부" 오류의 일반적인 원인입니다.

예제 출력 PDF 파일

판매 지표, 지역별 데이터 테이블 및 회사 주요 내용을 전문적인 녹색 헤더로 보여주는 Azure Function에서 생성한 월간 보고서 PDF

PDF 생성을 위해 어떤 Azure 호스팅 계층을 선택해야 하나요?

IronPDF를 사용한 PDF 생성은 더 가벼운 작업보다 더 많은 컴퓨팅 및 그래픽 지원이 필요합니다. Microsoft와 IronPDF 모두 GDI+ 제한, 공유 컴퓨트 한계 및 불충분한 메모리 때문에 무료, 공유, 소비자 계층을 피할 것을 권장합니다.

IronPDF를 위한 추천 Azure 계층
계층 GDI+ 지원 PDF에 적합 노트
무료 / 공유 아니요 아니요 제한된 샌드박스
소비 (기능) 제한된 제한된 메모리 제한 적용
기본 / 표준 최소 추천
프리미엄 / 독립된 예 (최고) 전체 기능 접근

대량 작업의 경우, 프리미엄 또는 독립된 계층은 전용 컴퓨테, VNET 통합, 콜드 스타트 지연 없음 등을 제공하여 PDF 처리량 및 신뢰성을 직접적으로 향상시킵니다.

Azure 함수로 서버리스 PDF API를 어떻게 구축하나요?

Azure 함수로 서버리스 PDF API를 구축하면 자동 확장, 사용량 기반 과금, 최소 인프라 관리가 가능합니다. 아래 함수는 선택적 보안 설정과 함께 JSON 요청을 받고 PDF 바이트 스트림을 반환합니다.

프로덕션 PDF API를 어떻게 구조화합니까?

using IronPdf;
using IronPdf.Editing;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using System.Net;
using System.Text.Json;

public class PdfApiFunction
{
    private static readonly ChromePdfRenderer Renderer = new ChromePdfRenderer
    {
        RenderingOptions = new ChromePdfRenderOptions
        {
            PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true,
            CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
        }
    };

    [Function("ConvertUrlToPdf")]
    public async Task<HttpResponseData> ConvertUrl(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var body = await req.ReadAsStringAsync() ?? "{}";
        var request = JsonSerializer.Deserialize<ConvertUrlRequest>(body);

        if (string.IsNullOrEmpty(request?.Url))
        {
            var bad = req.CreateResponse(HttpStatusCode.BadRequest);
            await bad.WriteStringAsync("URL is required.");
            return bad;
        }

        using var pdf = Renderer.RenderUrlAsPdf(request.Url);

        if (request.AddWatermark)
        {
            pdf.ApplyWatermark(
                "<h2>CONFIDENTIAL</h2>",
                30,
                VerticalAlignment.Middle,
                HorizontalAlignment.Center);
        }

        if (request.ProtectWithPassword && !string.IsNullOrEmpty(request.Password))
        {
            pdf.SecuritySettings.UserPassword = request.Password;
            pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        }

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.WriteBytesAsync(pdf.BinaryData);
        return response;
    }
}

public class ConvertUrlRequest
{
    public string Url { get; set; } = string.Empty;
    public bool AddWatermark { get; set; }
    public bool ProtectWithPassword { get; set; }
    public string Password { get; set; } = string.Empty;
}
using IronPdf;
using IronPdf.Editing;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using System.Net;
using System.Text.Json;

public class PdfApiFunction
{
    private static readonly ChromePdfRenderer Renderer = new ChromePdfRenderer
    {
        RenderingOptions = new ChromePdfRenderOptions
        {
            PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
            PrintHtmlBackgrounds = true,
            CreatePdfFormsFromHtml = true,
            CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
        }
    };

    [Function("ConvertUrlToPdf")]
    public async Task<HttpResponseData> ConvertUrl(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var body = await req.ReadAsStringAsync() ?? "{}";
        var request = JsonSerializer.Deserialize<ConvertUrlRequest>(body);

        if (string.IsNullOrEmpty(request?.Url))
        {
            var bad = req.CreateResponse(HttpStatusCode.BadRequest);
            await bad.WriteStringAsync("URL is required.");
            return bad;
        }

        using var pdf = Renderer.RenderUrlAsPdf(request.Url);

        if (request.AddWatermark)
        {
            pdf.ApplyWatermark(
                "<h2>CONFIDENTIAL</h2>",
                30,
                VerticalAlignment.Middle,
                HorizontalAlignment.Center);
        }

        if (request.ProtectWithPassword && !string.IsNullOrEmpty(request.Password))
        {
            pdf.SecuritySettings.UserPassword = request.Password;
            pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        }

        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        await response.WriteBytesAsync(pdf.BinaryData);
        return response;
    }
}

public class ConvertUrlRequest
{
    public string Url { get; set; } = string.Empty;
    public bool AddWatermark { get; set; }
    public bool ProtectWithPassword { get; set; }
    public string Password { get; set; } = string.Empty;
}
Imports IronPdf
Imports IronPdf.Editing
Imports Microsoft.Azure.Functions.Worker
Imports Microsoft.Azure.Functions.Worker.Http
Imports System.Net
Imports System.Text.Json

Public Class PdfApiFunction
    Private Shared ReadOnly Renderer As New ChromePdfRenderer With {
        .RenderingOptions = New ChromePdfRenderOptions With {
            .PaperSize = IronPdf.Rendering.PdfPaperSize.A4,
            .PrintHtmlBackgrounds = True,
            .CreatePdfFormsFromHtml = True,
            .CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
        }
    }

    <Function("ConvertUrlToPdf")>
    Public Async Function ConvertUrl(
        <HttpTrigger(AuthorizationLevel.Function, "post")> req As HttpRequestData) As Task(Of HttpResponseData)

        Dim body As String = Await req.ReadAsStringAsync() ?? "{}"
        Dim request As ConvertUrlRequest = JsonSerializer.Deserialize(Of ConvertUrlRequest)(body)

        If String.IsNullOrEmpty(request?.Url) Then
            Dim bad As HttpResponseData = req.CreateResponse(HttpStatusCode.BadRequest)
            Await bad.WriteStringAsync("URL is required.")
            Return bad
        End If

        Using pdf = Renderer.RenderUrlAsPdf(request.Url)
            If request.AddWatermark Then
                pdf.ApplyWatermark(
                    "<h2>CONFIDENTIAL</h2>",
                    30,
                    VerticalAlignment.Middle,
                    HorizontalAlignment.Center)
            End If

            If request.ProtectWithPassword AndAlso Not String.IsNullOrEmpty(request.Password) Then
                pdf.SecuritySettings.UserPassword = request.Password
                pdf.SecuritySettings.AllowUserCopyPasteContent = False
            End If

            Dim response As HttpResponseData = req.CreateResponse(HttpStatusCode.OK)
            response.Headers.Add("Content-Type", "application/pdf")
            Await response.WriteBytesAsync(pdf.BinaryData)
            Return response
        End Using
    End Function
End Class

Public Class ConvertUrlRequest
    Public Property Url As String = String.Empty
    Public Property AddWatermark As Boolean
    Public Property ProtectWithPassword As Boolean
    Public Property Password As String = String.Empty
End Class
$vbLabelText   $csharpLabel

이 구조는 깔끔한 분리를 유지하면서 유연성을 제공합니다. 함수는 JSON 요청을 받고 오류 처리와 함께 이를 처리하여 선택적인 보안과 함께 PDF를 반환합니다. 워터마크를 추가하고, 비밀번호 보호를 구현하며, 디지털 서명을 적용할 수 있습니다.

프로덕션 PDF 생성에 대한 모범 사례는 무엇인가요?

프로덕션 PDF 생성을 위해서는 성능, 신뢰성, 리소스 관리에 대한 주의가 필요합니다. 이러한 모범 사례는 동시 요청 전반에 걸쳐 실제 조건에서 최적의 성능을 보장합니다.

메모리와 리소스를 어떻게 관리하십니까?

메모리 관리는 동시 요청 시 중요한 문제가 됩니다. 항상 using 문을 사용하여 PDF 개체를 폐기하세요. 큰 문서의 경우 모든 PDF를 메모리에 로드하는 대신 출력을 스트리밍하십시오. 트래픽 급증 시 메모리 소모를 방지하기 위해 요청 제한을 구현하십시오.

using IronPdf;
using Microsoft.Extensions.Logging;

public static class PdfProductionService
{
    // Limit concurrent PDF operations to avoid memory exhaustion
    private static readonly SemaphoreSlim Throttle = new SemaphoreSlim(5);

    public static async Task<byte[]> GeneratePdfAsync(string html, ILogger log)
    {
        await Throttle.WaitAsync();
        try
        {
            using var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    Timeout = 60,
                    UseMarginsOnHeaderAndFooter = UseMargins.아니요ne
                }
            };

            renderer.RenderingOptions.WaitFor.RenderDelay(1000);
            using var pdf = renderer.RenderHtmlAsPdf(html);

            log.LogInformation(
                "PDF generated: {Pages} pages, {Bytes} bytes",
                pdf.PageCount,
                pdf.BinaryData.Length);

            return pdf.BinaryData;
        }
        finally
        {
            Throttle.Release();
        }
    }
}
using IronPdf;
using Microsoft.Extensions.Logging;

public static class PdfProductionService
{
    // Limit concurrent PDF operations to avoid memory exhaustion
    private static readonly SemaphoreSlim Throttle = new SemaphoreSlim(5);

    public static async Task<byte[]> GeneratePdfAsync(string html, ILogger log)
    {
        await Throttle.WaitAsync();
        try
        {
            using var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    Timeout = 60,
                    UseMarginsOnHeaderAndFooter = UseMargins.아니요ne
                }
            };

            renderer.RenderingOptions.WaitFor.RenderDelay(1000);
            using var pdf = renderer.RenderHtmlAsPdf(html);

            log.LogInformation(
                "PDF generated: {Pages} pages, {Bytes} bytes",
                pdf.PageCount,
                pdf.BinaryData.Length);

            return pdf.BinaryData;
        }
        finally
        {
            Throttle.Release();
        }
    }
}
Imports IronPdf
Imports Microsoft.Extensions.Logging
Imports System.Threading

Public Module PdfProductionService
    ' Limit concurrent PDF operations to avoid memory exhaustion
    Private ReadOnly Throttle As New SemaphoreSlim(5)

    Public Async Function GeneratePdfAsync(html As String, log As ILogger) As Task(Of Byte())
        Await Throttle.WaitAsync()
        Try
            Using renderer As New ChromePdfRenderer With {
                .RenderingOptions = New ChromePdfRenderOptions With {
                    .Timeout = 60,
                    .UseMarginsOnHeaderAndFooter = UseMargins.None
                }
            }
                renderer.RenderingOptions.WaitFor.RenderDelay(1000)
                Using pdf = renderer.RenderHtmlAsPdf(html)
                    log.LogInformation("PDF generated: {Pages} pages, {Bytes} bytes", pdf.PageCount, pdf.BinaryData.Length)
                    Return pdf.BinaryData
                End Using
            End Using
        Finally
            Throttle.Release()
        End Try
    End Function
End Module
$vbLabelText   $csharpLabel

PDF 생성 상태를 어떻게 모니터링합니까?

모니터링을 통해 PDF 생성기의 상태를 파악할 수 있습니다. Application Insights를 사용하여 생성 시간, 실패율 및 자원 소비를 추적하십시오. 오류 증가나 응답 저하와 같은 이상 현상에 대한 경고를 설정하십시오. 문제 해결을 위해 각 요청에 대한 세부 정보를 기록하십시오.

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;

// Track custom metrics using Application Insights
var telemetry = new TelemetryClient(TelemetryConfiguration.CreateDefault());

var sw = System.Diagnostics.Stopwatch.StartNew();
var pdfBytes = await PdfProductionService.GeneratePdfAsync(html, logger);
sw.Stop();

telemetry.TrackMetric("PdfGenerationTimeMs", sw.Elapsed.TotalMilliseconds);
telemetry.TrackMetric("PdfFileSizeBytes", pdfBytes.Length);
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;

// Track custom metrics using Application Insights
var telemetry = new TelemetryClient(TelemetryConfiguration.CreateDefault());

var sw = System.Diagnostics.Stopwatch.StartNew();
var pdfBytes = await PdfProductionService.GeneratePdfAsync(html, logger);
sw.Stop();

telemetry.TrackMetric("PdfGenerationTimeMs", sw.Elapsed.TotalMilliseconds);
telemetry.TrackMetric("PdfFileSizeBytes", pdfBytes.Length);
Imports Microsoft.ApplicationInsights
Imports Microsoft.ApplicationInsights.Extensibility
Imports System.Diagnostics

' Track custom metrics using Application Insights
Dim telemetry As New TelemetryClient(TelemetryConfiguration.CreateDefault())

Dim sw As Stopwatch = Stopwatch.StartNew()
Dim pdfBytes = Await PdfProductionService.GeneratePdfAsync(html, logger)
sw.Stop()

telemetry.TrackMetric("PdfGenerationTimeMs", sw.Elapsed.TotalMilliseconds)
telemetry.TrackMetric("PdfFileSizeBytes", pdfBytes.Length)
$vbLabelText   $csharpLabel

Azure에서 고급 PDF 기능을 어떻게 처리합니까?

IronPDF의 고급 기능은 기본 생성 이상으로 PDF 생성기를 확장합니다. 이러한 기능은 Azure에서 완전하게 지원되며 전문적인 문서 처리 워크플로우를 가능하게 합니다.

암호화 및 권한으로 PDF를 어떻게 보호합니까?

IronPDF는 세밀한 문서 제어를 위한 암호 보호 및 권한 관리를 지원합니다. PDF 권한 및 암호 기능은 AES-256 암호화를 적용합니다:

using IronPdf;

// Load or generate the PDF
using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Secure Report</h1>");

// Apply password protection
pdf.SecuritySettings.UserPassword = "view-password";
pdf.SecuritySettings.OwnerPassword = "admin-password";

// Restrict permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;

pdf.SaveAs("azure-secure-report.pdf");
using IronPdf;

// Load or generate the PDF
using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Secure Report</h1>");

// Apply password protection
pdf.SecuritySettings.UserPassword = "view-password";
pdf.SecuritySettings.OwnerPassword = "admin-password";

// Restrict permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;

pdf.SaveAs("azure-secure-report.pdf");
Imports IronPdf

' Load or generate the PDF
Using pdf = New ChromePdfRenderer().RenderHtmlAsPdf("<h1>Secure Report</h1>")

    ' Apply password protection
    pdf.SecuritySettings.UserPassword = "view-password"
    pdf.SecuritySettings.OwnerPassword = "admin-password"

    ' Restrict permissions
    pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights
    pdf.SecuritySettings.AllowUserCopyPasteContent = False
    pdf.SecuritySettings.AllowUserAnnotations = False

    pdf.SaveAs("azure-secure-report.pdf")
End Using
$vbLabelText   $csharpLabel

암호화를 디지털 서명과 결합하여 부인 방지 및 변조 방지 문서를 생성할 수 있습니다.

머리글, 바닥글, 워터마크를 어떻게 추가합니까?

동적 페이지 번호와 머리글 및 바닥글, 사용자 정의 워터마크를 추가하는 것은 Azure에서 다른 .NET 환경과 동일하게 작동합니다:

using IronPdf;

using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Report content goes here.</p>");

// Add dynamic header with page numbers
var header = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;font-size:10px'>Page {page} of {total-pages}</div>",
    Height = 15
};
pdf.AddHTMLHeaders(header);

// Apply a draft watermark when needed
pdf.ApplyWatermark(
    "<h1 style='color:gray;opacity:0.3'>DRAFT</h1>",
    45,
    IronPdf.Editing.VerticalAlignment.Middle,
    IronPdf.Editing.HorizontalAlignment.Center);

pdf.SaveAs("report-with-header.pdf");
using IronPdf;

using var pdf = new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Report content goes here.</p>");

// Add dynamic header with page numbers
var header = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;font-size:10px'>Page {page} of {total-pages}</div>",
    Height = 15
};
pdf.AddHTMLHeaders(header);

// Apply a draft watermark when needed
pdf.ApplyWatermark(
    "<h1 style='color:gray;opacity:0.3'>DRAFT</h1>",
    45,
    IronPdf.Editing.VerticalAlignment.Middle,
    IronPdf.Editing.HorizontalAlignment.Center);

pdf.SaveAs("report-with-header.pdf");
Imports IronPdf

Using pdf = New ChromePdfRenderer().RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Report content goes here.</p>")
    ' Add dynamic header with page numbers
    Dim header As New HtmlHeaderFooter With {
        .HtmlFragment = "<div style='text-align:right;font-size:10px'>Page {page} of {total-pages}</div>",
        .Height = 15
    }
    pdf.AddHTMLHeaders(header)

    ' Apply a draft watermark when needed
    pdf.ApplyWatermark(
        "<h1 style='color:gray;opacity:0.3'>DRAFT</h1>",
        45,
        IronPdf.Editing.VerticalAlignment.Middle,
        IronPdf.Editing.HorizontalAlignment.Center)

    pdf.SaveAs("report-with-header.pdf")
End Using
$vbLabelText   $csharpLabel

PDF를 병합하거나 분할, 텍스트를 추출하고, PDF를 이미지로 변환, 그리고 PDF 폼을 작업할 수 있습니다.

어떤 일반적인 오류를 주의해야 합니까?

올바른 설정에도 불구하고 Azure에 PDF 생성기를 배포할 때 흔히 발생하는 특정 문제가 있습니다. 이러한 문제를 이해하면 귀중한 문제 해결 시간을 절약할 수 있습니다.

'액세스 거부' 오류는 왜 발생합니까?

'경로에 대한 액세스가 거부됩니다' 오류는 IronPDF가 임시 파일을 쓸 수 없을 때 발생합니다. 쓰기 권한을 보장하려면 Installation.CustomDeploymentDirectory = "/tmp"를 설정하세요. 패키지에서 실행 배포를 사용하는 경우 해당 모드에서는 /home/site/wwwroot가 읽기 전용이므로 앱에 별도의 쓰기 가능한 경로가 있는지 확인하세요.

타임아웃 및 렌더링 문제를 어떻게 해결합니까?

타임아웃 예외는 복잡한 문서를 렌더링하는 데 Azure의 함수 타임아웃을 초과할 때 발생합니다. 렌더러 타임아웃을 늘리거나 JavaScript가 많은 페이지에 대해 렌더링 지연을 추가하거나 대형 작업을 내구성 있는 작업 큐로 전환하십시오.

글꼴 렌더링 문제는 누락되었거나 잘못된 글꼴로 나타납니다. Base64 인코딩을 사용하여 글꼴을 포함시키고, Azure가 기본적으로 지원하는 웹 안전 글꼴을 사용하거나 완전한 글꼴 제어를 위해 컨테이너 배포로 전환하십시오.

PDF 생성 시 메모리 예외는 무엇 때문에 발생합니까?

메모리 예외는 PDF 생성의 메모리 집약적 특성 때문에 발생합니다. 일반적인 문제로는 대규모 또는 동시 요청 시 메모리 부족 예외가 발생하는 경우가 포함됩니다.

모범 사례는 다음과 같습니다:

  • PdfDocument 문을 사용하여 using 개체를 즉시 폐기하세요
  • 프로덕션 서비스 예시와 같이 SemaphoreSlim로 동시 요청을 제한하세요
  • 전체 바이트 배열을 로드하지 않고 대형 PDF에 스트림 기반 출력을 사용하십시오
  • 예측 가능한 메모리 할당을 위해 소비 계획에서 프리미엄 또는 전용으로 업그레이드하십시오

Azure PDF 생성기를 어떻게 배포하고 모니터링합니까?

견고한 배포 전략은 PDF 생성기가 안정적이고 관찰 가능하며 쉽게 업데이트 할 수 있도록 보장합니다. 다음 방법은 Azure 앱 서비스 또는 Azure 함수를 타겟으로 할 때 적용됩니다.

어떤 배포 모범 사례를 따라야 합니까?

  • 자동화된 CI/CD: 반복 가능하고 감사 가능한 배포를 위해 Azure DevOps 또는 GitHub Actions를 사용하십시오
  • 라이센스 키: IronPDF 라이센스를 소스 제어 또는 환경 변수 대신 Azure Key Vault에 저장하십시오
  • 작성 가능한 경로: 애플리케이션 시작 시 IronPDF 임시 폴더(Linux 컨테이너의 경우 /tmp)를 구성합니다
  • 패키지 선택: 컨테이너 기반 배포의 경우 IronPdf.Linux를 사용합니다; windows 앱 서비스용 표준 IronPdf 패키지를 사용하세요

모니터링 및 메트릭 설정을 어떻게 합니까?

애플리케이션 인사이트는 Azure 함수 및 앱 서비스와 직접 통합됩니다. TelemetryClient를 사용하여 PDF 생성 이벤트별 사용자 지정 메트릭을 추적하세요:

using Microsoft.ApplicationInsights;

var telemetryClient = new TelemetryClient();
telemetryClient.TrackMetric("PdfGenerationTimeMs", generationTime.TotalMilliseconds);
telemetryClient.TrackMetric("PdfPageCount", pdfPageCount);
telemetryClient.TrackMetric("PdfFileSizeBytes", fileSizeBytes);
using Microsoft.ApplicationInsights;

var telemetryClient = new TelemetryClient();
telemetryClient.TrackMetric("PdfGenerationTimeMs", generationTime.TotalMilliseconds);
telemetryClient.TrackMetric("PdfPageCount", pdfPageCount);
telemetryClient.TrackMetric("PdfFileSizeBytes", fileSizeBytes);
Imports Microsoft.ApplicationInsights

Dim telemetryClient As New TelemetryClient()
telemetryClient.TrackMetric("PdfGenerationTimeMs", generationTime.TotalMilliseconds)
telemetryClient.TrackMetric("PdfPageCount", pdfPageCount)
telemetryClient.TrackMetric("PdfFileSizeBytes", fileSizeBytes)
$vbLabelText   $csharpLabel

Azure 포털에서 메트릭 기반 경고를 설정하여 생성 시간에 대해 허용 가능한 임계값 이상으로 상승하거나 오류 비율이 급증할 때 알림을 받도록 합니다.

오늘 Azure PDF 생성 시작하기

이제 적합한 Azure 계층 선택 및 올바른 NuGet 패키지 설치부터 클라우드 환경을 위한 렌더러 구성, 보안 추가, 모니터링, 리소스 제한까지 적합한 Azure PDF 생성기를 구축하기 위한 완전한 그림이 있습니다.

Azure의 클라우드 인프라와 IronPDF의 Chrome 기반 렌더링 엔진의 조합으로 필요에 맞춰 확장되는 PDF 플랫폼을 만듭니다. 몇 개 문서를 처리하든 시간당 수천 개 문서를 처리하든, 생성기는 예측 가능한 비용으로 일관된 성능을 유지합니다.

IronPDF 기능 개요에서 사용 가능한 기능의 전체 범위를 이해한 후 문서를 탐색하여 API 세부 정보를 확인하십시오. 배포할 준비가 되면 무료 체험판 라이선스를 활성화하여 문서당 요금 없이 전체 기능을 테스트하십시오. 라이선스 옵션을 검토하여 생산 작업량에 맞는 계획을 선택하십시오.

추가 문서 처리 옵션은 IronPDF NuGet 설치 가이드 및 전체 IronSoftware 제품군를 참조하세요.

!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101000101111101010011010101000100000101010100100101010001000101111101010111010010010101010000010111110101010000010 10010010011110100010001010101010000110101010001011111010100010100100100100100101000001010011000101111101000101010110000101010001010100111001000100010001010100111110100001001001001100010011110100001001001100010011110100001101001011--}

자주 묻는 질문

PDF 생성에 IronPDF를 Azure에서 사용하는 장점은 무엇입니까?

IronPDF는 Azure와 원활하게 통합되어 확장성 및 신뢰성을 보장하는 엔터프라이즈급 PDF 생성 기능을 제공합니다. 이는 클라우드 환경에서 일반적으로 발생하는 샌드박스 제한 및 메모리 제한과 같은 문제를 극복합니다.

IronPDF는 Azure 환경에서 메모리 제한을 어떻게 처리합니까?

IronPDF는 Azure의 메모리 제한 내에서 작동하도록 최적화되어 있으며, 사용 가능한 리소스를 초과하지 않고 PDF를 생성할 수 있는 효율적인 처리 기술을 사용합니다.

IronPDF를 Azure Functions와 함께 사용할 수 있습니까?

예, IronPDF는 Azure Functions와 통합되어 자동 확장 및 비용 효율적인 실행의 이점을 제공하는 서버리스 PDF 생성 솔루션을 만들 수 있습니다.

Azure에서 IronPDF 사용 시 고려할 보안 요소는 무엇입니까?

IronPDF는 전송 중 및 저장 시 데이터 보호의 모범 사례를 준수하여 Azure의 보안 기준에 부합하는 안전한 PDF 생성을 지원합니다.

IronPDF를 Azure App Service에 배포할 수 있습니까?

물론입니다, IronPDF는 Azure App Service에 배포할 수 있으며, 개발자는 관리형 호스팅 환경 내에서 해당 기능을 활용할 수 있습니다.

IronPDF가 Azure에서 PDF 기능 사용자화를 지원합니까?

예, IronPDF는 Azure에서 실행되는 동안 레이아웃, 디자인, 상호작용을 포함한 풍부한 PDF 생성 사용자화 옵션을 제공합니다.

IronPDF는 분산 Azure 시스템에서 높은 성능을 어떻게 보장합니까?

IronPDF는 분산 시스템 전반에서 원활하게 확장되도록 설계되어 Azure의 인프라를 활용하여 높은 성능과 신뢰성을 유지합니다.

IronPDF가 Azure PDF 생성에 .NET 10을 지원합니까?

예, IronPDF는 Azure 환경의 전반에서—Functions, App Services, 컨테이너 배포 포함해서—완전하게 .NET 10과 호환됩니다. 특별한 해결책 없이 바로 사용하는 것이 가능합니다. IronPDF의 플랫폼 요구사항은 지원되는 런타임 중 하나로 .NET 10을 명시하고 있습니다. (ironpdf.com)

IronPDF는 어떤 .NET 버전을 지원하며, .NET 10과의 호환성이 성능을 어떻게 향상시키나요?

IronPDF는 .NET 6, 7, 8, 9 및 10을 포함한 광범위한 .NET 버전을 지원합니다. .NET 10을 사용하면 최신 런타임 최적화, 향상된 가비지 컬렉션, Azure에서 특히 서버리스 또는 컨테이너 기반 PDF 생성에 대한 향상된 성능 이점을 얻을 수 있습니다. ironpdf.com의 'C# PDF Library' 기능 목록은 .NET 10에 대한 지원을 확인합니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해