Playwright에서 IronPDF로의 마이그레이션 방법 (C#)
MicrosoftPlaywrightfor .NET에서 IronPDF로 마이그레이션하면 브라우저 자동화 테스트 프레임워크에서 목적별 PDF 라이브러리로 PDF 생성 워크플로를 전환합니다. 이 가이드는 비동기 브라우저 라이프사이클 관리를 제거하고 별도의 playwright install 브라우저 이진 파일 다운로드 단계를 제거하는 단계별 마이그레이션 경로를 제공합니다.
왜 Playwright에서 IronPDF로 마이그레이션해야 하는가
Playwright.NET용 이해하기
Playwright for .NET (NuGet Microsoft.Playwright, MIT 라이선스)는 주로 Chromium, Firefox, WebKit에서의 엔드 투 엔드 테스트를 위해 설계된 마이크로소프트의 브라우저 자동화 프레임워크입니다. 일반적인 워크로드는 대화형입니다: 버튼 클릭, 양식 채우기, 네트워크 요청 가로채기, 스크린샷 찍기, 크로스 브라우저 호환성 검증.
Playwright에서의 PDF 생성은 Page.PdfAsync()를 통해 노출되는 부가 기능이며, 오로지 Chromium에서만 지원됩니다 — Firefox 및 WebKit은 PDF 출력을 구현하지 않습니다. 출력은 브라우저의 인쇄(PDF로 인쇄) 경로(CTRL+P와 동등)를 사용하며, 이는 레이아웃, 배경 및 페이지 매김에 영향을 미칩니다:
- 테스트 중심 아키텍처로, 헤드리스 문서 제작을 위해 최적화되지 않음
- 브라우저 이진 파일 (Chromium 및 선택적으로 Firefox와 WebKit)은
playwright install를 통해 별도로 설치해야 합니다 - 테스트 자동화 워크플로우를 위해 설계된 비동기 API
- 내장된 PDF/A, PDF/UA, 디지털 서명, 워터마크 삽입, 병합 및 보안 기능 없음
Playwright를 PDF 용도로 사용할 때의 고려 사항
Playwright는 끝에서 끝까지의 테스트를 위한 것이며 문서 생성을 위한 것이 아닙니다. PDF 용도로 재사용할 때의 몇 가지 실제적 의미:
-
playwright install를 통한 브라우저 이진 파일. Playwright의 기본 설정은 브라우저 이진 파일 (Chromium, Firefox, WebKit)을 다운로드하며, 이는 엄격한 자원 또는 배포 제약이 있는 환경에서 고려해야 할 사항일 수 있습니다. -
비동기 브라우저/컨텍스트/페이지 모델. 개발자는 브라우저 컨텍스트 및 페이지 라이프사이클 관리를 포함한 처리에 편안해야 합니다.
-
테스트 중심 아키텍처, 대량 문서 생성을 위해 최적화되지 않음.
-
인쇄-PDF 의미는 Ctrl+P 브라우저 인쇄와 동등. 레이아웃이 재흐름하며, 기본적으로 배경이 생략되고 출력이 인쇄용으로 페이지가 나뉩니다.
-
PDF/A 또는 PDF/UA 출력 없음. Playwright는 PDF/A(보관용) 또는 PDF/UA(접근성) 규격 문서를 생성하지 않습니다. Section 508, EU 접근성 지침, 또는 장기 보관 요건에 대해서는 전용 PDF 라이브러리가 일반적으로 필요합니다.
- 각 렌더 별 브라우저 자원 사용량: PDF마다 브라우저 컨텍스트 및 페이지가 사용되므로.
구성 표면
Playwright는 테스트 자동화 지향의 구성 표면을 제공합니다. PDF 생성 용도로 사용할 때 가장 관련성 있는 부분:
브라우저 설치 단계:
# Separate installation step before first use
playwright install # Downloads browser binaries (Chromium, Firefox, WebKit)
# Or for a single browser:
playwright install chromium # Chromium-only (the only engine that supports PDF output)
# Separate installation step before first use
playwright install # Downloads browser binaries (Chromium, Firefox, WebKit)
# Or for a single browser:
playwright install chromium # Chromium-only (the only engine that supports PDF output)
브라우저 시작 구성:
// 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
테스트 전용 구성 옵션:
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
멀티 브라우저 인터페이스:
//Playwrightsupports launching multiple engines
await playwright.Chromium.LaunchAsync(); // For Chromium-based testing (and PDF output)
await playwright.Firefox.LaunchAsync(); // For Firefox testing
await playwright.Webkit.LaunchAsync(); // For WebKit/Safari testing
// Note: Page.PdfAsync() is implemented on Chromium only.
//Playwrightsupports launching multiple engines
await playwright.Chromium.LaunchAsync(); // For Chromium-based testing (and PDF output)
await playwright.Firefox.LaunchAsync(); // For Firefox testing
await playwright.Webkit.LaunchAsync(); // For WebKit/Safari testing
// Note: Page.PdfAsync() is implemented on Chromium only.
IronPDF: 단일 번들 렌더러
// No separate browser-binary install or context management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No separate browser-binary install or context management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
IronPDF는 렌더링 엔진을 NuGet 패키지 내부에 포함하여 별도의 playwright install 단계가 없으며 브라우저/컨텍스트/페이지 라이프사이클을 관리할 필요가 없습니다.
PlaywrightvsIronPDF성능 비교
| 미터법 | Playwright | IronPDF |
|---|---|---|
| 주된 목적 | E2E 브라우저 자동화 프레임워크 | PDF 문서 생성 |
| 설계 철학 | 테스트 우선; PDF는 부가 기능 | 목적에 맞게 설계된 PDF 라이브러리 |
| NuGet 패키지 | Microsoft.Playwright (MIT) |
IronPdf (상업용) |
| 브라우저-바이너리 단계 | 별도의 playwright install 다운로드 |
NuGet 패키지에 번들 포함 |
| PDF 지원 엔진 | Chromium 전용 (Firefox / WebKit은 Page.PdfAsync()을 구현하지 않음) |
단일 번들 Chromium 기반 렌더러 |
| 첫 렌더링 (콜드 스타트) | 4.5초 | 2.8초 |
| 후속 렌더링 | 3.8-4.1초 | 0.8-1.2초 |
| 변환당 메모리 | 280-420MB | 80-120MB |
| API 스타일 | 비동기 브라우저/컨텍스트/페이지 라이프사이클 | 동기 또는 비동기; renderer-based |
| 초기화 | CreateAsync() + LaunchAsync() + NewPageAsync() |
new ChromePdfRenderer() |
| PDF/A 지원 | 사용 불가 | 지원됨 |
| PDF/UA 접근성 | 사용 불가 | 지원됨 |
| 디지털 서명 | 사용 불가 | 지원됨 |
| PDF 편집 | 사용 불가 | 병합, 분할, 스탬프, 편집 |
| 지원 모델 | Community | SLA가 포함된 상업용 |
IronPDF는 문서 중심 API 인터페이스로 PDF 생성을 위해 특별히 제작되었습니다. 단일 번들된 Chromium 기반 렌더링 엔진을 사용하며 동기 및 비동기 작업을 모두 지원하여 브라우저 상호작용이 아닌 PDF 출력이 목표일 때 개발자에게 더 단순한 정신 모델을 제공합니다.
결론
Playwright는 브라우저 자동화 또는 크로스 브라우저 테스트가 주요 작업일 때 잘 맞으며, PDF 출력은 부차적인 작업입니다. IronPDF는 PDF 생성이 주요 작업일 때 더 잘 맞습니다: 별도의 브라우저-바이너리 설치 단계가 없으며, 브라우저/컨텍스트/페이지 수명 주기를 관리할 필요가 없고, PDF/A, 디지털 서명, 보안 및 병합 같은 문서 기능을 기본적으로 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# Remove Playwright
dotnet remove package Microsoft.Playwright
# Remove the downloaded browser binaries
# Delete the .playwright folder in your project (and any cached binaries
# under your user profile, e.g. %USERPROFILE%\.cache\ms-playwright on Windows)
# Add IronPDF
dotnet add package IronPdf
# Remove Playwright
dotnet remove package Microsoft.Playwright
# Remove the downloaded browser binaries
# Delete the .playwright folder in your project (and any cached binaries
# under your user profile, e.g. %USERPROFILE%\.cache\ms-playwright on Windows)
# Add IronPDF
dotnet add package IronPdf
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"
완전한 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
핵심 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
이후 (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
이 예제는 근본적인 아키텍처 차이를 보여줍니다. 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
이후 (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
Playwright는 GotoAsync()을 사용하여 URL로 이동하고 이어서 PdfAsync()합니다. IronPDF는 탐색과 PDF 생성을 한 번의 호출로 처리하는 단일 RenderUrlAsPdf() 메소드를 제공합니다. Playwright는 Format을 PagePdfOptions에 지정해야 하지만, 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
이후 (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
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
이후 (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
이 예제는 헤더/푸터 플레이스홀더 구문 차이를 보여줍니다. 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
마진 단위 변환
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")
이동 후 새로운 기능
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")
워터마크
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
비밀번호 보호
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
디지털 서명
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)
PDF/A 규정 준수
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
마이그레이션 체크리스트
사전 마이그레이션
- 모든PlaywrightPDF 생성 코드를 식별합니다
- 여백 값을 문서화합니다 (인치/센티미터를 밀리미터로 변환)
- 변환을 위한 헤더/푸터 플레이스홀더 구문을 기록합니다
- ironpdf.com에서IronPDF라이선스 키 획득
패키지 변경 사항
Microsoft.PlaywrightNuGet 패키지를 제거하세요.playwright폴더를 삭제하세요 (사용자 프로필 하위의 모든 캐시된Playwright브라우저 이진 파일 포함)IronPdfNuGet 패키지를 설치하세요:dotnet add package IronPdf
코드 변경 사항
- 네임스페이스 가져오기 업데이트
- 비동기 브라우저 라이프사이클을
ChromePdfRenderer으로 대체하세요 page.SetContentAsync()+page.PdfAsync()을/를RenderHtmlAsPdf()으로 변환하세요page.GotoAsync()+page.PdfAsync()을/를RenderUrlAsPdf()으로 변환하세요- 여백 문자열을 밀리미터 값으로 변환합니다
- 헤더/푸터 플레이스홀더 구문을 변환합니다
- 모든 브라우저/페이지 폐기 코드를 제거합니다
- 애플리케이션 시작 시 라이선스 초기화 추가
마이그레이션 이후
- PDF 출력의 시각적 비교
- 페이지 번호로 헤더/푸터 렌더링을 확인합니다
- 여백 및 페이지 크기 정확성을 테스트합니다
- 필요에 따라 새 기능(보안, 워터마크, 병합) 추가

