Chrome에서 HTML을 디버깅하여 픽셀 단위까지 완벽한 PDF를 만드는 방법
iText에서 IronPDF로 마이그레이션하면 .NET PDF 워크플로를 코드 내에서 Paragraph, Table, Cell 객체를 작성하는 프로그래밍 API에서 CSS3 및 JavaScript 지원이 포함된 HTML 우선 접근 방식으로 이동합니다. 이 지침은 AGPL 노출과 별도의 pdfHTML 추가 기능의 필요성을 제거하는 점진적 마이그레이션 경로를 제공합니다.
iText에서 IronPDF로의 이주 이유
AGPL 라이선스 고려 사항
iText (iText Group / Apryse Group NV 소유)는 상업 팀이 사전에 고려해야 할 라이선스 특성을 포함하고 있습니다:
-
AGPL 바이럴 라이선스: 웹 응용 프로그램에서 iText를 오픈 소스 라이선스로 사용하는 경우, AGPL은 일반적으로 네트워크를 통해 상호 작용하는 모든 사람에게 응용 프로그램의 소스를 공개해야 한다고 해석됩니다. 폐쇄형 상용 소프트웨어의 경우 보통 상업용 라이선스를 구매해야 함을 의미합니다.
-
구독 전용 상용 라이선싱: iText의 상용 라이선스는 PDF 처리량을 기준으로 연간 구독으로 판매됩니다; 영구 옵션은 공공 가격 페이지에 광고되지 않으며 (사용자 정의 OEM 조건은 견적 전용입니다).
-
pdfHTML 추가 비용: HTML을 PDF로 변환하려면 별도로 판매되는
itext.pdfhtml추가 기능(현재 6.3.2)이 필요하며, 이는 핵심itext패키지(현재 9.6.0) 위에 판매됩니다. -
복잡한 라이선스 감사: Enterprise 배포는 라이선스 복잡성과 감사 위험에 직면해 있습니다.
-
프로그램 우선 API: 코어 iText는 코드 내에서
Paragraph,Table,Cell객체를 구성하여 PDF를 생성합니다. pdfHTML은 HTML에서 시작할 수 있게 합니다. - 정의된 CSS 서브셋, 렌더링 시 JS 없음: pdfHTML은 CSS의 정의된 서브셋을 지원하며 HTML을 PDF로 변환하는 동안 JavaScript를 실행하지 않습니다 (PDF 수준의 JS 양식 작업은 별도의 지원 기능입니다).
iText vsIronPDF비교
| 기능 | iText 9 / iTextSharp 5.x | IronPDF |
|---|---|---|
| 라이선스 | AGPL (바이럴) 또는 상업용 연간 구독 | 상업적, 영구적 옵션 |
| HTML-to-PDF | 별도의 itext.pdfhtml 추가 기능 (6.3.2) |
내장 Chromium 렌더러 |
| CSS 지원 | pdfHTML의 정의된 CSS 서브셋 | 완전한 CSS3, Flexbox, Grid |
| 렌더링 시 JavaScript | pdfHTML은 HTML→PDF 변환 중 JS를 실행하지 않습니다 | 렌더링 시 전체 JS 실행 |
| API 패러다임 | 프로그래매틱 (단락, 표, 셀) | HTML 우선, CSS 포함 |
| 학습 곡선 | 가파름 (PDF 좌표계) | 웹 개발자 친화적 |
| 오픈 소스 위험 | AGPL 하에 웹 앱을 오픈 소스로 공개해야 함 | 바이러스성 요구 사항 없음 |
| 가격 모델 | 연간 구독 (볼륨 기반) 또는 사용자 정의 OEM | 영구적 또는 구독 |
현대적인 .NET을 표준화하는 팀에게는 IronPDF의 HTML 우선 접근 방식이 팀이 이미 보유한 웹 개발 기술에 의존합니다.
마이그레이션 복잡성 평가
기능별 예상 노력
| 기능 | 마이그레이션 복잡성 |
|---|---|
| HTML to PDF | 매우 낮음 |
| PDF 병합 | 낮음 |
| 텍스트 및 이미지 | 낮음 |
| 표 | 중간 |
| 헤더/푸터 | 중간 |
| 보안/암호화 | 낮음 |
패러다임 전환
이 iText 마이그레이션의 근본적인 변화는 프로그래매틱 PDF 구성에서 HTML 우선 렌더링으로 입니다:
iText: PdfWriter → PdfDocument → Document → Add(Paragraph) → Add(Table)
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(htmlString) → SaveAs()
이 패러다임의 전환은 해방적입니다: iText의 객체 모델을 배우는 대신, 웹 개발자가 이미 보유한 HTML 및 CSS 기술을 사용합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# Remove iText packages (current naming is 'itext'; 'itext7' is the deprecated alias)
dotnet remove package itext
dotnet remove package itext.pdfhtml
dotnet remove package itext7
dotnet remove package itext7.pdfhtml
dotnet remove package itextsharp
# Install IronPDF
dotnet add package IronPdf
# Remove iText packages (current naming is 'itext'; 'itext7' is the deprecated alias)
dotnet remove package itext
dotnet remove package itext.pdfhtml
dotnet remove package itext7
dotnet remove package itext7.pdfhtml
dotnet remove package itextsharp
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
iText 사용 식별
# Find all iText references
grep -r "using iText\|using iTextSharp" --include="*.cs" .
grep -r "PdfWriter\|PdfDocument\|Document\|Paragraph\|Table\|Cell" --include="*.cs" .
grep -r "HtmlConverter\|ConverterProperties" --include="*.cs" .
# Find all iText references
grep -r "using iText\|using iTextSharp" --include="*.cs" .
grep -r "PdfWriter\|PdfDocument\|Document\|Paragraph\|Table\|Cell" --include="*.cs" .
grep -r "HtmlConverter\|ConverterProperties" --include="*.cs" .
완전한 API 참조
클래스 매핑
| iText 7+ 클래스 | iTextSharp 5.x 클래스 | IronPDF 동등 |
|---|---|---|
PdfWriter |
PdfWriter |
ChromePdfRenderer |
PdfDocument |
Document |
PdfDocument |
Document |
Document |
ChromePdfRenderer.RenderHtmlAsPdf() |
Paragraph |
Paragraph |
HTML <p>, <h1>, 등 |
Table |
PdfPTable |
HTML <table> |
Cell |
PdfPCell |
HTML <td>, <th> |
Image |
Image |
HTML <img> |
PdfReader |
PdfReader |
PdfDocument.FromFile() |
PdfMerger |
해당 없음 | PdfDocument.Merge() |
네임스페이스 매핑
| iText 네임스페이스 | IronPDF 동등 |
|---|---|
iText.Kernel.Pdf |
IronPdf |
iText.Layout |
IronPdf |
iText.Layout.Element |
HTML 요소 사용 |
iText.Html2pdf |
IronPdf (내장형) |
iText.IO.Image |
HTML <img> 사용 |
iText.Kernel.Utils |
IronPdf |
코드 마이그레이션 예제
예제 1: HTML에서 PDF로 변환
이전 (iText):
// NuGet: Install-Package itext7
using iText.Html2pdf;
using System.IO;
class Program
{
static void Main()
{
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
string outputPath = "output.pdf";
using (FileStream fs = new FileStream(outputPath, FileMode.Create))
{
HtmlConverter.ConvertToPdf(html, fs);
}
}
}
// NuGet: Install-Package itext7
using iText.Html2pdf;
using System.IO;
class Program
{
static void Main()
{
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
string outputPath = "output.pdf";
using (FileStream fs = new FileStream(outputPath, FileMode.Create))
{
HtmlConverter.ConvertToPdf(html, fs);
}
}
}
Imports iText.Html2pdf
Imports System.IO
Class Program
Shared Sub Main()
Dim html As String = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
Dim outputPath As String = "output.pdf"
Using fs As FileStream = New FileStream(outputPath, FileMode.Create)
HtmlConverter.ConvertToPdf(html, fs)
End Using
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
iText 접근 방식은 별도의 itext.pdfhtml 패키지(pdfHTML 추가 기능, 현재 6.3.2, itext 9.6.0 위에 별도 판매), FileStream 생성, 적절한 처리를 위해 모든 항목을 using 구문으로 감싸는 것을 요구합니다. HtmlConverter.ConvertToPdf() 메소드는 스트림에 직접 기록합니다.
IronPDF 접근 방식이 더 깔끔합니다: ChromePdfRenderer 생성, HTML 문자열로 RenderHtmlAsPdf() 호출, 결과 PdfDocument에 SaveAs() 호출. 별도의 패키지나 스트림 관리가 필요 없으며, Chromium 렌더링 엔진은 우수한 CSS3 및 JavaScript 지원을 제공합니다. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.
예제 2: 여러 PDF 병합
이전 (iText):
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Kernel.Utils;
using System.IO;
class Program
{
static void Main()
{
string outputPath = "merged.pdf";
string[] inputFiles = { "document1.pdf", "document2.pdf", "document3.pdf" };
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdfDoc = new PdfDocument(writer))
{
PdfMerger merger = new PdfMerger(pdfDoc);
foreach (string file in inputFiles)
{
using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(file)))
{
merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages());
}
}
}
}
}
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Kernel.Utils;
using System.IO;
class Program
{
static void Main()
{
string outputPath = "merged.pdf";
string[] inputFiles = { "document1.pdf", "document2.pdf", "document3.pdf" };
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdfDoc = new PdfDocument(writer))
{
PdfMerger merger = new PdfMerger(pdfDoc);
foreach (string file in inputFiles)
{
using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(file)))
{
merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages());
}
}
}
}
}
Imports iText.Kernel.Pdf
Imports iText.Kernel.Utils
Imports System.IO
Class Program
Shared Sub Main()
Dim outputPath As String = "merged.pdf"
Dim inputFiles As String() = {"document1.pdf", "document2.pdf", "document3.pdf"}
Using writer As New PdfWriter(outputPath)
Using pdfDoc As New PdfDocument(writer)
Dim merger As New PdfMerger(pdfDoc)
For Each file As String In inputFiles
Using sourcePdf As New PdfDocument(New PdfReader(file))
merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages())
End Using
Next
End Using
End Using
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdfDocuments = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf"),
PdfDocument.FromFile("document3.pdf")
};
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdfDocuments = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf"),
PdfDocument.FromFile("document3.pdf")
};
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdfDocuments As New List(Of PdfDocument) From {
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf"),
PdfDocument.FromFile("document3.pdf")
}
Dim merged = PdfDocument.Merge(pdfDocuments)
merged.SaveAs("merged.pdf")
End Sub
End Class
iText 병합 작업은 상당한 보일러플레이트가 필요합니다: 출력용 PdfWriter 생성, 이것을 PdfDocument에 감싸고 PdfMerger 생성, 소스 파일을 통해 각 PdfDocument와 PdfReader에 중첩된 using 구문으로 반복. merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages())로 페이지 범위도 지정해야 합니다.
IronPDF는 이를 세 단계로 줄입니다: PdfDocument.FromFile()로 문서 로드, 리스트로 정적 PdfDocument.Merge() 메소드 호출, 저장. 전체 병합 작업이 읽기 쉽고 유지 관리 가능합니다. PDF 병합 및 분할에 대해 더 알아보세요.
예제 3: 텍스트 및 이미지를 포함한 PDF 생성
이전 (iText):
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.IO.Image;
class Program
{
static void Main()
{
string outputPath = "document.pdf";
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdf = new PdfDocument(writer))
using (Document document = new Document(pdf))
{
document.Add(new Paragraph("Sample PDF Document"));
document.Add(new Paragraph("This document contains text and an image."));
Image img = new Image(ImageDataFactory.Create("image.jpg"));
img.SetWidth(200);
document.Add(img);
}
}
}
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.IO.Image;
class Program
{
static void Main()
{
string outputPath = "document.pdf";
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdf = new PdfDocument(writer))
using (Document document = new Document(pdf))
{
document.Add(new Paragraph("Sample PDF Document"));
document.Add(new Paragraph("This document contains text and an image."));
Image img = new Image(ImageDataFactory.Create("image.jpg"));
img.SetWidth(200);
document.Add(img);
}
}
}
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.IO.Image
Class Program
Shared Sub Main()
Dim outputPath As String = "document.pdf"
Using writer As New PdfWriter(outputPath),
pdf As New PdfDocument(writer),
document As New Document(pdf)
document.Add(New Paragraph("Sample PDF Document"))
document.Add(New Paragraph("This document contains text and an image."))
Dim img As New Image(ImageDataFactory.Create("image.jpg"))
img.SetWidth(200)
document.Add(img)
End Using
End Sub
End Class
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = @"
<h1>Sample PDF Document</h1>
<p>This document contains text and an image.</p>
<img src='image.jpg' width='200' />";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = @"
<h1>Sample PDF Document</h1>
<p>This document contains text and an image.</p>
<img src='image.jpg' width='200' />";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "
<h1>Sample PDF Document</h1>
<p>This document contains text and an image.</p>
<img src='image.jpg' width='200' />"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("document.pdf")
End Sub
End Class
이 예제는 패러다임 변화를 가장 명확하게 보여줍니다. iText는 다음이 필요합니다:
- 삼중 중첩
using구문 (PdfWriter,PdfDocument,Document) new Paragraph()로 각 텍스트 요소에 대해Paragraph객체 생성- 이미지를 로드하기 위해
ImageDataFactory.Create()사용 Image객체 생성 및SetWidth()를 별도로 호출- 각 요소에 대해
document.Add()호출
IronPDF는 표준 HTML을 사용합니다: 제목에 대해 <h1>, 문단에 대해 <p>, width 속성이 있는 이미지에 대해 <img>. 웹 개발자는 즉시 기존 기술을 활용할 수 있으며, 디자이너는 이미 알고 있는 CSS로 문서를 디자인할 수 있습니다.
중요한 마이그레이션 노트
패러다임 전환: 프로그래밍 방식에서 HTML 우선으로
이 iText 마이그레이션에서 가장 큰 변화는 개념적입니다. iText는 프로그래밍 방식으로 PDF를 빌드합니다:
// iText approach
document.Add(new Paragraph("Title")
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(24)
.SetBold());
var table = new Table(UnitValue.CreatePercentArray(3)).UseAllAvailableWidth();
table.AddHeaderCell(new Cell().Add(new Paragraph("ID")));
table.AddHeaderCell(new Cell().Add(new Paragraph("Name")));
// ... many more lines
// iText approach
document.Add(new Paragraph("Title")
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(24)
.SetBold());
var table = new Table(UnitValue.CreatePercentArray(3)).UseAllAvailableWidth();
table.AddHeaderCell(new Cell().Add(new Paragraph("ID")));
table.AddHeaderCell(new Cell().Add(new Paragraph("Name")));
// ... many more lines
' iText approach
document.Add(New Paragraph("Title") _
.SetTextAlignment(TextAlignment.CENTER) _
.SetFontSize(24) _
.SetBold())
Dim table = New Table(UnitValue.CreatePercentArray(3)).UseAllAvailableWidth()
table.AddHeaderCell(New Cell().Add(New Paragraph("ID")))
table.AddHeaderCell(New Cell().Add(New Paragraph("Name")))
' ... many more lines
IronPDF는 HTML과 CSS를 사용합니다:
//IronPDF approach
string html = @"
<style>
h1 { text-align: center; font-size: 24px; font-weight: bold; }
table { width: 100%; border-collapse: collapse; }
th { background-color: #4CAF50; color: white; padding: 8px; }
</style>
<h1>Title</h1>
<table>
<tr><th>ID</th><th>Name</th></tr>
</table>";
var pdf = renderer.RenderHtmlAsPdf(html);
//IronPDF approach
string html = @"
<style>
h1 { text-align: center; font-size: 24px; font-weight: bold; }
table { width: 100%; border-collapse: collapse; }
th { background-color: #4CAF50; color: white; padding: 8px; }
</style>
<h1>Title</h1>
<table>
<tr><th>ID</th><th>Name</th></tr>
</table>";
var pdf = renderer.RenderHtmlAsPdf(html);
Imports IronPdf
Dim html As String = "
<style>
h1 { text-align: center; font-size: 24px; font-weight: bold; }
table { width: 100%; border-collapse: collapse; }
th { background-color: #4CAF50; color: white; padding: 8px; }
</style>
<h1>Title</h1>
<table>
<tr><th>ID</th><th>Name</th></tr>
</table>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
AGPL 노출 제거됨
iText의 AGPL 약관에 따라 iText를 사용하는 웹 응용 프로그램은 일반적으로 네트워크를 통해 상호 작용하는 모든 사람에게 소스를 공개해야 함이 예상됩니다; 상업적 라이센스가 대안 경로입니다. IronPDF의 상용 라이선스는 독점 소프트웨어에 바이럴 라이선스 요구 사항 없이 배포할 수 있게 합니다.
pdfHTML 추가 기능이 필요하지 않음
iText는 HTML을 PDF로 변환하기 위해 별도의 itext.pdfhtml 추가 기능(현재 6.3.2)이 필요하며, 이는 핵심 itext 패키지 위에 판매됩니다. IronPDF는 기본 패키지에 Chromium 기반 HTML 렌더링을 포함합니다.
메서드 교체 패턴
| iText 패턴 | IronPDF 교체 |
|---|---|
SetTextAlignment(TextAlignment.CENTER) |
CSS text-align: center |
SetFontSize(24) |
CSS font-size: 24px |
SetBold() |
CSS font-weight: bold |
new Table(3) |
HTML <table> |
AddHeaderCell(new Cell().Add(new Paragraph())) |
HTML <th> |
AddCell(new Cell().Add(new Paragraph())) |
HTML <td> |
문제 해결
문제 1: PdfWriter/문서 패턴
문제: 코드가 PdfWriter → PdfDocument → Document 중첩 패턴을 사용합니다.
해결책: ChromePdfRenderer 로 교체:
// Delete this iText pattern:
// using (var writer = new PdfWriter(outputPath))
// using (var pdfDoc = new PdfDocument(writer))
// using (var document = new Document(pdfDoc))
// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
// Delete this iText pattern:
// using (var writer = new PdfWriter(outputPath))
// using (var pdfDoc = new PdfDocument(writer))
// using (var document = new Document(pdfDoc))
// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(outputPath)
문제 2: HtmlConverter를 찾을 수 없음
문제: 코드가 별도로 구매한 itext.pdfhtml 추가 기능에 iText.Html2pdf.HtmlConverter 사용.
해결책: IronPDF의 내장 HTML 렌더링을 사용하세요:
// iText (requires pdfHTML add-on)
HtmlConverter.ConvertToPdf(html, fileStream);
//IronPDF(built-in)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
// iText (requires pdfHTML add-on)
HtmlConverter.ConvertToPdf(html, fileStream);
//IronPDF(built-in)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);
' iText (requires pdfHTML add-on)
HtmlConverter.ConvertToPdf(html, fileStream)
' IronPDF(built-in)
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(outputPath)
문제 3: PdfMerger 복잡성
문제: iText의 PdfMerger은 중첩된 리더와 페이지 범위 지정을 필요로 합니다.
해결책: IronPDF의 정적 병합 메서드를 사용하세요:
// iText merger pattern (delete this)
// using (PdfDocument pdfDoc = new PdfDocument(writer))
// {
// PdfMerger merger = new PdfMerger(pdfDoc);
// foreach (string file in inputFiles)
// {
// using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(file)))
// {
// merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages());
// }
// }
// }
//IronPDF(simple)
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");
// iText merger pattern (delete this)
// using (PdfDocument pdfDoc = new PdfDocument(writer))
// {
// PdfMerger merger = new PdfMerger(pdfDoc);
// foreach (string file in inputFiles)
// {
// using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(file)))
// {
// merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages());
// }
// }
// }
//IronPDF(simple)
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");
Imports System.Collections.Generic
' iText merger pattern (delete this)
' Using pdfDoc As New PdfDocument(writer)
' Dim merger As New PdfMerger(pdfDoc)
' For Each file As String In inputFiles
' Using sourcePdf As New PdfDocument(New PdfReader(file))
' merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages())
' End Using
' Next
' End Using
' IronPDF(simple)
Dim merged = PdfDocument.Merge(pdfDocuments)
merged.SaveAs("merged.pdf")
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에서 모든 iText API 호출을 인벤토리화
- 프로그래젝트 PDF 생성 패턴 식별 (문단, 테이블, 셀)
- HtmlConverter 사용 문서화 (pdfHTML 애드온)
- AGPL 준수 위험 평가 -IronPDF라이센스 키를 받으세요
코드 마이그레이션
- iText NuGet 패키지 제거:
dotnet remove package itext(및 더 이상 사용되지 않는itext7별칭,itext.pdfhtml/iTextSharp포함된 경우) -IronPDF NuGet Install-Package:dotnet add package IronPdf - 네임스페이스 임포트 업데이트 (
using iText.*→using IronPdf) Document패턴을ChromePdfRenderer로 교체Cell을 HTML 요소로 변환HtmlConverter.ConvertToPdf()을RenderHtmlAsPdf()로 교체- 병합 작업을
PdfDocument.Merge()로 업데이트 - 시작 시 라이선스 키 초기화 추가
테스트
- 모든 PDF 생성 경로 테스트
- 시각적 출력이 기대와 일치하는지 확인
- 복잡한 HTML/CSS 콘텐츠로 테스트
- 성능 벤치마크
마이그레이션 이후
- iText 라이선스 파일 및 참조 제거
- 문서 업데이트
- iText 구독 취소 (해당되는 경우)
- 레거시 iText 코드 아카이브

