PDFView4NET與IronPDF:技術比較指南
重要狀態更新: Tall Components 已被 Apryse 收購,新銷售已停止。 官方網站明確聲明結束新授權銷售,敦促潛在使用者改為採用 iText SDK。 這種停止新銷售的決定讓 Tall Components 成為長期承諾選擇 PDF 解決方案的開發者的一個死胡同技術選擇。
該程式庫使用基於 XML 的文件建立方法,配有段落/段落模型,需手動佈局管理和坐標定位。
了解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 基於文件建立,不適合現代 web 工作流。
功能比較概述
| 功能 | Tall Components | IronPDF |
|---|---|---|
| 目前銷售狀況 | 新銷售已停止 | 活躍開發與銷售 |
| HTML 到 PDF 支持 | 無 | 是(HTML5/CSS3,帶有 Chromium) |
| 渲染逼真度 | 已知漏洞和問題 | 經得起考驗 |
| 安裝程式 | 複雜,手動 | 簡單使用 NuGet |
| 客戶支持 | 過渡到 iText SDK | 活躍的支持和社群 |
| 未來的可用性 | 壽命結束 | 長期可行性 |
HTML到PDF轉換
HTML 到 PDF 的轉換能力顯示出這些程式庫之間的基本能力差距。
Tall Components HTML to 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 - 需要手動管理段落和片段
- 不支持 CSS 樣式或現代網格配置
- 需要顯式的 FileStream 管理和釋放
IronPDF HTML轉PDF
IronPDF 提供真正的 HTML 到 PDF 轉換,使用 Chromium 渲染引擎:
// 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 方法支持 HTML 內容,全面的 CSS3 支持,JavaScript 執行和準確渲染現代網格配置。 沒有手動段落管理,無需流處理—一切都由 Chromium 引擎自動處理。
PDF合併操作
合併多個 PDF 文件展示出 API 複雜程度的明顯差異。
Tall Components PDF 合併
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 物件
- 複雜的資源管理和潛在的釋放問題
IronPDF PDF 合併
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 操作 | ||
| 合併PDFs | 是 | 是 |
| 切分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 Server:
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生成模式。
