比較

Tall ComponentsとIronPDFの比較:技術比較ガイド

Critical Status Update: Tall ComponentsはApryseに買収され、新規販売は中止されました。 公式ウェブサイトでは、新規ライセンス販売の終了を明記しており、潜在的なユーザーには代わりに iText SDK を採用するよう促しています。 この新規販売中止により、PDFソリューションへの長期的なコミットメントを求める開発者にとって、Tall Componentsは行き詰まった技術選択肢となります。

このライブラリは、XMLベースのドキュメント作成アプローチを使用しており、セクション/パラグラフモデルを使用しているため、手作業によるレイアウト管理と座標の位置決めが必要です。

IronPDFの理解

IronPDFは、PDF管理のための積極的に開発されたソリューションとして対照的です。 このライブラリは、ChromiumレンダリングエンジンによるモダンなHTML/CSSファーストのアプローチを採用しており、開発者は使い慣れたWebテクノロジーを使用してPDFドキュメントを作成することができます。

IronPdfは単一のNuGetパッケージによってインストールされ、他のPDFソリューションを複雑にするGDI+依存の問題を回避し、簡単にデプロイできます。

背の高いコンポーネントの主な制限事項

トールコンポーネントには、歴史的に信頼性が高いものの、いくつかの重要な限界があります:

製品廃止:Apryseによる買収は、新規ユーザー獲得に終止符を打ちました。 公式ウェブサイトでは、新規ライセンス販売の終了を明記しており、潜在的なユーザーには代わりに iText SDK を採用するよう促しています。

HTMLからPDFへのサポートの欠如: Tall Componentsは、いくつかの競合製品とは異なり、HTMLからPDFへの直接変換をサポートしていません。 サポートプラットフォームの開発者は、Tall Componentsが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をテキストコンテンツとして扱うフラグメントベースのアプローチを採用しています:

// 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

このアプローチ:

  • HTMLをセマンティックにレンダリングしないFragment.FromText()を使用しています。
  • セクションとフラグメントの手動管理が必要
  • CSSスタイリングや最新のウェブレイアウトには対応していません。
  • 明示的な FileStream の管理と廃棄が必要

IronPDFHTML to 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 メソッドは、CSS3 の完全なサポート、JavaScript の実行、最新の Web レイアウトの正確なレンダリングで HTML コンテンツを変換します。 Chromiumエンジンがすべて自動で処理します。

PDFマージ操作

複数のPDFドキュメントを組み合わせることで、APIの複雑さに大きな違いがあることを示しています。

トール コンポーネント PDF マージ

トールコンポーネントでは、手作業によるページの反復と複製が必要です:

// 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 Merge (英語)

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() メソッドは複数のドキュメントを受け入れ、結合した結果を返します。 ページの反復もクローンもストリーム管理もなく、操作は3行のコードで完了します。

透かしの追加

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は宣言的スタンパーアプローチを提供します:

// 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()は、手動で繰り返すことなく、すべてのページに自動的に適用されます。 不透明度はアルファチャンネル計算ではなく、パーセントで指定します。

APIマッピングリファレンス

Tall ComponentsからIronPdfへの移行を評価するチームは、これらの同等のコンセプトを参照することができます:

背の高いコンポーネントIronPDF
ドキュメント</codeChromePdfRenderer</code
セクション</code自動翻訳
テキストパラグラフ</codeHTMLテキスト要素
イメージパラグラフ</code<img>タグ
表段落</codeHTML <テーブル></code
フォント</codeCSS font-family</code
document.Write()</codepdf.SaveAs()</code
document.Write(stream)</codepdf.BinaryDataまたは pdf.Stream
Page.Canvas</codeHTML/CSSレンダリング
XmlDocument.Generate()を使用してください。RenderHtmlAsPdf()</code
PdfKit.Merger.Merge().PdfDocument.Merge()を使用してください。
ドキュメント.セキュリティpdf.SecuritySettings</code
ページレイアウト</codeレンダリングオプション</code

包括的な機能比較

フィーチャー背の高いコンポーネントIronPDF
<ステータス終了活発
サポートなしフル
更新情報なしレギュラー
コンテンツ作成
HTMLからPDFへなし完全なChromium
URLからPDFへなしはい
CSSサポートなし完全なCSS3
JavaScriptなしフルES2024
XMLテンプレートはい不要
PDFオペレーション
PDFのマージはいはい
PDFの分割はいはい
透かしマニュアル内蔵
ヘッダー/フッターXMLベースHTML/CSS
セキュリティ
パスワード保護はいはい
デジタル署名はいはい
暗号化はいはい
PDF/A制限的はい
既知の問題
空白ページ文書化されたバグなし
不足しているグラフィック文書化されたバグなし
フォントの問題文書化されたバグなし
開発分野
学習曲線高(XML)低レベル(HTML)
ドキュメンテーション古い広範囲
コミュニティなし活発

既知の背の高いコンポーネントのバグ

これらの問題は、廃止される前に修正されることはありませんでした:

  • 空白ページのバグ:生成されたPDFにランダムに空白ページが表示される。
  • グラフィックスが消える: 特定の条件で画像や図形がレンダリングされない。
  • 欠落テキスト: 出力からテキスト段落がランダムに省略される。
  • 誤ったフォントレンダリング: 誤ったフォントや文字化け。
  • メモリリーク:適切に破棄されないドキュメントオブジェクト

IronPDFにはこのような問題はなく、実績のあるChromiumレンダリングエンジンを使用しています。

チームが背の高いコンポーネントの移行を検討するとき

Tall Componentsからの移行は、いくつかの要因によって、オプションではなく必須となっています:

製品廃止とは、新しいライセンスが利用できないことを意味します。 既存ユーザーは iText SDK にリダイレクトされるため、別の高価な代替ツールによるベンダーロックインのリスクが生じます。

サポートが利用できないため、チームはバグ修正、セキュリティパッチ、アップデートを受けられません。 既知のレンダリングバグがある未サポートのソフトウェアを実行すると、運用上のリスクが生じます。

空白ページ、欠落したグラフィック、フォントの問題を含む既知のレンダリングバグは、廃止前に解決されることはありませんでした。 これらの文書化された問題は、生産の信頼性に影響します。

HTMLをサポートしていないため、Tall ComponentsはXMLベースのドキュメント作成に制限され、HTML5とCSS3を活用する最新のWebベースのPDF生成ワークフローにはまったく適していません。

.NET開発の異なる時代のために構築されたレガシーアーキテクチャは、2026年に.NET 10やC# 14のような最新のフレームワークをターゲットとするチームに技術的負債を生じさせます。

インストールの比較

Tallコンポーネントのインストール

# 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

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:インストール-パッケージ IronPdf.Extensions.Maui
  • MVCフレームワーク: インストール-パッケージ IronPdf.Extensions.Mvc.Framework

結論

Tall ComponentsとIronPDFは.NET PDFライブラリの中で根本的に異なる位置にあります。 Tall Componentsは、その時代には確かな選択肢として機能していましたが、新規ライセンスの取得と停止により、寿命が尽きました。 文書化されたレンダリングのバグ、HTMLからPDFへのサポートの欠如、継続的なメンテナンスの欠如により、新規開発や長期的なコミットメントには不向きです。

現在Tall Componentsを使用しているチームにとって、移行はオプションではなく、必須です。 製品の製造中止は、既知のバグやサポートパスの欠如と相まって、容認できない運用リスクを生み出します。 iText SDK へのリダイレクトは、異なる、潜在的に高価な代替ツールによるベンダーロックインを意味します。

IronPdfは、Chromiumによる本物のHTML5/CSS3サポート、継続的なアップデートとサポート、簡単なNuGetインストール、実証されたレンダリングの信頼性など、積極的に開発された最新の代替ツールを提供します。 ウェブベースのドキュメント生成ワークフローを備えた最新の.NET開発をターゲットとするチームにとって、IronPDFのHTMLファーストのアプローチは、Tall Componentsを悩ませていた既知のバグや制限を排除しながら、現代の開発プラクティスに合致しています。


実装ガイダンスについては、HTMLからPDFへのIronPDFチュートリアルと、最新の.NETアプリケーションのためのPDF生成パターンをカバーするドキュメントをご覧ください