푸터 콘텐츠로 바로가기
마이그레이션 가이드

Playwright에서 IronPDF로의 마이그레이션 방법 (C#)

Playwright for .NET에서 IronPDF로의 마이그레이션은 테스트 중심의 브라우저 자동화 도구에서 목적에 맞게 제작된 PDF 라이브러리로 PDF 생성 워크플로를 변환합니다. 이 가이드는 복잡한 비동기 패턴, 브라우저 수명 주기 관리, 400MB 이상의 브라우저 다운로드를 제거하면서 더 나은 성능과 전문적인 PDF 기능을 제공하는 완전한 단계별 마이그레이션 경로를 제공합니다.

왜 Playwright에서 IronPDF로 마이그레이션해야 하는가

Playwrightfor .NET 이해하기

Playwright for .NET은 Microsoft의 끝에서 끝까지의 테스트 프레임워크이며 문서 생성 라이브러리가 아닙니다. Chromium, 파이어폭스, 웹킷 브라우저 전반에서 자동화된 테스트를 위해 처음부터 빌드되었습니다. Playwright는 버튼 클릭, 폼 작성, 네트워크 요청 가로채기, 스크린샷 찍기, 크로스 브라우저 호환성 검증과 같은 테스트 시나리오에서 뛰어납니다.

중요한 이해: Playwright는 PDF 생성을 위해 재사용되는 테스트 도구입니다. PDF 생성은 기본적인 설계 목표가 아니라 브라우저의 인쇄 기능(Ctrl+P)의 부수효과일 뿐입니다. 이로 인해 근본적인 설계 불일치가 발생합니다:

  • 테스트 우선 아키텍처: 현재 브라우저 테스트용으로 설계되었으며 비즈니스 문서 제작을 위한 것이 아닙니다.
  • 다중 브라우저 오버헤드: PDF 생성 만 필요할 때도 400MB 이상의 브라우저 바이너리(Chromium, 파이어폭스, 웹킷)를 다운로드합니다.
  • 테스트 중심 API: 문서 생성이 아닌 테스트 자동화 워크플로에 적합한 복잡한 비동기 패턴
  • 문서 기능 부족: PDF/A 준수, 디지털 서명, 워터마킹, 병합, 보안 통제 기능 없음

테스트 프레임워크 문제

Playwright는 끝에서 끝까지의 테스트를 위한 것이며 문서 생성을 위한 것이 아닙니다. 따라서 PDF에 사용하는데 근본적인 문제가 발생합니다:

  1. 처음 사용 전 400MB 이상의 브라우저 다운로드 Playwright의 기본 구성은 여러 개의 브라우저를 다운로드해야 하며 이는 자원 제약이 엄격한 환경에서 고려할 수 있습니다.

  2. 브라우저 컨텍스트와 페이지 관리를 포함한 복잡한 비동기 패턴 개발자는 브라우저 컨텍스트와 페이지 관리에 대한 친숙도를 얻고, 적절한 처리 종료 방법을 습득해야 합니다.

  3. 문서 생성에 최적화되지 않은 테스트 우선 아키텍처

  4. Ctrl+P 브라우저 인쇄와 같은 Print-to-PDF 제한 레이아웃이 재흐름하며, 기본적으로 배경이 생략되고 출력이 인쇄용으로 페이지가 나뉩니다.

  5. 접근성 준수를 위한 PDF/A 또는 PDF/UA 지원 없음 Playwright는 PDF/A(보관) 또는 PDF/UA(접근성) 준수 문서를 생성할 수 없습니다. 섹션 508 또는 EU 접근성 지침, 장기 저장 요건을 위해서는 별도의 PDF 라이브러리가 필요합니다.

  6. 전체 브라우저 인스턴스를 요구하는 리소스 집약적 작업

테스트 프레임워크 구성 문제

Playwright는 문서 개발자들이 필요로 하지 않는 광범위한 테스트 중심 구성을 필요로 합니다.

브라우저 설치 필요:

# Manual installation step required before first use
playwright install  # Downloads 400MB+ of browser binaries
# Or programmatically:
playwright install chromium  # Still 100MB+ for single browser
# Manual installation step required before first use
playwright install  # Downloads 400MB+ of browser binaries
# Or programmatically:
playwright install chromium  # Still 100MB+ for single browser
SHELL

브라우저 시작 구성:

// Testing-focused launch options for PDF generation
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Headless = true,  // Required for server environments
    Args = new[] { "--disable-gpu", "--no-sandbox" } // Linux/Docker configs
});
// Testing-focused launch options for PDF generation
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Headless = true,  // Required for server environments
    Args = new[] { "--disable-gpu", "--no-sandbox" } // Linux/Docker configs
});
' Testing-focused launch options for PDF generation
Using playwright = Await Playwright.CreateAsync()
    Dim browser = Await playwright.Chromium.LaunchAsync(New BrowserTypeLaunchOptions With {
        .Headless = True,  ' Required for server environments
        .Args = New String() { "--disable-gpu", "--no-sandbox" } ' Linux/Docker configs
    })
End Using
$vbLabelText   $csharpLabel

테스트 전용 구성 옵션:

  • Headless: 프로덕션용으로 헤드리스 모드를 설정해야 함 (테스트용으로 기본값은 헤드모드)
  • SlowMo: 테스트 타이밍 지연 (PDF 생성에는 무관)
  • Devtools: 테스트 도구 구성 (문서에는 필요 없음)
  • ExecutablePath: 테스트 환경을 위한 사용자 정의 브라우저 경로
  • Proxy: 테스트를 위한 네트워크 가로채기 (불필요한 오버헤드)
  • DownloadsPath: 테스트 아티팩트 관리
  • TracesDir: 테스트 실행 추적

브라우저 컨텍스트 관리:

// Complex context lifecycle from testing paradigm
var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    ViewportSize = new ViewportSize { Width = 1920, Height = 1080 },
    UserAgent = "custom-user-agent",
    Locale = "en-US",
    TimezoneId = "America/New_York"
});
var page = await context.NewPageAsync();
// ... generate PDF ...
await context.CloseAsync();  // Manual cleanup required
await browser.CloseAsync();  // Manual cleanup required
// Complex context lifecycle from testing paradigm
var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    ViewportSize = new ViewportSize { Width = 1920, Height = 1080 },
    UserAgent = "custom-user-agent",
    Locale = "en-US",
    TimezoneId = "America/New_York"
});
var page = await context.NewPageAsync();
// ... generate PDF ...
await context.CloseAsync();  // Manual cleanup required
await browser.CloseAsync();  // Manual cleanup required
' Complex context lifecycle from testing paradigm
Dim context = Await browser.NewContextAsync(New BrowserNewContextOptions With {
    .ViewportSize = New ViewportSize With {.Width = 1920, .Height = 1080},
    .UserAgent = "custom-user-agent",
    .Locale = "en-US",
    .TimezoneId = "America/New_York"
})
Dim page = Await context.NewPageAsync()
' ... generate PDF ...
Await context.CloseAsync()  ' Manual cleanup required
Await browser.CloseAsync()  ' Manual cleanup required
$vbLabelText   $csharpLabel

다중 브라우저의 복잡성:

//Playwrightdownloads multiple browsers by default
await playwright.Chromium.LaunchAsync();  // For Chrome testing
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For Safari testing
// All downloaded but only Chromium needed for PDF generation
//Playwrightdownloads multiple browsers by default
await playwright.Chromium.LaunchAsync();  // For Chrome testing
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For Safari testing
// All downloaded but only Chromium needed for PDF generation
Option Strict On



' Playwright downloads multiple browsers by default
Await playwright.Chromium.LaunchAsync()  ' For Chrome testing
Await playwright.Firefox.LaunchAsync()   ' For Firefox testing
Await playwright.Webkit.LaunchAsync()    ' For Safari testing
' All downloaded but only Chromium needed for PDF generation
$vbLabelText   $csharpLabel

IronPDF: 제로 설정, 제로 설치

// No installation, no configuration, no lifecycle management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No installation, no configuration, no lifecycle management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' No installation, no configuration, no lifecycle management
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

진정한 플러그 앤 플레이: IronPDF는 모든 테스트 프레임워크 오버헤드를 제거합니다. 브라우저 설치 명령, 헤드리스 구성, 컨텍스트 관리는 필요 없습니다. 그냥 인스턴스화하고 렌더링하면 됩니다. 테스트 도구에서 확장한 것이 아닌 문서 생성을 위해 특별히 구축되었습니다.

PlaywrightvsIronPDF성능 비교

미터법 Playwright IronPDF
주된 목적 E2E 테스트 프레임워크 PDF 문서 생성
설계 철학 PDF 부가 기능이 있는 테스트 도구 목적에 맞게 설계된 PDF 라이브러리
설치 필요 playwright install (400MB+ 다운로드) 없음 - 즉시 설정
구성이 필요함 헤드리스 모드, 브라우저 실행 옵션, 컨텍스트 제로 구성
브라우저 다운로드 400MB+ (Chromium, Firefox, WebKit) 내장 최적화 엔진
설치 복잡성 명령줄 설치 + 실행 구성 플러그 앤 플레이
첫 렌더링 (콜드 스타트) 4.5초 2.8초
후속 렌더링 3.8-4.1초 0.8-1.2초
변환당 메모리 280-420MB 80-120MB
API 복잡성 복잡한 비동기 브라우저/컨텍스트/페이지 수명주기 간단한 동기 일회용 코드
초기화 CreateAsync() + LaunchAsync() + NewPageAsync() new ChromePdfRenderer()
PDF/A 지원 사용 불가 지원
PDF/UA 접근성 사용 불가 지원
디지털 서명 사용 불가 지원
PDF 편집 사용 불가 병합, 분할, 스탬프, 편집
전문가 지원 Community SLA가 포함된 상업용

IronPDF는 PDF 생성에 중점을 두고 구축되었습니다. 테스트 중심적인 Playwright와 달리, IronPDF는 다양한 문서 중심 API 기능을 제공합니다. 하나의 최적화된 Chromium 인스턴스를 기반으로 하여 효율성을 중시하며 동기 및 비동기 작업을 제공합니다. 이는 PDF 기능을 필요로 하는 개발자에게 간단한 정신 모델과 워크플로를 제공합니다.

.NET 10 및 C# 14를 2025년 및 2026년까지 도입할 계획인 팀에게 IronPDF는 브라우저 자동화 오버헤드를 제거하면서 더 나은 성능과 전문 문서 기능을 제공하는 목적에 맞는 PDF 솔루션을 제공합니다.

결론

Playwright는 마이크로소프트의 테스트 프레임워크로, QA 엔지니어가 교차 브라우저 자동화 테스트를 실행하도록 설계되었습니다. PDF 생성을 위해 사용하는 것은 구조적 부조합으로 넓은 테스트 관련 지식이 필요합니다:

  • 수동 브라우저 설치 (playwright install)
  • 프로덕션을 위한 헤드리스 모드 구성
  • 브라우저 실행 옵션 관리
  • 컨텍스트 수명주기 구성
  • 여러 브라우저 다운로드 (400MB+) 단 하나가 필요할 때
  • 테스트 패러다임의 복잡한 async/await 패턴

IronPDF는 개발자를 위한 문서 생성 라이브러리로, PDF 워크플로우를 구축합니다. 진정한 플러그 앤 플레이입니다:

  • 설치 필요 없음—즉시 작동
  • 구성 필요 없음—지능형 기본값
  • 브라우저 다운로드 없음—최적화된 엔진 포함
  • 간단한 API—학습이 필요한 테스트 개념 없음
  • 자동 자원 관리—복잡한 수명 주기 없음

브라우저 간 웹 애플리케이션을 테스트해야 한다면 Playwright를 사용하십시오. PDF 문서를 생성해야 한다면 IronPDF를 사용하십시오. 문서 생성을 위해 테스트 프레임워크를 사용하지 말고, 그 작업을 위해 특별히 만들어진 도구를 사용하십시오.


시작하기 전에

필수 조건

  1. .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
  3. IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요

NuGet 패키지 변경 사항

# Remove Playwright
dotnet remove package Microsoft.Playwright

# Remove browser binaries (reclaim ~400MB disk space)
# Delete the .playwright folder in your project or user directory

# Add IronPDF
dotnet add package IronPdf
# Remove Playwright
dotnet remove package Microsoft.Playwright

# Remove browser binaries (reclaim ~400MB disk space)
# Delete the .playwright folder in your project or user directory

# Add IronPDF
dotnet add package IronPdf
SHELL

IronPDF와 함께 playwright install 필요 없음 - 렌더링 엔진이 자동으로 번들 제공됩니다.

라이선스 구성

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

완전한 API 참조

네임스페이스 변경

// Before: Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: Playwright
Imports Microsoft.Playwright
Imports System.Threading.Tasks

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

핵심 API 매핑

Playwright API IronPDF API
Playwright.CreateAsync() new ChromePdfRenderer()
playwright.Chromium.LaunchAsync() 필요 없음
browser.NewPageAsync() 필요 없음
page.GotoAsync(url) renderer.RenderUrlAsPdf(url)
page.SetContentAsync(html) + page.PdfAsync() renderer.RenderHtmlAsPdf(html)
page.CloseAsync() 필요 없음
browser.CloseAsync() 필요 없음
PagePdfOptions.Format RenderingOptions.PaperSize
PagePdfOptions.Margin RenderingOptions.MarginTop/Bottom/Left/Right
PagePdfOptions.DisplayHeaderFooter TextFooter
PagePdfOptions.HeaderTemplate RenderingOptions.HtmlHeader
PagePdfOptions.FooterTemplate RenderingOptions.HtmlFooter
<span class='pageNumber'> {page}

코드 마이그레이션 예제

예제 1: HTML 문자열을 PDF로 변환

이전 (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        await page.SetContentAsync(html);
        await page.PdfAsync(new PagePdfOptions { Path = "output.pdf" });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        await page.SetContentAsync(html);
        await page.PdfAsync(new PagePdfOptions { Path = "output.pdf" });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Dim html As String = "<h1>Hello World</h1><p>This is a test PDF.</p>"
        Await page.SetContentAsync(html)
        Await page.PdfAsync(New PagePdfOptions With {.Path = "output.pdf"})

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main(ByVal args As String())
        Dim renderer = New ChromePdfRenderer()

        Dim html As String = "<h1>Hello World</h1><p>This is a test PDF.</p>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

이 예제는 근본적인 아키텍처 차이를 보여줍니다. Playwright에는 다섯 개의 비동기 작업이 필요합니다: Playwright.CreateAsync(), Chromium.LaunchAsync(), NewPageAsync(), SetContentAsync(), 및 PdfAsync(), 추가로 CloseAsync()을 사용한 명시적인 브라우저 정리.

IronPDF는 이러한 모든 복잡성을 제거합니다: ChromePdfRenderer을 생성하고, RenderHtmlAsPdf()을 호출하고, SaveAs()을 합니다. 비동기 패턴이 없고, 브라우저 라이프사이클이 없고, 정리 코드가 없습니다. IronPDF의 접근법은 현대 .NET 애플리케이션과의 더 나은 통합과 더 나은 문법을 제공합니다. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.

예제 2: URL에서 PDF로 변환

이전 (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        await page.GotoAsync("https://www.example.com");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "webpage.pdf",
            Format = "A4"
        });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        await page.GotoAsync("https://www.example.com");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "webpage.pdf",
            Format = "A4"
        });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Await page.GotoAsync("https://www.example.com")
        Await page.PdfAsync(New PagePdfOptions With {
            .Path = "webpage.pdf",
            .Format = "A4"
        })

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main(ByVal args As String())
        Dim renderer = New ChromePdfRenderer()

        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Playwright는 URL로 이동하기 위해 GotoAsync()을 사용한 후 PdfAsync()을 사용합니다. IronPDF는 한 번의 호출로 탐색과 PDF 생성을 처리하는 단일 RenderUrlAsPdf() 메서드를 제공합니다. Playwright는 PagePdfOptions에서 Format를 지정해야 하지만, IronPDF는 용지 크기 구성을 위해 RenderingOptions.PaperSize를 사용합니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.

예제 3: 여백이 있는 사용자 정의 페이지 크기

이전 (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "custom.pdf",
            Format = "Letter",
            Margin = new Margin { Top = "1in", Bottom = "1in", Left = "0.5in", Right = "0.5in" }
        });
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "custom.pdf",
            Format = "Letter",
            Margin = new Margin { Top = "1in", Bottom = "1in", Left = "0.5in", Right = "0.5in" }
        });
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using playwright = Await Playwright.CreateAsync()
            Await Using browser = Await playwright.Chromium.LaunchAsync()
                Dim page = Await browser.NewPageAsync()
                Await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>")
                Await page.PdfAsync(New PagePdfOptions With {
                    .Path = "custom.pdf",
                    .Format = "Letter",
                    .Margin = New Margin With {
                        .Top = "1in",
                        .Bottom = "1in",
                        .Left = "0.5in",
                        .Right = "0.5in"
                    }
                })
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 12;
        renderer.RenderingOptions.MarginRight = 12;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 12;
        renderer.RenderingOptions.MarginRight = 12;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
        renderer.RenderingOptions.MarginTop = 25
        renderer.RenderingOptions.MarginBottom = 25
        renderer.RenderingOptions.MarginLeft = 12
        renderer.RenderingOptions.MarginRight = 12
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>")
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Playwright는 문자열 기반의 여백 값을 사용하며 ("1in", "0.5in") IronPDF는 숫자 밀리미터 값을 사용합니다. 변환은: 1 인치 = 25.4mm, 그래서 "1in"25이 되고 "0.5in"은 대략 12이 됩니다. Playwright의 Format = "Letter"는 IronPDF의 PaperSize = PdfPaperSize.Letter와 매핑됩니다.

예제 4: 헤더, 푸터, 사용자 정의 설정

이전 (Playwright):

// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        await page.SetContentAsync(html);

        await page.PdfAsync(new PagePdfOptions
        {
            Path = "custom.pdf",
            Format = "A4",
            Margin = new Margin { Top = "1cm", Bottom = "1cm", Left = "1cm", Right = "1cm" },
            DisplayHeaderFooter = true,
            HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        await page.SetContentAsync(html);

        await page.PdfAsync(new PagePdfOptions
        {
            Path = "custom.pdf",
            Format = "A4",
            Margin = new Margin { Top = "1cm", Bottom = "1cm", Left = "1cm", Right = "1cm" },
            DisplayHeaderFooter = true,
            HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Dim html As String = "<h1>Custom PDF</h1><p>With margins and headers.</p>"
        Await page.SetContentAsync(html)

        Await page.PdfAsync(New PagePdfOptions With {
            .Path = "custom.pdf",
            .Format = "A4",
            .Margin = New Margin With {.Top = "1cm", .Bottom = "1cm", .Left = "1cm", .Right = "1cm"},
            .DisplayHeaderFooter = True,
            .HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            .FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        })

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

이후 (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.TextHeader.CenterText = "Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}";

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.TextHeader.CenterText = "Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}";

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main(args As String())
        Dim renderer = New ChromePdfRenderer()

        renderer.RenderingOptions.MarginTop = 10
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.MarginLeft = 10
        renderer.RenderingOptions.MarginRight = 10
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.TextHeader.CenterText = "Header"
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}"

        Dim html As String = "<h1>Custom PDF</h1><p>With margins and headers.</p>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

이 예제는 헤더/푸터 플레이스홀더 구문 차이를 보여줍니다. Playwright는 HTML 클래스 기반의 플레이스홀더 (<span class='pageNumber'></span>)를 사용하고, IronPDF는 중괄호 플레이스홀더 ({page})를 사용합니다. Playwright는 헤더 및 푸터를 활성화하기 위해 DisplayHeaderFooter = true이 필요하지만, IronPDF는 헤더/푸터 콘텐츠를 설정할 때 자동으로 이를 활성화합니다.


중요한 마이그레이션 노트

비동기에서 동기 변환

Playwright는 전체적으로 async/await이 필요합니다; IronPDF는 동기 작업을 지원합니다:

// Playwright: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfAsync();
}

// IronPDF: Sync is simpler
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Playwright: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfAsync();
}

// IronPDF: Sync is simpler
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
Imports System.Threading.Tasks
Imports Microsoft.Playwright

Public Class PdfGenerator
    ' Playwright: Async required
    Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
        Using playwright = Await Playwright.CreateAsync()
            Await Using browser = Await playwright.Chromium.LaunchAsync()
                Dim page = Await browser.NewPageAsync()
                Await page.SetContentAsync(html)
                Return Await page.PdfAsync()
            End Using
        End Using
    End Function

    ' IronPDF: Sync is simpler
    Public Function GeneratePdf(html As String) As Byte()
        Dim renderer = New ChromePdfRenderer()
        Return renderer.RenderHtmlAsPdf(html).BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

마진 단위 변환

Playwright는 문자열 단위를 사용합니다; IronPDF는 숫자 밀리미터를 사용합니다:

Playwright IronPDF(mm)
"1in" 25
"0.5in" 12
"1cm" 10

헤더/푸터 플레이스홀더 변환

Playwright클래스 IronPDF 플레이스홀더
<span class='pageNumber'> {page}
<span class='totalPages'> {total-pages}
<span class='date'> {date}
<span class='title'> {html-title}

브라우저 라이프사이클 제거

모든 브라우저 관리 코드를 제거합니다:

// Playwright: Explicit cleanup required
await page.CloseAsync();
await browser.CloseAsync();
playwright.Dispose();

// IronPDF: No disposal needed - just use the renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Playwright: Explicit cleanup required
await page.CloseAsync();
await browser.CloseAsync();
playwright.Dispose();

// IronPDF: No disposal needed - just use the renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' Playwright: Explicit cleanup required
Await page.CloseAsync()
Await browser.CloseAsync()
playwright.Dispose()

' IronPDF: No disposal needed - just use the renderer
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

이동 후 새로운 기능

IronPDF로 마이그레이션한 후, Playwright가 제공할 수 없는 기능을 갖게 됩니다:

PDF 병합

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = renderer.RenderHtmlAsPdf(html1)
Dim pdf2 = renderer.RenderHtmlAsPdf(html2)
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
$vbLabelText   $csharpLabel

워터마크

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

비밀번호 보호

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "readonly"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
$vbLabelText   $csharpLabel

디지털 서명

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
$vbLabelText   $csharpLabel

PDF/A 규정 준수

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
$vbLabelText   $csharpLabel

마이그레이션 체크리스트

사전 마이그레이션

  • 모든PlaywrightPDF 생성 코드를 식별합니다
  • 여백 값을 문서화합니다 (인치/센티미터를 밀리미터로 변환)
  • 변환을 위한 헤더/푸터 플레이스홀더 구문을 기록합니다
  • ironpdf.com에서IronPDF라이선스 키 획득

패키지 변경 사항

  • Microsoft.Playwright NuGet 패키지 제거
  • 약 400MB 디스크 공간 확보를 위해 .playwright 폴더 삭제
  • IronPdf NuGet Install-Package: dotnet add package IronPdf

코드 변경 사항

  • 네임스페이스 가져오기 업데이트
  • 비동기 브라우저 라이프사이클을 ChromePdfRenderer로 대체
  • page.SetContentAsync() + page.PdfAsync()RenderHtmlAsPdf()로 변환
  • page.GotoAsync() + page.PdfAsync()RenderUrlAsPdf()로 변환
  • 여백 문자열을 밀리미터 값으로 변환합니다
  • 헤더/푸터 플레이스홀더 구문을 변환합니다
  • 모든 브라우저/페이지 폐기 코드를 제거합니다
  • 애플리케이션 시작 시 라이선스 초기화 추가

마이그레이션 이후

  • PDF 출력의 시각적 비교
  • 페이지 번호로 헤더/푸터 렌더링을 확인합니다
  • 여백 및 페이지 크기 정확성을 테스트합니다
  • 필요에 따라 새 기능(보안, 워터마크, 병합) 추가

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

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

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

아이언 서포트 팀

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