Spire.PDF에서 IronPDF로의 마이그레이션 방법 (C#)
Spire.PDF에서 IronPDF로의 마이그레이션은 이미지 기반 텍스트를 자주 생성하는 레거시 HTML 경로에서 실질적이고 선택 가능하며 검색 가능한 텍스트를 생성하는 Chromium 파이프라인으로 귀하의 PDF 생성을 이동시킵니다. 이 가이드는 Spire.PDF의 HTML 렌더링 트레이드오프와 보고된 폰트 임베딩 문제를 모두 다루는 완전한 단계별 마이그레이션 경로를 제공합니다.
왜 Spire.PDF에서 IronPDF로 마이그레이션해야 하는가
Spire.PDF 이해하기
Spire.PDF는 .NET 개발자가 PDF 문서를 효율적으로 처리할 수 있도록 설계된 강력한 상용 PDF 라이브러리입니다. Spire.PDF는 특히 레거시 응용 프로그램에서의 특정 기능과 E-iceblue 도구 세트의 다른 구성 요소와의 통합 능력으로 프로그래밍 커뮤니티에서 자리매김을 했습니다.
그러나 Spire.PDF는 실제 사용에 영향을 미치는 몇 가지 기본적인 문제를 가지고 있으며, 특히 HTML-to-PDF 변환과 최신 웹 표준 지원에 문제가 있습니다.
중요 기술 이슈
| 문제 | 영향 | IronPDF 솔루션 |
|---|---|---|
| 레거시 HTML 경로에서 자주 이미지로 렌더링되는 텍스트 | PDF 검색 불가능, 접근 불가, 텍스트 복사 불가 | 실제 텍스트 렌더링 |
| 레이시 경로에 대한 IE/Edge Legacy 또는 QtWebKit 의존성 | 구식 렌더링, 최신 CSS 문제 | 번들로 제공되는 최신 Chromium |
| 보고된 폰트 임베딩 문제 | 다른 시스템에서 문서가 잘못 표시됨 | 신뢰할 수 있는 글꼴 처리 |
| 큰 배포 발자국 | 더 높은 메모리 사용 | 번들로 제공되는 Chromium 런타임 |
| 레거시 경로의 제한된 CSS | 최신 레이아웃이 올바르게 렌더링되지 않음 | 전체 CSS3 지원 |
핵심 문제: 이미지 기반 PDF
Spire.PDF의 레거시 HTML 경로의 알려진 단점 중 하나는 HTML 문서 내에서 텍스트를 이미지로 렌더링하는 경향이 있다는 점입니다. 이는 텍스트가 선택되거나 검색되지 않는 PDF를 생성합니다. 검색 또는 텍스트 상호작용이 필요한 애플리케이션의 제한 사항입니다.
스파이어.PDF의 LoadFromHTML() 메서드를 레거시 엔진에서 사용할 때, 종종 텍스트를 실제 텍스트가 아닌 비트맵 이미지로 렌더링하여 이러한 문제를 발생시킵니다:
- 텍스트를 선택할 수 없습니다
- 텍스트를 검색할 수 없습니다
- 텍스트를 복사할 수 없습니다
- 스크린 리더가 읽지 못함 (접근성 위반)
- 파일 크기가 훨씬 더 큽니다
- 확대 시 픽셀화 발생
Spire.PDF 대IronPDF비교
| 기능 | Spire.PDF | IronPDF |
|---|---|---|
| HTML to PDF 렌더링 | 기본적으로 레거시 IE/QtWebKit; v10.7.21 버전부터 시스템 Chrome이 필요로 하는 ChromeHtmlConverter 옵트인 |
번들로 제공된 Chromium (최신, 추가 설치 불필요) |
| 텍스트 출력 (HTML 경로) | 레거시 경로에서 종종 이미지로 렌더링됨 | 실제 텍스트 (선택 및 검색 가능) |
| 폰트 처리 | 레거시 경로에서 보고된 문제 | 신뢰할 수 있는 글꼴 처리 |
| CSS3 지원 | 레거시 경로에서 제한됨 | 전체 |
| 플렉스박스/그리드 | 레거시 경로에서 지원되지 않음 | 지원됨 |
| JavaScript | 레거시 경로에서 제한됨 | 전체 ES6+ |
| PDF 접근성 | 레거시 경로에서 나쁨 (이미지 기반 출력) | 태그 텍스트 출력 |
| API 설계 | 많은 오버로드, 수동 페이지 설정 | 싱글 플루언트 렌더러 |
| 라이선스 | 프리미엄/상용 | 상업적 |
현대 .NET에서 IronPDF는 Spire.PDF의 HTML-to-PDF 트레이드오프를 처리하여 텍스트를 실제 선택 가능한 텍스트로 렌더링하여 생성된 PDF가 검색 가능하고 접근 가능하게 합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF # If using free version
# Install IronPDF
dotnet add package IronPdf
# Remove Spire.PDF
dotnet remove package Spire.PDF
dotnet remove package FreeSpire.PDF # If using free version
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
// 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: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;
// After: IronPDF
using IronPdf;
using IronPdf.Editing;
// Before: Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.HtmlConverter;
// After: IronPDF
using IronPdf;
using IronPdf.Editing;
Imports IronPdf
Imports IronPdf.Editing
핵심 API 매핑
| Spire.PDF | IronPDF |
|---|---|
new PdfDocument() |
new ChromePdfRenderer() |
pdf.LoadFromHTML() |
renderer.RenderHtmlAsPdf() |
pdf.LoadFromFile() |
PdfDocument.FromFile() |
pdf.SaveToFile() |
pdf.SaveAs() |
pdf.Close() |
필요 없음 |
pdf.Pages.Add() |
renderer.RenderHtmlAsPdf() |
pdf.InsertPageRange() |
PdfDocument.Merge() |
page.Canvas.DrawString() |
TextStamper + ApplyStamp() |
PdfFont |
HTML에서의 CSS 스타일링 |
PdfBrush |
HTML에서의 CSS 스타일링 |
코드 마이그레이션 예제
예제 1: HTML에서 PDF로 변환
이전(Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
pdf.LoadFromHTML(htmlString, false, true, true);
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfHtmlLayoutFormat htmlLayoutFormat = new PdfHtmlLayoutFormat();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
pdf.LoadFromHTML(htmlString, false, true, true);
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim htmlLayoutFormat As New PdfHtmlLayoutFormat()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
pdf.LoadFromHTML(htmlString, False, True, True)
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlString = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlString As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
pdf.SaveAs("output.pdf")
End Sub
End Class
이 예시는 HTML 렌더링의 근본적인 차이를 보여줍니다. Spire.PDF는 LoadFromHTML()을(를) PdfHtmlLayoutFormat 객체와 함께 사용하며, 이는 종종 텍스트를 비트맵 이미지로 렌더링합니다. 그 결과 사용자가 텍스트를 선택하거나 복사하거나 검색할 수 없는 PDF가 생성됩니다.
IronPDF는 RenderHtmlAsPdf()와 함께 ChromePdfRenderer을 사용하여 완전히 선택 가능하고 검색 가능하며 접근 가능한 진짜 텍스트를 생성합니다. Close() 호출이 필요하지 않습니다—IronPDF는 자동 정리를 위한 dispose 패턴을 사용합니다. 종합적인 예시는 HTML to PDF 문서를 참조하세요.
예시 2: 여러 PDF 병합
이전(Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("document1.pdf");
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("document2.pdf");
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);
pdf1.SaveToFile("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument pdf1 = new PdfDocument();
pdf1.LoadFromFile("document1.pdf");
PdfDocument pdf2 = new PdfDocument();
pdf2.LoadFromFile("document2.pdf");
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1);
pdf1.SaveToFile("merged.pdf");
pdf1.Close();
pdf2.Close();
}
}
Imports Spire.Pdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 As New PdfDocument()
pdf1.LoadFromFile("document1.pdf")
Dim pdf2 As New PdfDocument()
pdf2.LoadFromFile("document2.pdf")
pdf1.InsertPageRange(pdf2, 0, pdf2.Pages.Count - 1)
pdf1.SaveToFile("merged.pdf")
pdf1.Close()
pdf2.Close()
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
Spire.PDF는 각 문서를 new PdfDocument() + LoadFromFile()으로 수동으로 로드한 후, 삽입할 페이지를 지정하기 위해 InsertPageRange()을 사용하고, 각 문서에 대해 Close()을 호출해야 합니다.
IronPDF는 PdfDocument.Merge() 메서드와 같은 정적 PdfDocument.FromFile() 패턴을 사용하여 여러 문서를 수용합니다. Close() 호출이 필요하지 않습니다. 더 많은 정보를 보려면 튜토리얼을 참조하세요.
예제 3: PDF에 텍스트 추가하기
이전(Spire.PDF):
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.Pages.Add();
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfBrush brush = new PdfSolidBrush(Color.Black);
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
// NuGet: Install-Package Spire.PDF
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using System;
class Program
{
static void Main()
{
PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.Pages.Add();
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfBrush brush = new PdfSolidBrush(Color.Black);
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, new PointF(50, 50));
pdf.SaveToFile("output.pdf");
pdf.Close();
}
}
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
Imports System
Class Program
Shared Sub Main()
Dim pdf As New PdfDocument()
Dim page As PdfPageBase = pdf.Pages.Add()
Dim font As New PdfFont(PdfFontFamily.Helvetica, 20)
Dim brush As PdfBrush = New PdfSolidBrush(Color.Black)
page.Canvas.DrawString("Hello from Spire.PDF!", font, brush, New PointF(50, 50))
pdf.SaveToFile("output.pdf")
pdf.Close()
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalOffset = 50,
HorizontalOffset = 50
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalOffset = 50,
HorizontalOffset = 50
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
Dim textStamper = New TextStamper() With {
.Text = "Hello from IronPDF!",
.FontSize = 20,
.VerticalOffset = 50,
.HorizontalOffset = 50
}
pdf.ApplyStamp(textStamper)
pdf.SaveAs("output.pdf")
End Sub
End Class
Spire.PDF는 특정 좌표에 텍스트를 배치하기 위해 PointF를 사용하는 PdfFont, PdfBrush, page.Canvas.DrawString()를 가진 캔버스 기반 드로잉 모델을 사용합니다.
IronPDF는 TextStamper 개체를 직관적인 속성 Text, FontSize, VerticalOffset, HorizontalOffset와 함께 사용한 후 ApplyStamp()로 적용합니다. 이 접근 방식은 보다 선언적이며 유지 보수가 더 쉽습니다.
텍스트를 이미지로 렌더링 하는 문제
왜 이것이 중요한가
Spire.PDF가 이미지 기반 렌더링으로 HTML을 PDF로 변환할 때 문서는 필수 기능을 잃습니다:
1. 텍스트 검색 없음: 사용자는 Ctrl+F를 사용하여 텍스트를 찾을 수 없습니다. 문서 관리 시스템은 콘텐츠를 인덱싱할 수 없습니다.
2. 텍스트 선택/복사 없음: 인용문, 참조, 데이터를 복사하려는 사용자는 텍스트를 선택할 수 없습니다. 이것은 이미지입니다.
3. 접근성 위반: 이미지 기반 PDF는 WCAG 2.1 준수, 섹션 508 준수(미국 정부), ADA 요구 사항 및 스크린 리더 호환성을 실패합니다.
4. 큰 파일 크기: 레거시 HTML 경로에서 생성된 이미지 기반 출력은 동일한 콘텐츠에 대해 IronPDF가 생성하는 텍스트 기반 출력보다 몇 배 더 큰 파일을 만들 수 있습니다.
감지: 당신의 PDF가 이미지 기반인가?
Spire.PDF로 생성된 문서를 열고 다음 테스트를 시도하십시오:
- 텍스트 선택: 텍스트 위에서 클릭하고 드래그하십시오. 아무것도 강조 표시되지 않으면 → 이미지 기반
- Ctrl+F 검색: 페이지의 단어를 검색하십시오. "일치 항목 없음"이 나오면 → 이미지 기반
- 복사/붙여넣기: 텍스트를 선택하고 메모장에 복사하십시오. 붙여넣기 할 내용이 없으면 → 이미지 기반
레거시 HTML 엔진 문제
Spire.PDF의 렌더링 엔진
Spire.PDF의 LoadFromHTML(...)은 역사를 통해 두 가지 경로를 제공했습니다: Windows Internet Explorer/Edge Legacy WebBrowser 제어로 지원되는 비플러그인 경로와 별도로 다운로드되는 QT/WebKit 플러그인 경로. Spire.PDF 10.7.21(2024년 중반)은 로컬에 설치된 Google Chrome을 사용하는 세 번째 옵션 ChromeHtmlConverter을 추가했지만, 이는 옵트인이며 원본 LoadFromHTML API는 여전히 기본값으로 레거시 엔진을 사용합니다. Microsoft는 IE/Edge Legacy를 2022년에 공식적으로 사용하지 않기로 했으며, 레거시 경로에서 현대 CSS는 신뢰할 수 없고 JavaScript 지원은 부분적이며 렌더링은 시스템 간에 다를 수 있습니다.
Spire.PDF에서 실패하는 최신 CSS
<div style="display: flex; justify-content: space-between; gap: 20px;">
<div style="flex: 1;">Column 1</div>
<div style="flex: 1;">Column 2</div>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
<div style="display: flex; justify-content: space-between; gap: 20px;">
<div style="flex: 1;">Column 1</div>
<div style="flex: 1;">Column 2</div>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
<style>
:root { --primary-color: #007bff; }
h1 { color: var(--primary-color); }
</style>
IronPDF는 최신 Chromium 렌더링을 사용하여 모든 CSS 기능이 올바르게 작동합니다.
이동 후 새로운 기능
IronPDF로 마이그레이션한 후 Spire.PDF가 제공할 수 없는 기능을 얻게 됩니다:
선택 가능하고 검색 가능한 텍스트
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");
// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>");
pdf.SaveAs("contract.pdf");
// Result:
// ✅ Text is fully selectable
// ✅ Text is searchable with Ctrl+F
// ✅ Text can be copied to clipboard
// ✅ Screen readers work perfectly
// ✅ File size is compact
// ✅ Zooming is crystal clear
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Important Contract</h1>")
pdf.SaveAs("contract.pdf")
' Result:
' ✅ Text is fully selectable
' ✅ Text is searchable with Ctrl+F
' ✅ Text can be copied to clipboard
' ✅ Screen readers work perfectly
' ✅ File size is compact
' ✅ Zooming is crystal clear
최신 CSS 지원
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
Dim renderer = New ChromePdfRenderer()
Dim html = "
<style>
:root { --primary: #007bff; }
.container { display: flex; gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
</style>
<div class='container'>
<div style='flex: 1; color: var(--primary)'>Column 1</div>
<div style='flex: 1'>Column 2</div>
</div>
<div class='grid'>
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' All modern CSS features render correctly!
HTML 기반 워터마크
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.ApplyWatermark(@"
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.ApplyWatermark("
<div style='
font-size: 48px;
color: rgba(255, 0, 0, 0.5);
transform: rotate(-45deg);
'>DRAFT</div>")
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스의 모든 Spire.PDF 사용 내역 조사
- 텍스트 선택 가능성에 대한 기존 PDF 테스트 (중요 문제 감지)
- 문서
LoadFromHTML()호출 (이것이 문제를 해결하는 우선순위입니다) - ironpdf.com에서IronPDF라이선스 키 획득
코드 업데이트
Spire.PDFNuGet 패키지를 제거합니다 (무료 버전을 사용하는 경우FreeSpire.PDF포함)IronPdfNuGet 패키지를 설치합니다- 네임스페이스 가져오기를 업데이트합니다 (
using Spire.Pdf;→using IronPdf;) LoadFromHTML()을RenderHtmlAsPdf()로 교체합니다 (중요한 수정)new PdfDocument()+LoadFromFile()을PdfDocument.FromFile()로 교체합니다InsertPageRange()을PdfDocument.Merge()로 교체합니다Canvas.DrawString()을TextStamper+ApplyStamp()으로 교체합니다SaveToFile()을SaveAs()으로 교체합니다- 모든
Close()호출을 제거합니다 (IronPDF에서는 필요하지 않습니다) - 애플리케이션 시작 시 라이선스 초기화 추가
테스트
- 생성된 PDF에서 텍스트가 선택 가능한지 확인 (중요한 테스트)
- CSS 렌더링 개선 사항 확인 (Flexbox/Grid가 이제 작동합니다)
- 파일 크기가 작은지 확인
- 화면 읽기 프로그램으로 접근성 테스트
- 성능 비교

