C#에서 WebView2에서 IronPDF로 마이그레이션하는 방법
Microsoft의 내장형 Edge/Chromium 브라우저 제어인 WebView2는 개발자에게 Windows 응용 프로그램 내에서 웹 콘텐츠를 표시하는 방법을 제공합니다. 그러나 개발 팀이 WebView2를 사용하여 PDF를 생성하려고 할 때, 이는 프로덕션 환경에 적합하지 않은 심각한 아키텍처적 제한 사항을 만납니다. WebView2는 UI 응용 프로그램용으로 설계된 브라우저 내장 제어이며, PDF 생성 라이브러리가 아닙니다.
이 가이드는 WebView2에서 IronPDF로의 완전한 이동 경로를 제공합니다. 신뢰할 수 있는 PDF 생성을 필요로 하는 전문 .NET 개발자를 위한 단계별 지침, 코드 비교 및 실용적인 예제를 포함합니다.
중요 경고: WebView2는 PDF 생성에 적합하지 않음
이동 경로를 살펴보기 전에, 개발 팀은 WebView2가 PDF 생성에 사용될 때 주로 발생하는 문제를 이해해야 합니다:
| 문제 | 영향 | 심각도 |
|---|---|---|
| 메모리 누수 | WebView2에는 장기 프로세스에서 잘 문서화된 메모리 누수가 있습니다. 서버가 충돌할 것입니다. | 심각 |
| Windows 전용 | Linux, macOS, Docker 또는 클라우드 환경에 대한 지원 없음 | 심각 |
| UI 스레드 필요 | STA 스레드에서 메시지 펌프와 함께 실행해야 합니다. 웹 서버나 API에서 작동할 수 없습니다. | 심각 |
| PDF용으로 설계되지 않음 | PrintToPdfAsync은 핵심 기능이 아닌 부차적인 것입니다. |
높은 |
| 서비스에서 불안정함 | Windows 서비스와 백그라운드 작업자에서 흔한 충돌 및 중단 | 높은 |
| 복잡한 비동기 흐름 | 탐색 이벤트, 완료 콜백, 경쟁 조건 | 높은 |
| Edge 런타임 종속성 | 대상 장치에 EdgeWebView2런타임 설치 필요 | 중간 |
| 헤드리스 모드 없음 | 숨겨져 있어도 항상 UI 요소를 생성함 | 중간 |
| 성능 | 느린 시작, 높은 자원 소비 | 중간 |
| 전문 지원 없음 | Microsoft는 PDF 생성 사용 사례를 지원하지 않습니다 | 중간 |
실제 실패 시나리오
이러한 코드 패턴은 생산 실패를 유발합니다:
// DANGER: This code WILL cause problems in production
//문제1: Memory leak - creates newWebView2for each PDF
public async Task<byte[]> GeneratePdf(string html) // Called 1000x/day = server crash
{
using var webView = new WebView2(); // Memory not fully released!
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.NavigateToString(html);
// ... memory accumulates until OOM
}
//문제2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
//문제3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
protected override async Task ExecuteAsync(CancellationToken token)
{
//WebView2+ no message pump = hangs, crashes, undefined behavior
}
}
// DANGER: This code WILL cause problems in production
//문제1: Memory leak - creates newWebView2for each PDF
public async Task<byte[]> GeneratePdf(string html) // Called 1000x/day = server crash
{
using var webView = new WebView2(); // Memory not fully released!
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.NavigateToString(html);
// ... memory accumulates until OOM
}
//문제2: UI thread requirement - crashes in ASP.NET
public IActionResult GenerateReport() // FAILS - no STA thread
{
var webView = new WebView2(); // InvalidOperationException
}
//문제3: Windows Service instability
public class PdfService : BackgroundService // Random crashes
{
protected override async Task ExecuteAsync(CancellationToken token)
{
//WebView2+ no message pump = hangs, crashes, undefined behavior
}
}
IronPDFvs WebView2: 기능 비교
구조적 차이를 이해하면 기술 결정을 내리는데 이주 투자를 평가하는데 도움이 됩니다:
| 측면 | WebView2 | IronPDF |
|---|---|---|
| 목적 | 브라우저 제어(UI) | PDF 라이브러리(PDF용으로 설계됨) |
| 생산 준비 완료 | 아니오 | 예 |
| 메모리 관리 | 장기간 실행 중인 누수 | 안정적이고, 적절히 처리됨 |
| 플랫폼 지원 | Windows 전용 | Windows, Linux, macOS, Docker |
| 스레드 요구 사항 | STA + 메시지 펌프 | 모든 스레드 |
| 서버/클라우드 | 지원되지 않음 | 지원됨 |
| Azure/AWS/GCP | 문제 발생 | 완벽하게 작동 |
| Docker | 불가능 | 공식 이미지 사용 가능 |
| ASP.NET Core | 작동하지 않음 | 일급 지원 |
| 백그라운드 서비스 | 불안정 | 안정적 |
| 지원되는 컨텍스트 | WinForms/WPF 전용 | 모든 .NET 컨텍스트: 콘솔, 웹, 데스크톱 |
| HTML to PDF | 기초적인 | 전체 |
| URL을 PDF로 | 기초적인 | 전체 |
| 헤더/푸터 | 아니오 | 예 (HTML) |
| 워터마크 | 아니오 | 예 |
| PDF 병합 | 아니오 | 예 |
| PDF 분할 | 아니오 | 예 |
| 디지털 서명 | 아니오 | 예 |
| 비밀번호 보호 | 아니오 | 예 |
| PDF/A 준수 | 아니오 | 예 |
| 전문가 지원 | PDF에 대해서는 없음 | 예 |
| 문서화 | 제한적 | 광범위함 |
빠른 시작: WebView2에서 IronPDF로 마이그레이션
이러한 기본 단계를 통해 즉시 이주를 시작할 수 있습니다.
1단계:WebView2패키지 제거
dotnet remove package Microsoft.Web.WebView2
dotnet remove package Microsoft.Web.WebView2
또는 프로젝트 파일에서 제거하세요:
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
<PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove />
2단계:IronPDF설치
dotnet add package IronPdf
dotnet add package IronPdf
3단계: 네임스페이스 업데이트
WebView2 네임스페이스를 IronPdf 네임스페이스로 바꾸세요:
// Before (WebView2)
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
// After (IronPDF)
using IronPdf;
// Before (WebView2)
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
// After (IronPDF)
using IronPdf;
Imports Microsoft.Web.WebView2.Core
Imports Microsoft.Web.WebView2.WinForms
' After (IronPDF)
Imports IronPdf
4단계: 라이센스 초기화
애플리케이션 시작 시 라이선스 초기화를 추가합니다:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
코드 마이그레이션 예제
HTML을 PDF로 변환
.NET PDF 접근방식 간의 복잡도 차이를 가장 근본적인 작업으로 드러냅니다.
WebView2 접근방식:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>");
await Task.Delay(2000);
await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{}"
);
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>");
await Task.Delay(2000);
await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{}"
);
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.WinForms
Imports Microsoft.Web.WebView2.Core
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>")
Await Task.Delay(2000)
Await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{}"
)
End Function
End Module
IronPDF 접근법:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>")
pdf.SaveAs("output.pdf")
End Sub
End Class
WebView2 버전은 EnsureCoreWebView2Async()으로 비동기 초기화를 요구하고, NavigateToString()을 통한 내비게이션, 렌더링 대기를 위한 신뢰할 수 없는 Task.Delay(2000), 그리고 DevTools Protocol과의 상호 작용을 필요로 합니다. IronPDF는 이러한 값을 완전히 제거합니다—렌더러 생성, HTML 렌더링, 저장.
고급 HTML에서 PDF로의 시나리오는 HTML to PDF 변환 가이드를 참조하십시오.
URL을 PDF로 변환
URL-to-PDF 변환은 WebView2의 복잡한 비동기 탐색 흐름을 보여줍니다.
WebView2 접근방식:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
var tcs = new TaskCompletionSource<bool>();
webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true);
webView.CoreWebView2.Navigate("https://example.com");
await tcs.Task;
await Task.Delay(1000);
var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{\"printBackground\": true}"
);
var base64 = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString();
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64));
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
var tcs = new TaskCompletionSource<bool>();
webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true);
webView.CoreWebView2.Navigate("https://example.com");
await tcs.Task;
await Task.Delay(1000);
var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{\"printBackground\": true}"
);
var base64 = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString();
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64));
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.WinForms
Imports Microsoft.Web.WebView2.Core
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
Dim tcs As New TaskCompletionSource(Of Boolean)()
AddHandler webView.CoreWebView2.NavigationCompleted, Sub(s, e) tcs.SetResult(True)
webView.CoreWebView2.Navigate("https://example.com")
Await tcs.Task
Await Task.Delay(1000)
Dim result As String = Await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
"{""printBackground"": true}"
)
Dim base64 As String = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString()
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64))
End Function
End Module
IronPDF 접근법:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("output.pdf")
End Sub
End Class
WebView2는 TaskCompletionSource을 생성하고, NavigationCompleted 이벤트를 구독하며, CallDevToolsProtocolMethodAsync을 호출하고, JSON 응답을 파싱하고, base64 데이터를 디코딩해야 합니다. IronPDF는 모든 복잡성을 내부적으로 처리하는 전용 RenderUrlAsPdf 메서드를 제공합니다.
URL to PDF 문서에서 인증 및 사용자 정의 헤더 옵션을 탐색하십시오.
HTML 파일에서 사용자 정의 PDF 설정
페이지 방향, 여백 및 용지 크기 설정은 다른 접근 방식을 필요로 합니다.
WebView2 접근방식:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html");
webView.CoreWebView2.Navigate(htmlFile);
await Task.Delay(3000);
var printSettings = webView.CoreWebView2.Environment.CreatePrintSettings();
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape;
printSettings.MarginTop = 0.5;
printSettings.MarginBottom = 0.5;
using (var stream = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings))
{
Console.WriteLine("Custom PDF created");
}
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html");
webView.CoreWebView2.Navigate(htmlFile);
await Task.Delay(3000);
var printSettings = webView.CoreWebView2.Environment.CreatePrintSettings();
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape;
printSettings.MarginTop = 0.5;
printSettings.MarginBottom = 0.5;
using (var stream = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings))
{
Console.WriteLine("Custom PDF created");
}
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.Core
Imports Microsoft.Web.WebView2.WinForms
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
Dim htmlFile As String = Path.Combine(Directory.GetCurrentDirectory(), "input.html")
webView.CoreWebView2.Navigate(htmlFile)
Await Task.Delay(3000)
Dim printSettings = webView.CoreWebView2.Environment.CreatePrintSettings()
printSettings.Orientation = CoreWebView2PrintOrientation.Landscape
printSettings.MarginTop = 0.5
printSettings.MarginBottom = 0.5
Using stream = Await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings)
Console.WriteLine("Custom PDF created")
End Using
End Function
End Module
IronPDF 접근법:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html");
var pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
pdf.SaveAs("custom.pdf");
Console.WriteLine("Custom PDF created");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html");
var pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
pdf.SaveAs("custom.pdf");
Console.WriteLine("Custom PDF created");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Imports System.IO
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50
Dim htmlFile As String = Path.Combine(Directory.GetCurrentDirectory(), "input.html")
Dim pdf = renderer.RenderHtmlFileAsPdf(htmlFile)
pdf.SaveAs("custom.pdf")
Console.WriteLine("Custom PDF created")
End Sub
End Module
WebView2는 3초의 Task.Delay (신뢰할 수 없는 추측)을 요구하며, 환경을 통해 인쇄 설정을 만들고 스트림과 함께 PrintToPdfAsync을 사용하는 것을 필요로 합니다. IronPDF는 명확한 이름의 직접 RenderingOptions 속성을 제공하며, 더 정밀한 측정을 위해 밀리미터를 사용합니다.
DevTools Protocol을 사용한 고급 PDF 옵션
복잡한WebView2구성은 DevTools Protocol 상호작용이 필요합니다.
WebView2 접근방식:
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using System.Text.Json;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
var htmlPath = Path.GetFullPath("document.html");
var tcs = new TaskCompletionSource<bool>();
webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true);
webView.CoreWebView2.Navigate($"file:///{htmlPath}");
await tcs.Task;
await Task.Delay(1000);
var options = new
{
landscape = false,
printBackground = true,
paperWidth = 8.5,
paperHeight = 11,
marginTop = 0.4,
marginBottom = 0.4,
marginLeft = 0.4,
marginRight = 0.4
};
var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
JsonSerializer.Serialize(options)
);
var base64 = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString();
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64));
}
}
// NuGet: Install-Package Microsoft.Web.WebView2.WinForms
using System;
using System.IO;
using System.Threading.Tasks;
using System.Text.Json;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;
class Program
{
static async Task Main()
{
var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
var htmlPath = Path.GetFullPath("document.html");
var tcs = new TaskCompletionSource<bool>();
webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true);
webView.CoreWebView2.Navigate($"file:///{htmlPath}");
await tcs.Task;
await Task.Delay(1000);
var options = new
{
landscape = false,
printBackground = true,
paperWidth = 8.5,
paperHeight = 11,
marginTop = 0.4,
marginBottom = 0.4,
marginLeft = 0.4,
marginRight = 0.4
};
var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
JsonSerializer.Serialize(options)
);
var base64 = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString();
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64));
}
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports System.Text.Json
Imports Microsoft.Web.WebView2.WinForms
Imports Microsoft.Web.WebView2.Core
Module Program
Async Function Main() As Task
Dim webView As New WebView2()
Await webView.EnsureCoreWebView2Async()
Dim htmlPath As String = Path.GetFullPath("document.html")
Dim tcs As New TaskCompletionSource(Of Boolean)()
AddHandler webView.CoreWebView2.NavigationCompleted, Sub(s, e) tcs.SetResult(True)
webView.CoreWebView2.Navigate($"file:///{htmlPath}")
Await tcs.Task
Await Task.Delay(1000)
Dim options = New With {
.landscape = False,
.printBackground = True,
.paperWidth = 8.5,
.paperHeight = 11,
.marginTop = 0.4,
.marginBottom = 0.4,
.marginLeft = 0.4,
.marginRight = 0.4
}
Dim result As String = Await webView.CoreWebView2.CallDevToolsProtocolMethodAsync(
"Page.printToPDF",
JsonSerializer.Serialize(options)
)
Dim base64 As String = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString()
File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64))
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 = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.MarginLeft = 40;
renderer.RenderingOptions.MarginRight = 40;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
var pdf = renderer.RenderHtmlFileAsPdf("document.html");
pdf.SaveAs("output.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 = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.MarginLeft = 40;
renderer.RenderingOptions.MarginRight = 40;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
var pdf = renderer.RenderHtmlFileAsPdf("document.html");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
renderer.RenderingOptions.MarginTop = 40
renderer.RenderingOptions.MarginBottom = 40
renderer.RenderingOptions.MarginLeft = 40
renderer.RenderingOptions.MarginRight = 40
renderer.RenderingOptions.PrintHtmlBackgrounds = True
Dim pdf = renderer.RenderHtmlFileAsPdf("document.html")
pdf.SaveAs("output.pdf")
End Sub
End Class
WebView2는 익명 객체를 생성하고, JSON으로 직렬화하고, DevTools Protocol 메서드를 호출하고, JSON 응답을 파싱하고, base64를 수동으로 디코딩해야 합니다. IronPDF는 명확한 이름과 PdfPaperSize.Letter과 같은 열거형 값을 가진 유형화된 속성을 제공합니다.
WebView2API에서IronPDF매핑 참조
이 매핑은 직접적인 API 대응을 보여주어 마이그레이션을 가속화합니다:
| WebView2 API | IronPDF 동등 |
|---|---|
new WebView2() |
new ChromePdfRenderer() |
EnsureCoreWebView2Async() |
해당 없음 |
NavigateToString(html) + PrintToPdfAsync() |
RenderHtmlAsPdf(html) |
Navigate(url) + PrintToPdfAsync() |
RenderUrlAsPdf(url) |
PrintSettings.PageWidth |
RenderingOptions.PaperSize |
PrintSettings.PageHeight |
RenderingOptions.PaperSize |
PrintSettings.MarginTop |
RenderingOptions.MarginTop |
PrintSettings.Orientation |
RenderingOptions.PaperOrientation |
ExecuteScriptAsync() |
HTML의 JavaScript |
AddScriptToExecuteOnDocumentCreatedAsync() |
HTML <script> 태그 |
| 탐색 이벤트 | WaitFor.JavaScript() |
CallDevToolsProtocolMethodAsync("Page.printToPDF") |
RenderHtmlAsPdf() |
일반적인 마이그레이션 문제와 해결책
문제 1: 메모리 누수
WebView2 문제:WebView2인스턴스를 폐기할 때 메모리가 완전히 해제되지 않습니다. 장기간 실행되는 프로세스는 메모리를 축적하여 충돌을 일으킵니다.
IronPDF 솔루션: 누수 없는 적절한 가비지 수집:
//IronPDF- clean memory management
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
} // Properly disposed
//IronPDF- clean memory management
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
} // Properly disposed
Imports IronPdf
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Using
문제 2: 웹 앱의 UI 스레드 없음
WebView2 문제: 메시지 펌프와 함께 STA 스레드가 필요합니다. ASP.NET Core 컨트롤러는WebView2인스턴스를 생성할 수 없습니다.
IronPDF 솔루션: 모든 스레드에서 작동합니다:
// ASP.NET Core - just works
public async Task<IActionResult> GetPdf()
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
// ASP.NET Core - just works
public async Task<IActionResult> GetPdf()
{
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Class YourController
Inherits Controller
Public Async Function GetPdf() As Task(Of IActionResult)
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
End Function
End Class
문제 3: 탐색 이벤트의 복잡성
WebView2 문제: TaskCompletionSource와 함께 비동기 내비게이션 이벤트, 완료 콜백, 경합 조건을 처리해야 합니다.
IronPDF 솔루션: 동기 또는 비동기 단일 메서드 호출:
// Simple and predictable
var pdf = renderer.RenderHtmlAsPdf(html);
// or
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
// Simple and predictable
var pdf = renderer.RenderHtmlAsPdf(html);
// or
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
문제 4: 측정 단위
WebView2는 차원에 인치를 사용합니다 (편지 용지는 8.5 x 11). IronPDF는 보다 정확한 측정을 위해 밀리미터를 사용합니다.
변환 접근 방식:
// WebView2: PageWidth = 8.27 (inches for A4)
// IronPDF: Use enum
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// Or custom size in mm
renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(210, 297);
// WebView2: PageWidth = 8.27 (inches for A4)
// IronPDF: Use enum
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// Or custom size in mm
renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(210, 297);
' WebView2: PageWidth = 8.27 (inches for A4)
' IronPDF: Use enum
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
' Or custom size in mm
renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(210, 297)
WebView2마이그레이션 체크리스트
이동 전 작업
코드베이스에서 모든WebView2PDF 생성 코드를 문서화하세요. WebView2가 문제를 일으키는 위치를 식별하세요 (메모리 누수, 충돌, 배포 문제). IronPDF 문서를 검토하여 기능을 익히세요.
코드 업데이트 작업
- Microsoft.Web.WebView2 NuGet 패키지 제거
- IronPdf NuGet 패키지를 설치하세요
- PDF 생성에만 사용되는 WinForms/WPF 의존성 제거
4.WebView2코드를
ChromePdfRenderer로 교체하십시오 - STA 스레드 요구사항 제거
- 내비게이션 이벤트 핸들러와
TaskCompletionSource패턴을 제거하십시오 Task.Delay해결책을 제거하십시오- 시작 시IronPDF라이선스 초기화를 추가하세요
마이그레이션 후 테스트
마이그레이션 후 다음 측면을 검증:
- 대상 환경에서 테스트 (ASP.NET, Docker, Linux 해당 시)
- PDF 출력 품질이 기대치와 일치하는지 확인하세요
- JavaScript가 많이 포함된 페이지가 올바르게 렌더링되는지 테스트
- IronPDF의 HTML 기능을 사용하여 헤더와 푸터가 제대로 작동하는지 확인
- 메모리 안정성을 위한 부하 테스트 수행
- 메모리 누적 없이 장시간 시나리오 테스트
배포 업데이트
- 해당 경우 Docker 이미지 업데이트 (EdgeWebView2런타임 제거)
- 서버 요구 사항에서 EdgeWebView2런타임 의존성 제거
- 서버 요구 사항 문서 업데이트
- 대상 플랫폼에서의 교차 플랫폼 배포가 작동하는지 확인
IronPDF로 마이그레이션할 때의 주요 이점
IronPDF으로 이동하면 여러 중요한 이점을 제공합니다:
교차 플랫폼 지원: WebView2의 Windows 전용 한계와 달리, IronPDF는 Windows, Linux, macOS, Docker에서 작동합니다. 이 유연성 덕분에 Azure, AWS, GCP 및 모든 클라우드 환경에 플랫폼 제약 없이 배포할 수 있습니다.
UI 의존성 없음: IronPDF는 STA 스레드, 메시지 펌프 또는 WinForms/WPF 컨텍스트를 필요로 하지 않습니다. 콘솔 응용 프로그램, 웹 API, Windows 서비스, 백그라운드 작업에서 작동합니다.
메모리 안정성: 적절한 가비지 컬렉션이 장기 실행 프로세스에서 WebView2에 발생하는 메모리 누수를 제거합니다. 운영 서버가 안정적으로 유지됩니다.
단순한 API: 복잡한 네비게이션 이벤트, 완료 콜백, DevTools 프로토콜 상호작용, base64 디코딩 대신 단일 메서드 호출로 대체됩니다.
확장된 PDF 기능: 헤더, 푸터, 워터마크, 병합/분할, 디지털 서명, 비밀번호 보호, PDF/A 준수 — WebView2가 제공할 수 없는 기능들입니다.
활발한 개발: .NET 10 및 C# 14의 채택이 2026년까지 증가함에 따라 IronPDF의 정기 업데이트는 현재 및 미래의 .NET 버전과의 호환성을 보장합니다.

