如何在 C# 中從 iText 轉移到 IronPDF
從 iText 轉移到 IronPDF:完整的 C# 遷移指南。
從 iText 轉換到IronPDF可將您的 .NET PDF 工作流程從需要手動建構 Paragraph, Table, 和Cell物件的程式化 API 轉換為完全支援 CSS3 和JavaScript的現代化 HTML-first 方法。 本指南提供了一個全面的、循序漸進的轉換路徑,消除了 AGPL許可證的疑慮,也不需要為 Professional .NET 開發人員另外安裝 pdfHTML 附加元件。
為什麼要從 iText 轉移到 IronPDF?
AGPL 授權陷阱
iText 為商業應用程式帶來嚴重的法律與商業風險,許多開發團隊發現時已為時已晚:
1.AGPL 原始碼授權條款:如果您在 Web 應用程式中使用 iText,AGPL 會要求您開放整個應用程式的原始碼,不只是 PDF 程式碼,而是整個程式碼庫。 這對於大多數的商業軟體來說是不可能的。
2.No Perpetual License:iText 已取消永久授權,避免每年續訂而增加總擁有成本。
3.pdfHTML 附加元件費用:HTML 至 PDF 功能需要 pdfHTML 附加元件,此附加元件需在基本授權之外以額外費用單獨銷售。
4.複雜的授權稽核:企業部署面臨複雜的授權和稽核風險,可能會延誤專案並產生法律風險。
5.Programmatic-Only API:iText 需要使用 Paragraph、Table、Cell 物件進行手動低階 PDF 建構 - 對於複雜的佈局而言,既費事又容易出錯。
6.有限的現代網路渲染:即使使用 pdfHTML,複雜的 CSS 和JavaScript內容也需要大量的額外工作。
iText 與IronPDF的比較
| 特點 | iText 7 / iTextSharp | IronPDF |
|---|---|---|
| 許可證 | AGPL(病毒式)或昂貴的訂閱 | 商業、永久選項 |
| HTML 至 PDF | 獨立的 pdfHTML 附加元件 | 內建 Chromium 渲染器 |
| CSS 支援 | 基本 CSS | 完整的 CSS3、Flexbox、網格 |
| JavaScript | 無 | 完全執行 |
| API 範例 | 程式化(段落、表格、單元格) | HTML-first與CSS |
| 學習曲線 | 陡峭 (PDF 坐標系統) | 對網路開發人員友善 |
| 開放原始碼風險 | 必須開源網路應用程式 | 無病毒要求 |
| 定價模式 | 僅訂閱 | 永久或訂閱 |
對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個面向未來的基礎,其 HTML 為先的方法可充分利用團隊已有的網路開發技能。
遷移複雜性評估
按功能估計的工作量
| 特點 | 遷移複雜性 | 筆記 |
|---|---|---|
| HTML 至 PDF | 非常低 | 直接方法替換 |
| 合併 PDF | 低 | 更簡單的 API |
| 文字與圖片 | 低 | HTML 取代程式化 |
| 表格 | 語言 | HTML 表格取代 iText 表格類別 |
| 頁首/頁尾 | 語言 | 事件處理程式 → HTML 模板 |
| 安全性/加密 | 低 | 基於屬性的 API |
範式轉移
這次 iText 移轉的根本轉變是從 程式化 PDF 建構到 HTML-first渲染:
iText: PdfWriter → PdfDocument → Document → Add(Paragraph) → Add(Table)
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(htmlString) → SaveAs()這種範式轉換是一種解放:您不需要學習 iText 的物件模型,而是使用網頁開發人員已經具備的 HTML 和 CSS 技能。
開始之前
先決條件
1..NET 環境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet存取:安裝 NuGet 套件的能力 3.IronPDF 授權:從IronPdf.com取得您的授權金鑰。
NuGet 套件變更
# Remove iText packages
dotnet remove package itext7
dotnet remove package itext7.pdfhtml
dotnet remove package itextsharp
# Install IronPDF
dotnet add package IronPdf# Remove iText packages
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";IRON VB CONVERTER ERROR developers@ironsoftware.com辨識 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 類別 | IronPdf 同等級產品 |
|---|---|---|
| <編碼>PdfWriter</編碼 | <編碼>PdfWriter</編碼 | <代碼>ChromePdfRenderer</代碼 |
| <編碼>PDF 文件</編碼 | 文件 | <編碼>PDF 文件</編碼 |
文件 | 文件 | <代碼>ChromePdfRenderer.RenderHtmlAsPdf()</代碼 |
段落 | 段落 | HTML <p>, <h1> 等。 |
表格 | PdfPTable | HTML <table> |
Cell | <編碼>PdfPCell</編碼 | HTML <td>, <th> |
圖片 | 圖片 | HTML <img> |
| <編碼>PdfReader</編碼 | <編碼>PdfReader</編碼 | <代碼>PdfDocument.FromFile()</代碼 |
| <編碼>PdfMerger</編碼 | 不適用 | <代碼>PdfDocument.Merge()</代碼 |
命名空間對應
| iText 7 命名空間 | 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 7):
// 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);
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 方法需要使用獨立的 iText.Html2pdf 套件 (pdfHTML 附加元件,需另行選購)、建立 FileStream 並將所有內容包裝在 using 語句中,以便妥善處理。 HtmlConverter.ConvertToPdf() 方法會直接寫入資料流。
IronPDF 的方法更加簡潔:創建一個<代碼>ChromePdfRenderer</代碼,使用您的 HTML 字串呼叫 RenderHtmlAsPdf() ,然後在產生的<編碼>PDF 文件</編碼上呼叫 SaveAs() 。 沒有獨立的套件,沒有串流管理,Chromium 渲染引擎提供優異的 CSS3 和JavaScript支援。 請參閱 HTML to PDF 文件,以瞭解其他渲染選項。
範例 2:合併多個 PDF 檔案
之前 (iText 7):
// 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());
}
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 合併作業需要大量的boilerplate:為輸出建立<編碼>PdfWriter</編碼,將其包裝在<編碼>PDF 文件</編碼中,建立<編碼>PdfMerger</編碼,然後透過每個<編碼>PDF 文件</編碼和<編碼>PdfReader</編碼的嵌套 using 語句遍歷原始檔案。 您也必須使用 merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages()) 指定頁面範圍。
IronPDF 將此簡化為三個步驟:使用<代碼>PdfDocument.FromFile()</代碼載入文件、使用清單呼叫靜態<代碼>PdfDocument.Merge()</代碼方法,然後儲存。 整個合併作業變得可閱且可維護。 進一步瞭解 合併與分割 PDF 的相關資訊。
範例 3:使用文字和圖片建立 PDF
之前 (iText 7):
// 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);
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com這個範例最清楚地說明範式的轉變。 iText 要求:
- 三重嵌套的
using語句 (PdfWriter,PdfDocument,Document) - 使用
new Paragraph()為每個文字元素建立段落物件 - 使用
ImageDataFactory.Create()載入影像 - 建立
圖片物件並分別呼叫SetWidth() - 為每個元素呼叫
document.Add()
IronPdf 使用標準的 HTML:<h1> 表示標題,<p> 表示段落,<img> 表示具有 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 linesIRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 使用 HTML 和 CSS:
//IronPDFapproach
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);//IronPDFapproach
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);IRON VB CONVERTER ERROR developers@ironsoftware.comAGPL 授權取消。
iText 的 AGPL 授權需要開放您整個網路應用程式的原始碼,或是購買昂貴的商業授權。IronPDF的商業授權允許在專屬軟體中部署,而無病毒授權要求。
不需要 pdfHTML 附加元件
iText 需要單獨的 pdfHTML 附加元件,以進行 HTML 至 PDF 的轉換,此附加元件需額外付費。IronPDF 在基本套件中包含完整的基於 Chromium 的 HTML 渲染功能。
方法替換模式
| iText 模式 | IronPdf 替代品 |
|---|---|
設定文字對齊方式(TextAlignment.CENTER)。 | CSS text-align: center |
設定字型大小(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/Document 模式
問題:程式碼使用<編碼>PdfWriter</編碼→<編碼>PDF 文件</編碼→文件嵌套模式。
解決方案:以<代碼>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);IRON VB CONVERTER ERROR developers@ironsoftware.com問題 2:找不到 HtmlConverter
問題:程式碼使用 iText.Html2pdf.HtmlConverter 需要 pdfHTML 附加元件。
解決方案:使用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);IRON VB CONVERTER ERROR developers@ironsoftware.com問題 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");IRON VB CONVERTER ERROR developers@ironsoftware.com遷移清單
預遷移
- [清查程式碼庫中所有的 iText API 呼叫
- [ ] 識別程式化的 PDF 建構模式 (段落、表格、單元格)
- [ ] 文件 HtmlConverter 的用法 (pdfHTML 附加元件)
- [ ] 評估 AGPL 合規風險
- [ ] 獲得 IronPdf 授權金鑰
程式碼遷移
- [ ] 移除 iText NuGet 套件:
dotnet 移除套件 itext7。 - [ ] 安裝 IronPdf NuGet 套件:
dotnet add package IronPdf。 - [ ] 更新命名空間匯入 (
使用 iText.*→使用 IronPdf) - [ ] 使用<代碼>ChromePdfRenderer</代碼取代
PdfWriter/Document模式。 - [ ] 將
Paragraph/Table/Cell轉換為 HTML 元素 - [將
HtmlConverter.ConvertToPdf()替換為RenderHtmlAsPdf()。 - [ ] 更新合併作業為
PdfDocument.Merge() - [ ] 在啟動時加入授權金鑰初始化
測試
- [ ] 測試所有 PDF 生成路徑
- [ ] 確認視覺輸出符合預期
- [ ] 使用複雜的 HTML/CSS 內容進行測試
- [ ] 基準效能
後遷移
- [ ] 移除 iText 授權檔案和參考資料
- [ ] 更新文件
- [ ] 取消 iText 訂閱(如適用)
- [將舊有的 iText 程式碼歸檔
結論
從 iText 轉換到IronPDF可消除 AGPL 授權陷阱,同時簡化您的 PDF 生成程式碼。 從程式化建構到 HTML 第一渲染的範式轉移,意味著您的團隊可以利用現有的網頁開發技能,而無需學習 iText 的物件模型。
本次轉換的主要變更如下 1.授權:AGPL (病毒) → 商業 (許可) 2.HTML 支援:獨立的 pdfHTML 附加元件 → 內建 Chromium 3.API範例:程式化 (段落、表格、單元格) → HTML/CSS 4.合併:複雜的 PdfMerger → 簡單的 PdfDocument.Merge() 5.學習曲線:PDF 坐標系統 → Web 開發人員友好






