比较

Tall Components 与 IronPDF:技术比较指南

重要状态更新:高大组件已被 Apryse 收购,新的销售业务已停止。 官方网站明确表示将停止新许可证的销售,敦促潜在用户采用 iText SDK。 对于希望长期使用 PDF 解决方案的开发人员来说,Tall Components 的停止销售使其成为一种无望的技术选择。

该库使用基于 XML 的文档创建方法,采用章节/段落模式,需要手动进行布局管理和坐标定位。

了解IronPDF

IronPDF作为一种积极开发的 PDF 管理解决方案与之形成鲜明对比。 该库采用现代HTML/CSS优先方法,由 Chromium 渲染引擎提供支持,使开发人员能够使用熟悉的网络技术创建 PDF 文档。

IronPDF 通过单个 NuGet 包进行安装,部署简单明了,避免了可能使其他 PDF 解决方案复杂化的 GDI+ 依赖性问题。

高大组件的主要限制

Tall Components 虽然历来可靠,但也有几个关键的局限性:

产品停产:被 Apryse 收购后,停止了新用户获取。 官方网站明确表示将停止新许可证的销售,敦促潜在用户采用 iText SDK。

缺乏 HTML 转 PDF 支持:与一些同类产品不同,Tall Components 不支持直接将 HTML 转换为 PDF。 支持平台上的开发人员已确认高大组件不支持从 HTTP 响应或 HTML 内容创建 PDF。

渲染问题:记录在案的问题揭示了大量的渲染错误,包括空白页面渲染、图形缺失、JPEG 图像不可靠以及字体显示不正确。 这些错误对寻求 PDF 创建的真实性和准确性的用户来说是一个重大障碍。

不再提供支持或更新:由于该产品已停产,因此不再提供错误修复、安全补丁或更新。 已知的渲染错误在停产前从未修复。

传统架构:为不同时代的 .NET 开发而构建,基于 XML 的文档创建完全不适用于现代 Web 工作流程。

功能比较概述

特征高大组件IronPDF
销售现状停止新销售积极开发和销售
支持 HTML 转 PDF是(使用 Chromium 的 HTML5/CSS3)
渲染保真度已知错误和问题久经考验的可靠性
安装复杂,手动简单使用 NuGet
客户支持过渡到 iText SDK积极的支持和社区
未来可用性报废长期可行性

HTML 至 PDF 转换

将 HTML 转换为 PDF 的能力揭示了这些库之间的基本能力差距。

将高大组件 HTML 转换为 PDF.

Tall Components 不提供 HTML 到 PDF 的真正转换。 在翻译过程中,翻译人员不能使用 HTML,而是使用基于片段的方法,将 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
$vbLabelText   $csharpLabel

这种方法:

  • 使用Fragment.FromText(),不能语义地呈现 HTML
  • 需要手动管理章节和片段
  • 不支持 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 Class
$vbLabelText   $csharpLabel

RenderHtmlAsPdf方法可转换 HTML 内容,完全支持 CSS3、JavaScript 执行,并能准确呈现现代网页布局。 无需手动管理章节,无需处理数据流--Chromium 引擎会自动处理一切。

PDF 合并操作

多个 PDF 文档的组合显示了 API 复杂性的显著差异。

高大组件 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
$vbLabelText   $csharpLabel

这种方法要求

  • 为每个文档提供多个嵌套 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 Class
$vbLabelText   $csharpLabel

PdfDocument.Merge() 方法接受多个文档并返回合并结果。 无需页面迭代、无需克隆、无需流管理--只需三行代码即可完成操作。

添加水印

PDF 水印显示了文档操作的复杂性差异。

高组件水印

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
$vbLabelText   $csharpLabel

这种方法要求

  • 手工迭代所有页面
  • 使用显式属性配置创建 TextShape 对象
  • 使用 XY 值进行坐标定位
  • 使用 Color.FromArgb() 手动配置颜色
  • 为页面叠加添加形状
  • 用于输入和输出的多个 FileStream 对象

IronPDF水印

IronPdf 提供了一种声明式 stamper 方法:

// 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 Class
$vbLabelText   $csharpLabel

TextStamper类使用语义对齐属性而不是坐标定位。 ApplyStamp() 自动应用于所有页面,无需手动迭代。 不透明度指定为百分比,而不是 alpha 通道计算。

API 映射参考

评估高大组件迁移到IronPDF的团队可以参考这些等效概念:

高大组件IronPDF
文档ChromePdfRenderer
部分自动翻译
文本段落HTML 文本元素
图像段落<img> 标记
表段HTML <table>
字体CSS font-family
document.Write()pdf.SaveAs()
document.Write(stream)pdf.BinaryData</code>或<code>pdf.Stream
Page.CanvasHTML/CSS 渲染
XmlDocument.Generate()RenderHtmlAsPdf()
PdfKit.Merger.Merge()PdfDocument.Merge()
文档安全性pdf.SecuritySettings
页面布局渲染选项

全面的功能比较

特征高大组件IronPDF
状态停产活跃
支持满的
更新常规翻译
内容创建
HTML 至 PDF完整的 Chromium
URL 至 PDF
CSS 支持完整的 CSS3
JavaScript完整的 ES2024
XML 模板不需要
PDF操作
合并 PDF
拆分 PDF
水印手册内置
页眉/页脚基于 XMLHTML/CSS
安全性
密码保护
数字签名
加密
PDF/A有限的
已知问题
空白页记录错误
缺少图形记录错误
字体问题记录错误
开发
学习曲线高(XML)低 (HTML)
文档过时广泛
社区活跃

已知的高组件错误

这些问题在停产前从未得到解决:

-空白页错误:生成的PDF文件中随机出现空白页 -图形消失:在某些情况下,图像和形状无法渲染 -缺失文本:输出中随机省略文本段落 -字体渲染错误:字体错误或字符乱码 内存泄漏:文档对象未被正确释放。

IronPDF 不存在这些问题--它使用的是成熟的 Chromium 渲染引擎。

当团队考虑高组件迁移时

有几个因素使得从高大组件迁移成为必须,而不是可有可无:

产品停产意味着不再提供新的许可证。 现有用户将被重新定向到 iText SDK,这将带来供应商锁定的风险,因为他们需要一个不同的、昂贵的替代品。

无支持可用性使团队得不到错误修复、安全补丁或更新。 运行不支持的软件和已知的渲染错误会带来运行风险。

已知的渲染错误包括空白页、图形缺失和字体问题,在停产前从未得到解决。 这些记录的问题会影响生产的可靠性。

不支持 HTML 将高大组件限制为基于 XML 的文档创建,完全不适合利用 HTML5 和 CSS3 的基于 Web 的现代 PDF 生成工作流。

传统架构为不同时代的.NET开发而构建,为2026年以.NET 10和C# 14等现代框架为目标的团队带来了技术债务。

安装比较

高大组件安装

# 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
SHELL

需要多个命名空间:

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.Paragraphs
$vbLabelText   $csharpLabel

通过使用节点包管理器在Node.js中安装所需的IronPDF包以启用IronPDF功能。

# Single package
dotnet add package IronPdf
# Single package
dotnet add package IronPdf
SHELL

单一命名空间:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

IronPDF 还为特定框架提供专门的扩展包:

  • Blazor 服务器: Install-Package IronPdf.Extensions.Blazor
  • MAUI: Install-Package IronPdf.Extensions.Maui
  • MVC 框架: Install-Package IronPdf.Extensions.Mvc.Framework

结论

Tall Components 和IronPDF在 .NET PDF 库领域代表着根本不同的地位。高大组件在当时是一个可靠的选择,但它的收购和新许可证的停止已经造成了一种报废的局面。 由于存在文档渲染错误、不支持 HTML 到 PDF 以及缺乏持续维护,因此不适合新开发或长期使用。

对于目前使用高大组件的团队来说,迁移不是可选项,而是必选项。 产品停产,再加上已知的错误和无支持路径,造成了不可接受的运营风险。 重定向到 iText SDK 意味着供应商锁定了不同的、潜在的昂贵替代品。

IronPDF 提供了一个积极开发的现代化替代方案,由 Chromium 提供真正的 HTML5/CSS3 支持、持续更新和支持、直接的 NuGet 安装以及久经考验的渲染可靠性。 对于以基于 Web 的文档生成工作流的现代 .NET 开发为目标的团队而言,IronPDF 的 HTML 优先方法符合当代开发实践,同时消除了困扰高大组件的已知错误和局限性。


如需实施指导,请浏览 IronPDF HTML-to-PDF 教程文档,其中涵盖了现代 .NET 应用程序的 PDF 生成模式。IronPDF HTML-to-PDF 教程 和 文档