using IronPdf;
// Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = true;
// Instantiate Renderer
var renderer = new ChromePdfRenderer();
// Create a PDF from a HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
// Export to a file or Stream
pdf.SaveAs("output.pdf");
// Advanced Example with HTML Assets
// Load external html assets: Images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.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 우선 렌더링으로 입니다:
// 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
$vbLabelText $csharpLabel
이후 (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
$vbLabelText $csharpLabel
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
$vbLabelText $csharpLabel
이후 (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
$vbLabelText $csharpLabel
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
$vbLabelText $csharpLabel
이후 (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
$vbLabelText $csharpLabel
이 예제는 패러다임 변화를 가장 명확하게 보여줍니다. iText는 다음이 필요합니다:
삼중 중첩 using 구문 (PdfWriter, PdfDocument, Document)
new Paragraph()로 각 텍스트 요소에 대해 Paragraph 객체 생성
이미지를 로드하기 위해 ImageDataFactory.Create() 사용
Image 객체 생성 및 SetWidth()를 별도로 호출
각 요소에 대해 document.Add() 호출
IronPDF는 표준 HTML을 사용합니다: 제목에 대해 , 문단에 대해 , width 속성이 있는 이미지에 대해 . 웹 개발자는 즉시 기존 기술을 활용할 수 있으며, 디자이너는 이미 알고 있는 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
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)
$vbLabelText $csharpLabel
AGPL 노출 제거됨
iText의 AGPL 약관에 따라 iText를 사용하는 웹 응용 프로그램은 일반적으로 네트워크를 통해 상호 작용하는 모든 사람에게 소스를 공개해야 함이 예상됩니다; 상업적 라이센스가 대안 경로입니다. IronPDF의 상용 라이선스는 독점 소프트웨어에 바이럴 라이선스 요구 사항 없이 배포할 수 있게 합니다.
pdfHTML 추가 기능이 필요하지 않음
iText는 HTML을 PDF로 변환하기 위해 별도의 itext.pdfhtml 추가 기능(현재 6.3.2)이 필요하며, 이는 핵심 itext 패키지 위에 판매됩니다. IronPDF는 기본 패키지에 Chromium 기반 HTML 렌더링을 포함합니다.
// 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)
$vbLabelText $csharpLabel
문제 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)
$vbLabelText $csharpLabel
문제 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")
$vbLabelText $csharpLabel
마이그레이션 체크리스트
사전 마이그레이션
코드베이스에서 모든 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 코드 아카이브
참고해 주세요iText는 해당 소유자의 등록 상표입니다. 이 사이트는 iText Group과 관련이 없으며, 승인되거나 후원되지 않았습니다. 모든 제품 이름, 로고, 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.
커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.
커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.