Tall Components與IronPDF:技術比較指南
關鍵狀態更新:Tall Components 已被 Apryse 收購,新銷售已停止。 官方網站明確表示終止新授權銷售,敦促潛在用戶改採用 iText SDK。 這次新銷售的中止使Tall Components成為開發者尋求長期 PDF 解決方案承諾的一個死胡同技術選擇。
該程式庫使用基於 XML 的文件創建方法,採用 Section/Paragraph 模式,這需要手動佈局管理和座標定位。
了解IronPDF
IronPDF 作為一個積極發展的 PDF 管理解決方案形成對比。 該程式庫採用現代HTML/CSS優先的方法,並由 Chromium 渲染引擎提供支持,讓開發者得以使用熟悉的網頁技術創建 PDF 文件。
IronPDF 通過單個 NuGet 套件安裝,展開簡單,避免了其他 PDF 解決方案可能面臨的 GDI+ 依賴問題。
Tall Components的關鍵限制
Tall Components 雖然歷來可靠,但遭遇幾個關鍵限制:
產品停產:被 Apryse 收購後,結束了新用戶的獲取。 官方網站明確表示終止新授權銷售,敦促潛在用戶改採用 iText SDK。
缺乏 HTML 到 PDF 的支持:與一些同類相比,Tall Components 不支持直接 HTML 到 PDF 的轉換。 支持平台上的開發者已確認Tall Components不支持從 HTTP 回應或 HTML 內容創建 PDF。
渲染問題:文檔記錄的問題顯示了廣泛的渲染錯誤,包括空白頁面渲染、圖形缺失、JPEG 圖像的可靠性低和字體顯示不正確。 這些錯誤對於尋求準確性和精確度的 PDF 創建用戶來說是一個顯著障礙。
無支持或更新:隨著產品停產,沒有錯誤修復、安全補丁或更新可用。 在停止之前已知的渲染錯誤從未修復。
遺留架構:為不同時代的.NET開發而建,基於XML 的文件創建完全不適合現代網頁工作流程。
功能比較概述
| 功能 | Tall Components | IronPDF |
|---|---|---|
| 當前銷售狀況 | 已停止新銷售 | 積極開發並銷售 |
| HTML到PDF支持 | 沒有 | 是 (HTML5/CSS3 與 Chromium) |
| 渲染保真度 | 已知錯誤和問題 | 已證實的可靠性 |
| 安裝 | 複雜的,手動 | 簡單,與NuGet一起 |
| 客戶支持 | 過渡到 iText SDK | 活動支持和社區 |
| 未來可用性 | 產品終止 | 長期可行性 |
HTML到PDF的轉換
將 HTML 轉換為 PDF 的能力揭示了這些程式庫之間的基本功能差距。
Tall ComponentsHTML 到 PDF
Tall Components 不提供真正的 HTML 到 PDF 轉換。 相反,它使用基於片段的方法將 HTML 處理為文本內容:
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create a new document
using (Document document = new Document())
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
// Create HTML fragment
Fragment fragment = Fragment.FromText(html);
// Add to document
Section section = document.Sections.Add();
section.Fragments.Add(fragment);
// Save to file
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
document.Write(fs);
}
}
}
}// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create a new document
using (Document document = new Document())
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
// Create HTML fragment
Fragment fragment = Fragment.FromText(html);
// Add to document
Section section = document.Sections.Add();
section.Fragments.Add(fragment);
// Save to file
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
document.Write(fs);
}
}
}
}Imports TallComponents.PDF.Kit
Imports System.IO
Class Program
Shared Sub Main()
' Create a new document
Using document As New Document()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
' Create HTML fragment
Dim fragment As Fragment = Fragment.FromText(html)
' Add to document
Dim section As Section = document.Sections.Add()
section.Fragments.Add(fragment)
' Save to file
Using fs As New FileStream("output.pdf", FileMode.Create)
document.Write(fs)
End Using
End Using
End Sub
End Class這種方法:
- 使用
Fragment.FromText(),不語義地渲染HTML - 需要手動的Section和Fragment管理
- 不支持CSS樣式或現代網頁佈局
- 需要顯式的FileStream管理和釋放
IronPDFHTML 至 PDF
IronPDF使用 Chromium 渲染引擎提供真正的 HTML 到 PDF 轉換:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}Imports IronPdf
Class Program
Shared Sub Main()
' Create a PDF from HTML string
Dim renderer As New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassRenderHtmlAsPdf 方法支持全 CSS3 支持,JavaScript 執行,以及現代網頁佈局的準確渲染。 無需手動管理部分,無需流處理——Chromium 引擎自動處理所有事務。
PDF合併操作
合併多個 PDF 文件展示了 API 複雜性的顯著差異。
Tall ComponentsPDF 合併
Tall Components 需要手動的頁面迭代和克隆:
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create output document
using (Document outputDoc = new Document())
{
// Load first PDF
using (FileStream fs1 = new FileStream("document1.pdf", FileMode.Open))
using (Document doc1 = new Document(fs1))
{
foreach (Page page in doc1.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Load second PDF
using (FileStream fs2 = new FileStream("document2.pdf", FileMode.Open))
using (Document doc2 = new Document(fs2))
{
foreach (Page page in doc2.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Save merged document
using (FileStream output = new FileStream("merged.pdf", FileMode.Create))
{
outputDoc.Write(output);
}
}
}
}// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create output document
using (Document outputDoc = new Document())
{
// Load first PDF
using (FileStream fs1 = new FileStream("document1.pdf", FileMode.Open))
using (Document doc1 = new Document(fs1))
{
foreach (Page page in doc1.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Load second PDF
using (FileStream fs2 = new FileStream("document2.pdf", FileMode.Open))
using (Document doc2 = new Document(fs2))
{
foreach (Page page in doc2.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Save merged document
using (FileStream output = new FileStream("merged.pdf", FileMode.Create))
{
outputDoc.Write(output);
}
}
}
}Imports TallComponents.PDF.Kit
Imports System.IO
Class Program
Shared Sub Main()
' Create output document
Using outputDoc As New Document()
' Load first PDF
Using fs1 As New FileStream("document1.pdf", FileMode.Open)
Using doc1 As New Document(fs1)
For Each page As Page In doc1.Pages
outputDoc.Pages.Add(page.Clone())
Next
End Using
End Using
' Load second PDF
Using fs2 As New FileStream("document2.pdf", FileMode.Open)
Using doc2 As New Document(fs2)
For Each page As Page In doc2.Pages
outputDoc.Pages.Add(page.Clone())
Next
End Using
End Using
' Save merged document
Using output As New FileStream("merged.pdf", FileMode.Create)
outputDoc.Write(output)
End Using
End Using
End Sub
End Class這種方法需要:
- 對每個文檔進行多個嵌套的
using語句 - 對每個頁面集合進行手動迭代
- 明確的
page.Clone()調用以複製頁面 - 為輸入和輸出單獨創建FileStream對象
- 複雜的資源管理,有可能出現釋放問題
IronPDFPDF 合併
IronPDF提供聲明式的合併操作:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Load PDFs
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
// Save merged document
merged.SaveAs("merged.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Load PDFs
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
// Save merged document
merged.SaveAs("merged.pdf");
}
}Imports IronPdf
Class Program
Shared Sub Main()
' Load PDFs
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
' Merge PDFs
Dim merged = PdfDocument.Merge(pdf1, pdf2)
' Save merged document
merged.SaveAs("merged.pdf")
End Sub
End ClassPdfDocument.Merge() 方法接受多個文件,並返回合併的結果。 無需迭代頁面,無需克隆,無需流管理——操作在三行代碼中完成。
添加水印
在 PDF 文件上添加水印展示了文件操作的複雜性差異。
Tall Components水印
Tall Components 需要基於座標的位置和形狀管理:
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using System.IO;
using System.Drawing;
class Program
{
static void Main()
{
// Load existing PDF
using (FileStream fs = new FileStream("input.pdf", FileMode.Open))
using (Document document = new Document(fs))
{
// Iterate through pages
foreach (Page page in document.Pages)
{
// Create watermark text
TextShape watermark = new TextShape();
watermark.Text = "CONFIDENTIAL";
watermark.Font = new Font("Arial", 60);
watermark.PenColor = Color.FromArgb(128, 255, 0, 0);
watermark.X = 200;
watermark.Y = 400;
watermark.Rotate = 45;
// Add to page
page.Overlay.Shapes.Add(watermark);
}
// Save document
using (FileStream output = new FileStream("watermarked.pdf", FileMode.Create))
{
document.Write(output);
}
}
}
}// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using System.IO;
using System.Drawing;
class Program
{
static void Main()
{
// Load existing PDF
using (FileStream fs = new FileStream("input.pdf", FileMode.Open))
using (Document document = new Document(fs))
{
// Iterate through pages
foreach (Page page in document.Pages)
{
// Create watermark text
TextShape watermark = new TextShape();
watermark.Text = "CONFIDENTIAL";
watermark.Font = new Font("Arial", 60);
watermark.PenColor = Color.FromArgb(128, 255, 0, 0);
watermark.X = 200;
watermark.Y = 400;
watermark.Rotate = 45;
// Add to page
page.Overlay.Shapes.Add(watermark);
}
// Save document
using (FileStream output = new FileStream("watermarked.pdf", FileMode.Create))
{
document.Write(output);
}
}
}
}Imports TallComponents.PDF.Kit
Imports TallComponents.PDF.Layout
Imports System.IO
Imports System.Drawing
Class Program
Shared Sub Main()
' Load existing PDF
Using fs As New FileStream("input.pdf", FileMode.Open)
Using document As New Document(fs)
' Iterate through pages
For Each page As Page In document.Pages
' Create watermark text
Dim watermark As New TextShape()
watermark.Text = "CONFIDENTIAL"
watermark.Font = New Font("Arial", 60)
watermark.PenColor = Color.FromArgb(128, 255, 0, 0)
watermark.X = 200
watermark.Y = 400
watermark.Rotate = 45
' Add to page
page.Overlay.Shapes.Add(watermark)
Next
' Save document
Using output As New FileStream("watermarked.pdf", FileMode.Create)
document.Write(output)
End Using
End Using
End Using
End Sub
End Class這種方法需要:
- 手動迭代所有頁面
- 創建
TextShape對象並有明確的屬性配置 - 使用
X和Y值進行座標定位 - 使用
Color.FromArgb()進行手動顏色配置 - 向頁面疊加層添加形狀
- 多個FileStream對象用於輸入和輸出
IronPDF水印
IronPDF 提供了一個聲明式的印章方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
// Load existing PDF
var pdf = PdfDocument.FromFile("input.pdf");
// Create watermark
var watermark = new TextStamper()
{
Text = "CONFIDENTIAL",
FontSize = 60,
Opacity = 50,
Rotation = 45,
VerticalAlignment = VerticalAlignment.Middle,
HorizontalAlignment = HorizontalAlignment.Center
};
// Apply watermark to all pages
pdf.ApplyStamp(watermark);
// Save watermarked PDF
pdf.SaveAs("watermarked.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
// Load existing PDF
var pdf = PdfDocument.FromFile("input.pdf");
// Create watermark
var watermark = new TextStamper()
{
Text = "CONFIDENTIAL",
FontSize = 60,
Opacity = 50,
Rotation = 45,
VerticalAlignment = VerticalAlignment.Middle,
HorizontalAlignment = HorizontalAlignment.Center
};
// Apply watermark to all pages
pdf.ApplyStamp(watermark);
// Save watermarked PDF
pdf.SaveAs("watermarked.pdf");
}
}Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
' Load existing PDF
Dim pdf = PdfDocument.FromFile("input.pdf")
' Create watermark
Dim watermark = New TextStamper() With {
.Text = "CONFIDENTIAL",
.FontSize = 60,
.Opacity = 50,
.Rotation = 45,
.VerticalAlignment = VerticalAlignment.Middle,
.HorizontalAlignment = HorizontalAlignment.Center
}
' Apply watermark to all pages
pdf.ApplyStamp(watermark)
' Save watermarked PDF
pdf.SaveAs("watermarked.pdf")
End Sub
End ClassTextStamper 類使用語義對齊屬性而非座標定位。 ApplyStamp() 自動應用於所有頁面,無需手動迭代。 不透明度以百分比指定,而不是alpha通道計算。
API對映參考
評估Tall Components遷移到IronPDF的團隊可以參考這些等效概念:
| Tall Components | IronPDF |
|---|---|
Document | ChromePdfRenderer |
Section | 自動 |
TextParagraph | HTML文本元素 |
ImageParagraph | <img> 標籤 |
TableParagraph | HTML <table> |
Font | CSS font-family |
document.Write() | pdf.SaveAs() |
document.Write(stream) | pdf.BinaryData 或 pdf.Stream |
Page.Canvas | HTML/CSS渲染 |
XmlDocument.Generate() | RenderHtmlAsPdf() |
PdfKit.Merger.Merge() | PdfDocument.Merge() |
Document.Security | pdf.SecuritySettings |
PageLayout | RenderingOptions |
全面功能比較
| 功能 | Tall Components | IronPDF |
|---|---|---|
| 狀態 | 已停產 | 活躍 |
| 支持 | None | 完整 |
| 更新 | None | 定期 |
| 內容創建 | ||
| HTML到PDF | 沒有 | 完整的Chromium |
| URL到PDF | 沒有 | 有 |
| CSS支持 | 沒有 | 完整的CSS3 |
| JavaScript | 沒有 | 完整的ES2024 |
| XML 範本 | 有 | 不需要 |
| PDF 操作 | ||
| 合併PDF | 有 | 有 |
| 分割PDF | 有 | 有 |
| 水印 | 手動 | 內建 |
| 頁首/頁尾 | 基於XML | HTML/CSS |
| 安全性 | ||
| 密碼保護 | 有 | 有 |
| 數位簽名 | 有 | 有 |
| 加密 | 有 | 有 |
| PDF/A | 有限 | 有 |
| 已知問題 | ||
| 空白頁 | 已記錄的錯誤 | None |
| 缺少圖形 | 已記錄的錯誤 | None |
| 字體問題 | 已記錄的錯誤 | None |
| 開發 | ||
| 學習曲線 | 高(XML) | 低(HTML) |
| 文檔 | 過時 | 廣泛 |
| 社群 | None | 活躍 |
已知的Tall Components錯誤
這些問題在停產前從未被修復:
- 空白頁錯誤:在生成的 PDF 中隨機出現的空白頁面
- 消失的圖形:圖像和形狀在某些條件下一直未渲染
- 消失的文字:從輸出中隨機遺漏的文字段落
- 字體渲染不正確:錯誤的字體或亂碼
- 記憶體洩漏:文件對象未正確釋放
IronPDF 沒有這些問題——它使用了一個經過驗證的 Chromium 渲染引擎。
當團隊考慮Tall Components遷移
幾個因素使得從Tall Components遷移成為必需而非可選:
產品停產意味著沒有新的授權可用。 現有用戶正在被重定向到 iText SDK,這會產生與不同且昂貴的替代品的供應商鎖定風險。
無可用支持使團隊無法獲得錯誤修復、安全補丁或更新。 運行有已知渲染錯誤的無支持軟體會帶來運營風險。
已知的渲染錯誤包括空白頁、圖形缺失和字體問題在停產前從未解決。 這些記錄的問題會影響生產可靠性。
無 HTML 支持限制了Tall Components至基於 XML 的文件創建,這完全不適合利用 HTML5 和 CSS3 的現代基於網絡的 PDF 生成工作流程。
遺留架構為不同年代的 .NET 開發而建,為目標於現代框架如 .NET 10 和 C# 14 於 2026 年的團隊帶來技術負擔。
安裝比較
Tall Components安裝
# Multiple packages may be needed
dotnet add package TallComponents.PDF.Kit
dotnet add package TallComponents.PDF.Layout
dotnet add package TallComponents.PDF.Layout.Drawing# Multiple packages may be needed
dotnet add package TallComponents.PDF.Kit
dotnet add package TallComponents.PDF.Layout
dotnet add package TallComponents.PDF.Layout.Drawing需要多個命名空間:
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using TallComponents.PDF.Layout.Drawing;
using TallComponents.PDF.Layout.Paragraphs;using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using TallComponents.PDF.Layout.Drawing;
using TallComponents.PDF.Layout.Paragraphs;Imports TallComponents.PDF.Kit
Imports TallComponents.PDF.Layout
Imports TallComponents.PDF.Layout.Drawing
Imports TallComponents.PDF.Layout.ParagraphsIronPDF安裝
# Single package
dotnet add package IronPdf# Single package
dotnet add package IronPdf單一命名空間:
using IronPdf;using IronPdf;Imports IronPdfIronPDF 還為特定框架提供專門的擴展包:
- Blazor 伺服器:
Install-Package IronPdf.Extensions.Blazor - MAUI:
Install-Package IronPdf.Extensions.Maui - MVC 框架:
Install-Package IronPdf.Extensions.Mvc.Framework
結論
Tall Components 和IronPDF在 .NET PDF 程式庫領域中代表了根本不同的立場。Tall Components在其時間裡作為一個堅實的選擇,但其收購和停止新授權的地步已創造了一個終止狀況。 記錄的渲染錯誤,缺乏 HTML 到 PDF 支持和持續維護的缺失使其不適合新的開發或長期承諾。
對於目前使用Tall Components的團隊來說,遷移不是選項——而是必須。 產品的停產,結合已知的錯誤和無支持的途徑,創造了不可接受的運營風險。 重定向到 iText SDK 代表著供應商鎖定與一個不同的,可能昂貴的替代品。
IronPDF 提供了一個現代的,積極發展的替代方案,具有由 Chromium 驅動的真正的 HTML5/CSS3 支持,不斷的更新和支持,簡單明瞭的 NuGet 安裝,以及經驗證的渲染可靠性。 對於目標現代 .NET 開發和基於 Web 的文件生成工作流程的團隊來說,IronPDF 的 HTML 首先的方法與當代開發實踐保持一致,同時消除了困擾Tall Components的已知錯誤和限制。
有關實施指導,請探索IronPDF HTML-to-PDF教程和文件,涵蓋現代.NET應用程序的PDF生成模式。
