比较

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);
            }
        }
    }
}
$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");
    }
}
$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);
            }
        }
    }
}
$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");
    }
}
$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);
            }
        }
    }
}
$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");
    }
}
$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</代码>或<代码>pdf.Stream</代码
<代码>Page.Canvas</代码HTML/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;
$vbLabelText   $csharpLabel

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

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

单一命名空间:

using IronPdf;
using 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 教程 和 文档