.NET Core에서 PDF 파일을 생성하는 방법

Convert HTML to PDF in .NET Core using C# with IronPDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

최신 .NET 애플리케이션에서는 HTML에서 고품질 PDF를 직접 생성하는 것이 일반적인 요구 사항입니다. 보고서, 송장, 티켓 등 모든 문서가 웹 UI와 일치하는 픽셀 단위까지 완벽한 출력을 필요로 합니다. IronPDF는 HTML, Razor 뷰 및 전체 웹사이트를 표준을 준수하는 PDF 문서로 렌더링하기 위한 단일 C# API를 제공하여 이러한 워크플로를 간소화합니다. 이 가이드를 마치면 개발자는 ASP.NET Core 프로젝트에서 URL, 원시 HTML 또는 MVC 뷰를 변환하고 동일한 코드를 Windows, Linux, Docker 또는 서버리스 환경에 배포할 수 있게 됩니다.

레이아웃 문제의 경우 IronPDF는 PDF가 렌더링되기 전에 CSS, JavaScript 및 미디어 쿼리 관련 문제를 진단하는 데 도움이 되는 헤드리스 Chrome 디버거를 제공합니다. 자세한 기술 정보는 픽셀 단위까지 완벽한 HTML-PDF 변환 가이드를 참조하세요.

빠른 시작: .NET Core에서 HTML을 PDF로 만들기

IronPDF 라이브러리를 사용하면 .NET Core에서 HTML을 PDF로 손쉽게 변환할 수 있습니다. 이 가이드는 최소한의 코드로 HTML 콘텐츠를 고품질 PDF로 렌더링하여 빠르게 시작할 수 있도록 간단한 예제를 제공합니다. PDF 생성 기능을 애플리케이션에 손쉽게 통합하려는 개발자에게 적합합니다.

Nuget Icon지금 바로 NuGet을 사용하여 PDF 만들기를 시작하세요.

  1. NuGet 패키지 관리자를 사용하여 IronPDF를 설치하세요.

    PM > Install-Package IronPdf

  2. 다음 코드 조각을 복사하여 실행하세요.

    var pdf = new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>");
  3. 실제 운영 환경에서 테스트할 수 있도록 배포하세요.

    지금 바로 무료 체험판을 통해 프로젝트에서 IronPDF를 사용해 보세요.
    arrow pointer

빠른 시작 체크리스트

  1. 설치Install-Package IronPdf
  2. URL 렌더링ChromePdfRenderer.RenderUrlAsPdf()
  3. 원시 HTML 렌더링ChromePdfRenderer.RenderHtmlAsPdf()
  4. Razor 뷰 내보내기ChromePdfRenderer.RenderHtmlAsPdfAsync()
  5. 출력 미세 조정ChromePdfRenderer.RenderingOptions 활용

이 튜토리얼에서 다루는 내용

  • URL, HTML 문자열 및 Razor 뷰 변환
  • 용지, 여백 및 미디어 유형 설정
  • 크로스 플랫폼 배포 (윈도우, 리눅스, Docker)
  • 후처리: PDF 병합, 워터마크 추가, 비밀번호 보호 및 디지털 서명
  • 엔드투엔드 샘플: 티켓 예매 MVC 앱

.NET Core에 PDF 라이브러리를 설치하는 방법은 무엇인가요?

이 라이브러리를 설치하는 것은 모든 .NET 8 프로젝트에서 한 줄짜리 명령으로 가능하며, .NET 9 미리 보기 및 곧 출시될 .NET 10과도 호환성을 유지합니다. NuGet 패키지 관리자 콘솔을 사용하면 패키지 관리자가 Windows, Linux, Docker 및 서버리스 대상에 필요한 모든 종속성을 자동으로 해결합니다.

PM> Install-Package IronPdf             # .NET 8 LTS and higher
PM> Install-Package IronPdf             # .NET 8 LTS and higher
SHELL

참고해 주세요 CLI가 필요하신가요? 동일한 명령어가 프로젝트 폴더 내의 dotnet add package IronPdf 에서도 작동합니다.

설치가 완료되면 모든 공개 URL을 변환하여 모든 연결이 제대로 되었는지 확인하십시오.

// Program.cs — .NET 8 LTS
using IronPdf;

var renderer = new ChromePdfRenderer();

// Render a live website to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://example.com");

// Persist to disk
pdf.SaveAs("website-snapshot.pdf");
// Program.cs — .NET 8 LTS
using IronPdf;

var renderer = new ChromePdfRenderer();

// Render a live website to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://example.com");

// Persist to disk
pdf.SaveAs("website-snapshot.pdf");
$vbLabelText   $csharpLabel

작동 방식

  • ChromePdfRenderer는 내부적으로 샌드박스 처리된 Chromium 인스턴스를 실행합니다. 별도의 Chrome 설치는 필요하지 않습니다.
  • RenderUrlAsPdf는 JavaScript 기반 콘텐츠, CSS 미디어 쿼리 및 글꼴을 포함하여 완전히 렌더링된 DOM을 캡처합니다.
  • 결과적으로 생성되는 PdfDocument는 출력물을 병합하거나, 암호로 보호하거나, 디지털 서명하는 데 도움이 되는 메서드를 제공합니다. 이러한 기능은 이 튜토리얼의 뒷부분에서 다룹니다.

Azure App Service, AWS Lambda, 온프레미스 Linux 등 배포 관련 세부 사항은 전용 설치 가이드고급 NuGet 설정 페이지를 참조하세요. Docker 및 K8s 클러스터에 대한 내부 CI/CD 팁은 Docker 배포 모범 사례 에서 다룹니다.


.NET Core 서비스에서 웹사이트 URL을 PDF로 변환하는 방법은 무엇인가요?

RenderUrlAsPdf를 한 번만 호출하면 됩니다. 공개적으로 접근 가능한 URL을 전달하면 IronPDF는 표준을 준수하는 완벽하게 렌더링된 PDF를 반환합니다. 아래 코드는 .NET 8 LTS를 대상으로 하며, .NET 9 미리 보기 버전과 2025년에 출시될 예정인 .NET 10에서도 변경 없이 컴파일됩니다.

단계별 예시

// Program.cs — .NET 8 LTS-compatible
using IronPdf;

// 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// 2. Create a reusable renderer instance
var renderer = new ChromePdfRenderer
{
    RenderingOptions =
    {
        // Force A4 portrait output and apply @media print styles
        PaperSize    = PdfPaperSize.A4,
        CssMediaType = PdfCssMediaType.Print
    }
};

// 3. Convert Microsoft Docs home page to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://learn.microsoft.com/");

// 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf");
// Program.cs — .NET 8 LTS-compatible
using IronPdf;

// 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// 2. Create a reusable renderer instance
var renderer = new ChromePdfRenderer
{
    RenderingOptions =
    {
        // Force A4 portrait output and apply @media print styles
        PaperSize    = PdfPaperSize.A4,
        CssMediaType = PdfCssMediaType.Print
    }
};

// 3. Convert Microsoft Docs home page to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://learn.microsoft.com/");

// 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf");
$vbLabelText   $csharpLabel

작동 원리

  • ChromePdfRenderer는 시스템 Chrome 종속성 없이 샌드박스 환경에서 Chromium 인스턴스를 실행하여 Docker 이미지 크기를 줄입니다.
  • RenderUrlAsPdf는 스냅샷을 찍기 전에 DOM과 JavaScript가 완료될 때까지 기다리므로 단일 페이지 앱이 올바르게 렌더링됩니다.
  • CssMediaType 를 인쇄 로 설정하면 엔진은 브라우저의 인쇄 → PDF로 저장 출력과 일치하는 인쇄 관련 규칙을 사용하게 됩니다.
  • 생성된 PdfDocument는 암호화, 디지털 서명, 병합 또는 래스터화할 수 있으며, 이러한 기능은 이후 섹션에서 다룹니다.

픽셀 단위 디버깅: renderer.LoggingOptions.DebugMode = true를 활성화하고 헤드리스 크롬 디버그 가이드를 따라 렌더링 중 실시간 개발자 도구를 검사하세요.

관련 자료


.NET Core에서 HTML 원본을 PDF로 변환하는 방법은 무엇인가요?

HTML 문자열이나 Razor 뷰의 렌더링된 마크업을 ChromePdfRenderer.RenderHtmlAsPdf에 전달하면 표준을 준수하는 PDF가 즉시 생성됩니다. 이 방법은 IronPDF에 내장된 Chromium 엔진을 실행하므로 외부 브라우저 설치나 WebView 종속성이 필요하지 않습니다. 아래에 표시된 코드는 현재 .NET 8 LTS에서 컴파일되며 .NET 9 및 2025년 11월 출시 예정인 .NET 10과도 호환성을 유지합니다.

예시 - HTML 조각에서 PDF 생성

// Program.cs — compatible with .NET 8 and newer
using IronPdf;

// Sample HTML fragment (could also be read from a file, Razor view, or CMS)
const string html = """
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Quarterly Report</title>
  <style>
     body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
     header { margin-bottom:2rem; }
     h1 { color:#3056d3; }
     table { width:100%; border-collapse:collapse; margin-top:1rem; }
     th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
     tr:nth-child(even){ background-color:#f8f9fa; }
  </style>
</head>
<body>
  <header><h1>Q2 Revenue Summary</h1></header>
  <table>
    <thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
    <tbody>
      <tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
      <tr><td>IronOCR for .NET</td><td>890,000</td></tr>
      <tr><td>IronXL for .NET</td><td>610,000</td></tr>
    </tbody>
  </table>
</body>
</html>
""";

// 1. Create a renderer once and reuse it across conversions
var renderer = new ChromePdfRenderer
{
    RenderingOptions =
    {
        PaperSize    = PdfPaperSize.A4,                  // ISO-standard paper size
        PaperOrientation = PdfPaperOrientation.Portrait,
        CssMediaType = PdfCssMediaType.Screen,           // Respect on-screen CSS
        RenderDelay  = 100,                              // Wait 100 ms for JS/animations
        FallbackEncoding = "utf-8"                       // Handle non-ASCII correctly
    }
};

// 2. Render the HTML fragment
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);

// 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf");
// Program.cs — compatible with .NET 8 and newer
using IronPdf;

// Sample HTML fragment (could also be read from a file, Razor view, or CMS)
const string html = """
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Quarterly Report</title>
  <style>
     body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
     header { margin-bottom:2rem; }
     h1 { color:#3056d3; }
     table { width:100%; border-collapse:collapse; margin-top:1rem; }
     th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
     tr:nth-child(even){ background-color:#f8f9fa; }
  </style>
</head>
<body>
  <header><h1>Q2 Revenue Summary</h1></header>
  <table>
    <thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
    <tbody>
      <tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
      <tr><td>IronOCR for .NET</td><td>890,000</td></tr>
      <tr><td>IronXL for .NET</td><td>610,000</td></tr>
    </tbody>
  </table>
</body>
</html>
""";

// 1. Create a renderer once and reuse it across conversions
var renderer = new ChromePdfRenderer
{
    RenderingOptions =
    {
        PaperSize    = PdfPaperSize.A4,                  // ISO-standard paper size
        PaperOrientation = PdfPaperOrientation.Portrait,
        CssMediaType = PdfCssMediaType.Screen,           // Respect on-screen CSS
        RenderDelay  = 100,                              // Wait 100 ms for JS/animations
        FallbackEncoding = "utf-8"                       // Handle non-ASCII correctly
    }
};

// 2. Render the HTML fragment
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);

// 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf");
$vbLabelText   $csharpLabel

이 코드가 보여주는 것

  • Chromium 내장 -- IronPDF는 Chromium 엔진을 포함하여 최신 브라우저와 HTML5, CSS3 및 JavaScript 호환성을 보장합니다.
  • 단일 종속성 -- 가벼운 NuGet 설치로 Windows, Linux, Docker 및 Azure/AWS를 추가 시스템 라이브러리 없이 지원합니다.
  • 렌더링 옵션 -- PaperSize, CssMediaType, 및 RenderDelay는 브라우저 인쇄 설정을 반영하여 PDF가 화면 레이아웃과 일치하도록 합니다.
  • 미래 지향적인 타겟팅 -- API 표면은 .NET 8, .NET 9 STS 및 곧 출시될 .NET 10에서 동일하므로 장기적인 유지 관리가 최소화됩니다 .
  • 후처리 후크 -- PdfDocument는 병합, 암호 보호 및 디지털 서명을 위한 도우미 기능을 제공합니다. 각 기능은 이 가이드의 뒷부분에서 자세히 다룹니다.

추가 정보: 단계별 HTML 문자열-PDF 변환 튜토리얼 과 전체 ChromePdfRenderer API 문서를 참조하세요.


ASP .NET Core MVC 뷰를 PDF로 내보내는 방법은 무엇인가요?

IronPDF는 브라우저와 동일한 방식으로 완전히 처리된 Razor 뷰( .cshtml )를 렌더링하고 결과를 PdfDocument로 스트리밍합니다. 아래 워크플로는 컨트롤러 로직을 깔끔하게 유지하고, 브라우저 플러그인이 필요하지 않으며, .NET 8 LTS, .NET 9 미리 보기 및 2025년 11월 출시 예정인 .NET 10에서 작동합니다.

엔드투엔드 컨트롤러 예시

// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models;           // TicketViewModel

public class TicketsController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public TicketsController()
    {
        _renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                PaperSize        = PdfPaperSize.A5,            // Compact ticket size
                PaperOrientation = PdfPdfOrientation.Portrait,
                FitToPaperWidth  = true,
                CssMediaType     = PdfCssMediaType.Print,
                Margins = new PdfMargins(5, 10, 5, 10)         // mm
            }
        };
    }

    // GET /Tickets/Print/42
    public async Task<IActionResult> Print(int id)
    {
        TicketViewModel vm = await _service.GetTicketAsync(id);

        // 1. Render the Razor view to an HTML string
        string html  = await RazorTemplateEngine.RenderViewAsync(
                           HttpContext, "~/Views/Tickets/Print.cshtml", vm);

        // 2. Convert HTML → PDF
        using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        // 3. Stream back as a file
        return File(pdf.BinaryData, "application/pdf",
                    $"ticket-{id}.pdf");
    }
}
// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models;           // TicketViewModel

public class TicketsController : Controller
{
    private readonly ChromePdfRenderer _renderer;

    public TicketsController()
    {
        _renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                PaperSize        = PdfPaperSize.A5,            // Compact ticket size
                PaperOrientation = PdfPdfOrientation.Portrait,
                FitToPaperWidth  = true,
                CssMediaType     = PdfCssMediaType.Print,
                Margins = new PdfMargins(5, 10, 5, 10)         // mm
            }
        };
    }

    // GET /Tickets/Print/42
    public async Task<IActionResult> Print(int id)
    {
        TicketViewModel vm = await _service.GetTicketAsync(id);

        // 1. Render the Razor view to an HTML string
        string html  = await RazorTemplateEngine.RenderViewAsync(
                           HttpContext, "~/Views/Tickets/Print.cshtml", vm);

        // 2. Convert HTML → PDF
        using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);

        // 3. Stream back as a file
        return File(pdf.BinaryData, "application/pdf",
                    $"ticket-{id}.pdf");
    }
}
$vbLabelText   $csharpLabel

이 코드가 보여주는 것

  • 임시 파일이 없습니다 . Razor 뷰는 메모리에 렌더링된 다음 RenderHtmlAsPdf 로 직접 전달되어 디스크 I/O 및 임시 폴더 경쟁 조건을 방지합니다.
  • 티켓 크기의 출력물 -- PaperSize = A5 및 좁은 여백으로 가정에서 출력하는 티켓을 컴팩트하게 유지할 수 있습니다.
  • 일관된 인쇄 스타일 -- CssMediaType = Print는 브라우저에서 사용하는 것과 동일한 @media print CSS 규칙을 적용합니다.
  • 바이너리 스트리밍 -- pdf.BinaryData는 파일 시스템을 건드리지 않고 문서를 스트리밍합니다. API 엔드포인트 및 Lambda 함수에 이상적입니다.
  • 재사용 가능한 렌더러 -- ChromePdfRenderer는 컨트롤러당 한 번 인스턴스화된 후 재사용되어 프로세스 생성 오버헤드를 최소화합니다.
##

`PaperSize` , `PaperOrientation` , `FitToPaperWidth`

##

`Margins` , `Header` , `Footer` , `Watermark`

다음 단계: 암호화, 디지털 서명을 추가하거나 여러 티켓을 하나의 파일로 병합하세요. 병합 예시디지털 서명 방법을 참조하세요.


인쇄하기 전에 용지 크기, 여백, 머리글, 워터마크 및 보안 설정을 어떻게 세밀하게 조정할 수 있나요?

IronPDF는 용지 크기, 방향, 머리글 및 바닥글, JavaScript 타이밍, 워터마크, 암호화 및 디지털 서명 등 출력의 모든 측면을 제어하는 단일 ChromePdfRenderOptions 객체를 제공하며, 추가 브라우저 플러그인이 필요하지 않습니다.

코드 예시 — 여러 옵션을 한 번에 적용하기

// AdvancedOptions.cs — .NET 8 compatible
using IronPdf;

var renderer = new ChromePdfRenderer();

// Configure everything in one place
renderer.RenderingOptions = new ChromePdfRenderOptions
{
    // 1. Page layout
    PaperSize        = PdfPaperSize.A4,                     // ISO size
    PaperOrientation = PdfPdfOrientation.Portrait,
    Margins          = new PdfMargins { Top = 20, Bottom = 25, Left = 15, Right = 15 }, // mm

    // 2. Timing & media
    CssMediaType     = PdfCssMediaType.Print,               // Respect @media print
    EnableJavaScript = true,
    RenderDelay      = 200,                                 // Wait 200 ms for animations

    // 3. Headers & footers (HTML gives full design freedom)
    HtmlHeader       = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
    HtmlFooter       = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",

    // 4. Watermark
    Watermark        = new HtmlStamp
    {
        HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
        VerticalAlignment = VerticalAlignment.Center,
        HorizontalAlignment = HorizontalAlignment.Center
    },

    // 5. Security
    SecurityOptions = new PdfSecurityOptions
    {
        OwnerPassword = "StrongOwnerPwd!",
        UserPassword  = "ReadOnly",
        AllowUserPrinting = false,
        AllowUserCopyPasteContent = false
    }
};

// Render any HTML
using PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>");

// Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval");

// Save
pdf.SaveAs("advanced-options-demo.pdf");
// AdvancedOptions.cs — .NET 8 compatible
using IronPdf;

var renderer = new ChromePdfRenderer();

// Configure everything in one place
renderer.RenderingOptions = new ChromePdfRenderOptions
{
    // 1. Page layout
    PaperSize        = PdfPaperSize.A4,                     // ISO size
    PaperOrientation = PdfPdfOrientation.Portrait,
    Margins          = new PdfMargins { Top = 20, Bottom = 25, Left = 15, Right = 15 }, // mm

    // 2. Timing & media
    CssMediaType     = PdfCssMediaType.Print,               // Respect @media print
    EnableJavaScript = true,
    RenderDelay      = 200,                                 // Wait 200 ms for animations

    // 3. Headers & footers (HTML gives full design freedom)
    HtmlHeader       = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
    HtmlFooter       = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",

    // 4. Watermark
    Watermark        = new HtmlStamp
    {
        HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
        VerticalAlignment = VerticalAlignment.Center,
        HorizontalAlignment = HorizontalAlignment.Center
    },

    // 5. Security
    SecurityOptions = new PdfSecurityOptions
    {
        OwnerPassword = "StrongOwnerPwd!",
        UserPassword  = "ReadOnly",
        AllowUserPrinting = false,
        AllowUserCopyPasteContent = false
    }
};

// Render any HTML
using PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>");

// Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval");

// Save
pdf.SaveAs("advanced-options-demo.pdf");
$vbLabelText   $csharpLabel

이러한 선택 사항들이 중요한 이유

  • PaperSize, Margins, 및 CssMediaType 브라우저의 인쇄 대화 상자를 미러링하여 화면 레이아웃과 PDF가 Windows, Linux 및 Docker에서 동일하게 유지되도록 합니다.
  • HTML 헤더와 푸터는 Razor 토큰, CSS 및 JavaScript를 지원하므로 동적 페이지 번호 또는 브랜딩에 유용합니다.
  • HtmlStamp 사용하면 HTML과 CSS를 완벽하게 제어하여 단 한 줄의 코드로 브랜드 워터마크를 만들 수 있습니다.
  • 보안 옵션을 통해 타사 도구 없이 128비트 암호화, 소유자/사용자 암호 및 세부적인 권한 설정을 사용할 수 있습니다.
  • 디지털 서명은 코드에 직접 암호화 봉인을 추가하여 법적 진위성과 위변조 방지 기능을 유지합니다.
  • ExtractAllTextExtractAllImages와 같은 추출 도우미는 분석이 필요한 경우 프로세스를 역으로 수행합니다.

빠른 참조 — 자주 사용하는 설정

##

`PaperSize` , `PaperOrientation` , `Margins` , `CssMediaType` , `RenderDelay`

##

`HtmlHeader` , `HtmlFooter` , 동적 Razor 플레이스홀더, 페이지 번호 토큰

##

`Watermark` , `HtmlStamp` , 투명도, 정렬

##

`SecurityOptions` , `SignAndStamp` , 소유자/사용자 암호, 인증서 봉인

다음 작업: 여러 PDF 파일 병합, 텍스트 및 이미지 추출, Docker 또는 서버리스 환경에 배포. 플랫폼 간 호환성을 확보하려면 배포 섹션으로 진행하십시오.


Linux와 Windows의 Docker 환경에 PDF 생성 코드를 배포하려면 어떻게 해야 할까요?

IronPDF는 단일 독립형 NuGet 패키지 로 제공되므로 Windows와 Linux 모두 에서 ASP.NET Core(또는 콘솔) 앱을 컨테이너화하는 것이 간단합니다. 핵심은 게시된 바이너리를 간소화된 런타임 이미지에 복사하고, Linux에서는 IronPDF에 필요한 두 가지 네이티브 라이브러리(libnss3libatk1.0-0)를 추가하는 것입니다.

멀티스테이지 Dockerfile (Ubuntu 22.04)

참고해 주세요 왜 다단계인가요? SDK 이미지(1단계)는 프로젝트를 컴파일합니다. 빌드 도구가 폐기되므로 최종 런타임 이미지(2단계)는 120MB 미만의 가벼운 크기를 유지합니다.

####### ---------- stage 1 ----------
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyPdfApp.csproj", "."]
RUN dotnet restore

COPY . .
RUN dotnet publish -c Release -o /app/publish

####### ---------- stage 2 ----------
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy
######## Install two native libs required by Chromium
RUN apt-get update && \
    apt-get install -y --no-install-recommends libnss3 libatk1.0-0 && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyPdfApp.dll"]

[{i:( Windows 컨테이너? 두 번째 단계를 mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022로 바꾸세요. Chromium DLL이 번들로 제공되므로 추가 패키지가 필요하지 않습니다.

엔드투엔드 검증 스크립트

docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
SHELL
  • API 작업은 섹션 2에서와 같이 내부적으로 ChromePdfRenderer.RenderUrlAsPdf를 호출합니다.
    IronPDF는 컨테이너 내부에서 샌드박스 처리된 Chromium 프로세스를 실행합니다. 헤드리스 렌더링을 사용하기 때문에 X 서버가 필요하지 않습니다.
  • 대용량 렌더링 중에도 메모리 사용량은 200MB 미만으로 유지됩니다.

문제 해결 팁: 컨테이너 로그에 "libnss3.so를 찾을 수 없음" 오류가 표시되면 libnss3libatk1.0-0가 모두 존재하는지 확인하십시오. musl C 라이브러리에 필요한 심볼이 부족하여 Alpine 이미지를 지원 하지 않습니다 .

내부 자원


.NET Core에서 기존 PDF 파일을 열고, 병합하고, 워터마크를 추가하고, 콘텐츠를 추출하는 방법은 무엇인가요?

IronPDF는 IronPDF, Adobe® Acrobat 또는 타사 도구로 생성된 모든 PDF 파일을 품질 손실 없이 열고, 편집하고, 보호하고, 다시 저장할 수 있는 최고 수준의 PdfDocument 객체로 취급합니다. 동일한 API 인터페이스는 현재 .NET 8 LTS에서 작동하며 .NET 9 미리 보기 및 곧 출시될 .NET 10에서도 변경 없이 컴파일됩니다.

통합 샘플 — 열기 → 병합 → 워터마크 → 추출

// ManipulateExistingPdf.cs — .NET 8 LTS compatible
using IronPdf;
using System.Linq;

// Step 1: Open two existing files (password-protected PDFs are supported)
PdfDocument invoice  = PdfDocument.FromFile("invoice.pdf", "ReadOnly");   // open with user pwd
PdfDocument tAndCs   = PdfDocument.FromFile("terms.pdf");                 // no pwd required

// Step 2: Merge them (invoice pages first, then T&Cs)
PdfDocument mergedPdf = PdfDocument.Merge(invoice, tAndCs);               // 1-liner merge

// Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp(
    "<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);"
  + "width:100%;text-align:center;'>CONFIDENTIAL</div>",
    verticalAlignment   : VerticalAlignment.Center,
    horizontalAlignment : HorizontalAlignment.Center);

// Step 4: Extract all text and the first image for audit purposes
string fullText = mergedPdf.ExtractAllText();
var    image    = mergedPdf.ExtractAllImages().FirstOrDefault();

// Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf");
// ManipulateExistingPdf.cs — .NET 8 LTS compatible
using IronPdf;
using System.Linq;

// Step 1: Open two existing files (password-protected PDFs are supported)
PdfDocument invoice  = PdfDocument.FromFile("invoice.pdf", "ReadOnly");   // open with user pwd
PdfDocument tAndCs   = PdfDocument.FromFile("terms.pdf");                 // no pwd required

// Step 2: Merge them (invoice pages first, then T&Cs)
PdfDocument mergedPdf = PdfDocument.Merge(invoice, tAndCs);               // 1-liner merge

// Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp(
    "<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);"
  + "width:100%;text-align:center;'>CONFIDENTIAL</div>",
    verticalAlignment   : VerticalAlignment.Center,
    horizontalAlignment : HorizontalAlignment.Center);

// Step 4: Extract all text and the first image for audit purposes
string fullText = mergedPdf.ExtractAllText();
var    image    = mergedPdf.ExtractAllImages().FirstOrDefault();

// Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf");
$vbLabelText   $csharpLabel

이것이 중요한 이유

  • 열기 및 병합PdfDocument.FromFile는 암호화된 파일을 포함하여 표준을 준수하는 모든 PDF를 로드하고, PdfDocument.Merge는 단일 호출로 임의의 개수의 문서를 연결합니다.
  • 워터마크ApplyStamp (별칭 HtmlStamp)는 래스터화 없이 선택한 페이지에 로고, QR 코드 또는 대각선 텍스트와 같은 완벽하게 스타일링된 HTML/CSS 오버레이를 삽입합니다.
  • 콘텐츠 추출ExtractAllTextExtractAllImages는 다운스트림 아카이빙 또는 AI 파이프라인을 위해 원시 UTF-8 텍스트 또는 바이너리 이미지 스트림을 추출합니다.
  • 디지털 서명 준비 완료 – 동일한 PdfDocument 인스턴스를 SignAndStamp로 봉인하여 ISO 32000-2 디지털 서명 요구 사항 에 맞춰 RFC 3161을 준수하는 해시를 생성할 수 있습니다.
  • 개방형 표준 준수 – IronPDF는 원본 PDF 구조(글꼴, 레이어, XMP 메타데이터)를 유지하므로 출력물이 Adobe® Reader 및 기타 ISO 32000-1 뷰어와 호환됩니다.
  • 미래 지향적 – 이 API는 상호 운용 어셈블리 및 Win32 GDI 호출을 사용하지 않으므로 코드는 Windows, Linux, Docker 및 향후 출시될 .NET 10 서버리스 SKU에서 변경 없이 실행됩니다.

페이지를 분할, 회전 또는 삭제해야 하시나요? 세부적인 작업 방법은 페이지 수준 편집 튜토리얼을 참조하세요.


.NET Core에서 PDF 파일을 암호화하고 디지털 서명하는 방법은 무엇인가요?

IronPDF는 두 단계를 통해 문서를 보호합니다. 첫 번째 단계는 AES 기반 암호화 (사용자/소유자 암호 + 세부적인 권한 설정)이고, 두 번째 단계는 암호화 해시로 파일을 봉인하는 X.509 디지털 서명입니다 . 두 API는 동일한 PdfDocument 객체에 존재하므로 워크플로는 현재 .NET 8 LTS에서 동일하며 .NET 9 미리 보기 및 곧 출시될 .NET 10에서도 변경 없이 컴파일됩니다.

예시 — 256비트 AES 암호화를 적용하고, 인쇄 권한을 잠그고, 서명을 표시합니다.

// SecureAndSign.cs — .NET 8 LTS compatible
using IronPdf;

// Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
PdfDocument pdf = PdfDocument.FromFile("financial-report.pdf");

// Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = new PdfSecuritySettings
{
    EncryptionAlgorithm   = PdfEncryptionAlgorithm.AES256Bit,
    OwnerPassword         = "IronAdmin!2025",
    UserPassword          = "ReadOnly",
    AllowUserPrinting     = PdfPrintSecurity.Disabled,
    AllowUserCopyPasteContent = false,
    AllowUserAnnotations  = false
};

// Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(
    certificatePath : "./certs/ironsoftware.pfx",
    authority       : "Iron Software Ltd.",
    location        : "Chicago, IL",
    reason          : "Final approval"
);

// Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf");
// SecureAndSign.cs — .NET 8 LTS compatible
using IronPdf;

// Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
PdfDocument pdf = PdfDocument.FromFile("financial-report.pdf");

// Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = new PdfSecuritySettings
{
    EncryptionAlgorithm   = PdfEncryptionAlgorithm.AES256Bit,
    OwnerPassword         = "IronAdmin!2025",
    UserPassword          = "ReadOnly",
    AllowUserPrinting     = PdfPrintSecurity.Disabled,
    AllowUserCopyPasteContent = false,
    AllowUserAnnotations  = false
};

// Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(
    certificatePath : "./certs/ironsoftware.pfx",
    authority       : "Iron Software Ltd.",
    location        : "Chicago, IL",
    reason          : "Final approval"
);

// Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf");
$vbLabelText   $csharpLabel

비하인드 스토리

  • AES-256 암호화 -- IronPDF는 NIST 승인 AES 키로 페이로드를 감싸 무단 열람, 인쇄 또는 복사 붙여넣기를 차단합니다.
  • 권한 세분화 -- AllowUserPrintingAllowUserFormData 와 같은 속성은 작업별 권한을 전환합니다. 제한 사항을 적용하려면 소유자 암호가 필요합니다.
  • 디지털 서명 -- SignAndStamp는 RFC 3161 타임스탬프와 인증서 체인을 포함하여 Adobe® Acrobat 및 기타 ISO 32000-2 뷰어에서 인식할 수 있는 변조 방지 해시를 생성합니다.
  • 원스톱 API -- 암호화와 서명 모두 동일한 PdfDocument 인스턴스를 수정하므로 여러 파일 처리를 방지하고 내부 글꼴, 레이어 및 메타데이터를 보존합니다.

[{t:( 문제 해결 팁: Adobe Reader에서 "잘못된 서명" 오류가 발생하는 경우, PFX 파일에 신뢰할 수 있는 루트 인증서가 포함되어 있는지, 그리고 reason/location 문자열이 ASCII 형식으로 올바른지 확인하십시오.