比較

PrinceXML與IronPDF:技術比較指南

當 .NET 開發人員評估 PDF 生成程式庫時,兩種解決方案經常在企業討論中出現:TX Text Control 和 IronPDF。 雖然兩者都可以產生 PDF 輸出,但它們代表了根本不同的架構哲學。 這項技術比較檢查了這兩個程式庫,以幫助架構師和開發人員為其.NET應用程式做出明智的決策。

了解 TX Text Control

TX Text Control 是一個全面的文件編輯元件,著重於具備嵌入式 UI 控制的 DOCX 編輯功能。 PDF 生成作為其更廣泛的文件處理架構中的次要功能存在。 該平台提供廣泛的文件編輯功能,適合需要豐富文字編輯介面的應用程式。

然而,這個全面的性質引入了開發團隊應仔細評估的考慮因素:

  • 昂貴的授權: TX Text Control 按商業授權運行,每位開發者起價為 $3,398+,且要求每年強制續約 40% 才能維持更新存取
  • PDF 作為次要功能: 核心架構優先考慮文字處理而非 PDF 生成,將 PDF 輸出視為附加功能
  • 已知的硬體問題: 已記錄的 Intel Iris Xe Graphics 渲染錯誤,影響第 11 代 Intel 處理器,需要註冊表解決方式
  • 臃腫的依賴: 包含文件編輯 UI 元件,對於以 PDF 為重點的工作流程可能是不必要的
  • 複雜的 API: 需要 ServerTextControl 上下文管理和選擇模式模式

了解IronPDF

IronPDF 採取截然不同的方法,專注於 PDF 生成,而不新增 UI 元件或 DOCX 編輯工具。 該程式庫以精簡的量身定制設計脫穎而出,專門優化 PDF 生成和操作,使其成為高效的 PDF 首要架構工具。

IronPDF的關鍵特性包括:

  • PDF 首要架構: 從頭開始設計以生成 PDF,提供強大的文件建立和渲染能力
  • Chromium 渲染引擎: 利用現代 HTML5 和 CSS3 標準,完全支援 JavaScript 執行
  • 成本效益: 一次性授權模式消除了持續的訂閱成本
  • 已證明的穩定性: 在各種硬體配置上的可靠性記錄,避免平臺特定的渲染問題
  • 簡單整合: 不需要上下文管理或複雜的初始化模式

價格比較

TextControl 和IronPDF之間的授權結構揭示了隨著時間的推移而顯著的成本差異:

方面TX Text ControlIronPDF
基本授權每位開發者 $3,398+$2,998 每位開發者一次性
年度續約40% 強制可選支援
4人團隊 (第1年)約 $6,749約 $2,996
總計3年成本每位開發者 $5,750+$2,998 每位開發者
UI 元件捆綁 (可能臃腫)僅以 PDF 為重點
伺服器運行時額外授權包含

功能比較

下面的表格突出顯示了 TextControl 和IronPDF在關鍵維度上的技術差異:

功能TX Text ControlIronPDF
主要焦點DOCX 編輯PDF 生成
PDF 質量基本,附加功能高,核心功能
HTML到PDF是 (次要)是 (主要)
CSS支援有限完全支持 CSS3
JavaScript 執行有限完整的ES2024
URL 至 PDF需要複雜設置原生支持
頁眉/頁腳複雜API簡單的基於HTML的
郵件合併專有系統HTML 範本
PDF/A合規性
密碼保護
數位簽名
合併 PDF s有限支持
分割 PDF s有限支持
水印複雜的實作簡單的HTML/CSS
硬體相容性已知的 Intel Iris 問題在所有裝置上穩定
上下文管理需要無需
跨平台以Windows為主

API 架構差異

TextControl 和IronPDF之間的關鍵區別在於它們的 API 設計哲學和初始化模式。

TextControl 方法

TextControl 需要透過 ServerTextControl 類進行顯式上下文管理。 每個操作都必須在調用 Create() 後的 using 區塊內進行:

// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;

namespace TextControlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServerTextControl textControl = new ServerTextControl())
            {
                textControl.Create();

                string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";

                textControl.Load(html, StreamType.HTMLFormat);
                textControl.Save("output.pdf", StreamType.AdobePDF);
            }
        }
    }
}
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;

namespace TextControlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServerTextControl textControl = new ServerTextControl())
            {
                textControl.Create();

                string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";

                textControl.Load(html, StreamType.HTMLFormat);
                textControl.Save("output.pdf", StreamType.AdobePDF);
            }
        }
    }
}
Imports TXTextControl
Imports System.IO

Namespace TextControlExample
    Class Program
        Shared Sub Main(ByVal args As String())
            Using textControl As New ServerTextControl()
                textControl.Create()

                Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"

                textControl.Load(html, StreamType.HTMLFormat)
                textControl.Save("output.pdf", StreamType.AdobePDF)
            End Using
        End Sub
    End Class
End Namespace
$vbLabelText   $csharpLabel

這種模式需要了解 TextControl 特定類別、流型別和上下文生命週期。

IronPDF方法

IronPDF 完全消除了上下文管理。 ChromePdfRenderer 類提供了無狀態API,開發人員可以立即使用:

// NuGet: Install-Package IronPdf
using IronPdf;

namespace IronPdfExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var renderer = new ChromePdfRenderer();

            string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";

            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs("output.pdf");
        }
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

namespace IronPdfExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var renderer = new ChromePdfRenderer();

            string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";

            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs("output.pdf");
        }
    }
}
Imports IronPdf

Namespace IronPdfExample
    Class Program
        Shared Sub Main(ByVal args As String())
            Dim renderer = New ChromePdfRenderer()

            Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"

            Dim pdf = renderer.RenderHtmlAsPdf(html)
            pdf.SaveAs("output.pdf")
        End Sub
    End Class
End Namespace
$vbLabelText   $csharpLabel

有關HTML轉換能力的全面指南,請參閱 HTML到PDF教程

API映射參考

評估從TextControl轉向IronPDF的團隊會發現此映射有助於理解概念等價:

TX Text ControlIronPDF
ServerTextControl.Create()new ChromePdfRenderer()
tx.Load(html, StreamType.HTMLFormat)renderer.RenderHtmlAsPdf(html)
tx.Load(url, StreamType.HTMLFormat)renderer.RenderUrlAsPdf(url)
tx.Save(path, StreamType.AdobePDF)pdf.SaveAs(path)
SaveSettings.PDFAConformanceRenderingOptions.PdfAFormat
DocumentServer.MailMergeHTML 模板 + Razor
DocumentTarget.HeadersAndFootersHtmlHeaderFooter
LoadSettingsRenderingOptions
StreamType.AdobePDF預設輸出

合併PDF文件

文件合併是一個常見需求,其實現複雜性在兩個程式庫之間存在差異。

TextControl 實現

TextControl 需要通過顯式新增模式標誌按順序載入文件:

// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;

namespace TextControlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServerTextControl textControl = new ServerTextControl())
            {
                textControl.Create();

                byte[] pdf1 = File.ReadAllBytes("document1.pdf");
                textControl.Load(pdf1, StreamType.AdobePDF);

                byte[] pdf2 = File.ReadAllBytes("document2.pdf");
                textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);

                textControl.Save("merged.pdf", StreamType.AdobePDF);
            }
        }
    }
}
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;

namespace TextControlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServerTextControl textControl = new ServerTextControl())
            {
                textControl.Create();

                byte[] pdf1 = File.ReadAllBytes("document1.pdf");
                textControl.Load(pdf1, StreamType.AdobePDF);

                byte[] pdf2 = File.ReadAllBytes("document2.pdf");
                textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);

                textControl.Save("merged.pdf", StreamType.AdobePDF);
            }
        }
    }
}
Imports TXTextControl
Imports System.IO

Namespace TextControlExample
    Class Program
        Shared Sub Main(ByVal args As String())
            Using textControl As New ServerTextControl()
                textControl.Create()

                Dim pdf1 As Byte() = File.ReadAllBytes("document1.pdf")
                textControl.Load(pdf1, StreamType.AdobePDF)

                Dim pdf2 As Byte() = File.ReadAllBytes("document2.pdf")
                textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append)

                textControl.Save("merged.pdf", StreamType.AdobePDF)
            End Using
        End Sub
    End Class
End Namespace
$vbLabelText   $csharpLabel

IronPDF實施

IronPDF 提供了一個專用的靜態合併方法,接受多個文件:

// NuGet: Install-Package IronPdf
using IronPdf;

namespace IronPdfExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var pdf1 = PdfDocument.FromFile("document1.pdf");
            var pdf2 = PdfDocument.FromFile("document2.pdf");

            var merged = PdfDocument.Merge(pdf1, pdf2);
            merged.SaveAs("merged.pdf");
        }
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

namespace IronPdfExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var pdf1 = PdfDocument.FromFile("document1.pdf");
            var pdf2 = PdfDocument.FromFile("document2.pdf");

            var merged = PdfDocument.Merge(pdf1, pdf2);
            merged.SaveAs("merged.pdf");
        }
    }
}
Imports IronPdf

Namespace IronPdfExample
    Class Program
        Shared Sub Main(ByVal args As String())
            Dim pdf1 = PdfDocument.FromFile("document1.pdf")
            Dim pdf2 = PdfDocument.FromFile("document2.pdf")

            Dim merged = PdfDocument.Merge(pdf1, pdf2)
            merged.SaveAs("merged.pdf")
        End Sub
    End Class
End Namespace
$vbLabelText   $csharpLabel

PdfDocument.Merge 方法 接受任意數量的文件,返回一個新的合併 PDF,而無需上下文管理或手動字節陣列處理。

頁眉、頁腳和頁碼

使用動態頁碼新增頁眉和頁腳顯示出顯著的 API 複雜性差異。

TextControl 實現

TextControl 需要基於區段的頁眉/頁腳操作,具有顯式型別聲明:

// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;

namespace TextControlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServerTextControl textControl = new ServerTextControl())
            {
                textControl.Create();

                string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
                textControl.Load(html, StreamType.HTMLFormat);

                HeaderFooter header = new HeaderFooter(HeaderFooterType.Header);
                header.Text = "Document Header";
                textControl.Sections[0].HeadersAndFooters.Add(header);

                HeaderFooter footer = new HeaderFooter(HeaderFooterType.Footer);
                footer.Text = "Page {page} of {numpages}";
                textControl.Sections[0].HeadersAndFooters.Add(footer);

                textControl.Save("output.pdf", StreamType.AdobePDF);
            }
        }
    }
}
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;

namespace TextControlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServerTextControl textControl = new ServerTextControl())
            {
                textControl.Create();

                string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
                textControl.Load(html, StreamType.HTMLFormat);

                HeaderFooter header = new HeaderFooter(HeaderFooterType.Header);
                header.Text = "Document Header";
                textControl.Sections[0].HeadersAndFooters.Add(header);

                HeaderFooter footer = new HeaderFooter(HeaderFooterType.Footer);
                footer.Text = "Page {page} of {numpages}";
                textControl.Sections[0].HeadersAndFooters.Add(footer);

                textControl.Save("output.pdf", StreamType.AdobePDF);
            }
        }
    }
}
Imports TXTextControl
Imports System.IO

Namespace TextControlExample
    Class Program
        Shared Sub Main(ByVal args As String())
            Using textControl As New ServerTextControl()
                textControl.Create()

                Dim html As String = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>"
                textControl.Load(html, StreamType.HTMLFormat)

                Dim header As New HeaderFooter(HeaderFooterType.Header)
                header.Text = "Document Header"
                textControl.Sections(0).HeadersAndFooters.Add(header)

                Dim footer As New HeaderFooter(HeaderFooterType.Footer)
                footer.Text = "Page {page} of {numpages}"
                textControl.Sections(0).HeadersAndFooters.Add(footer)

                textControl.Save("output.pdf", StreamType.AdobePDF)
            End Using
        End Sub
    End Class
End Namespace
$vbLabelText   $csharpLabel

IronPDF實施

IronPDF 提供了增強的文字頁眉和頁腳新增方法:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

namespace IronPdfExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var renderer = new ChromePdfRenderer();

            string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";

            var pdf = renderer.RenderHtmlAsPdf(html);

            pdf.AddTextHeader("Document Header");
            pdf.AddTextFooter("Page {page} of {total-pages}");

            pdf.SaveAs("output.pdf");
        }
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

namespace IronPdfExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var renderer = new ChromePdfRenderer();

            string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";

            var pdf = renderer.RenderHtmlAsPdf(html);

            pdf.AddTextHeader("Document Header");
            pdf.AddTextFooter("Page {page} of {total-pages}");

            pdf.SaveAs("output.pdf");
        }
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Namespace IronPdfExample
    Class Program
        Shared Sub Main(args As String())
            Dim renderer As New ChromePdfRenderer()

            Dim html As String = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>"

            Dim pdf = renderer.RenderHtmlAsPdf(html)

            pdf.AddTextHeader("Document Header")
            pdf.AddTextFooter("Page {page} of {total-pages}")

            pdf.SaveAs("output.pdf")
        End Sub
    End Class
End Namespace
$vbLabelText   $csharpLabel

對於更複雜的頁眉設計,IronPDF 也支援接受完整 HTML 和 CSS 樣式的 HtmlHeaderFooter 類

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; text-align: center; font-size: 12pt;'>
            Company Report
        </div>",
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; text-align: right; font-size: 10pt;'>
            Page {page} of {total-pages}
        </div>",
    MaxHeight = 25
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; text-align: center; font-size: 12pt;'>
            Company Report
        </div>",
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; text-align: right; font-size: 10pt;'>
            Page {page} of {total-pages}
        </div>",
    MaxHeight = 25
};
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "
        <div style='width: 100%; text-align: center; font-size: 12pt;'>
            Company Report
        </div>",
    .MaxHeight = 30
}

renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
    .HtmlFragment = "
        <div style='width: 100%; text-align: right; font-size: 10pt;'>
            Page {page} of {total-pages}
        </div>",
    .MaxHeight = 25
}
$vbLabelText   $csharpLabel

URL 轉 PDF

將即時網頁轉換為 PDF 揭示了每個程式庫如何處理網頁內容的架構差異。

TextControl 方法

TextControl 需要透過其 HTML 格式處理器手動載入 URL,該處理器提供有限的 CSS 和 JavaScript 支援:

using (ServerTextControl tx = new ServerTextControl())
{
    tx.Create();

    LoadSettings loadSettings = new LoadSettings();
    loadSettings.ApplicationFieldFormat = ApplicationFieldFormat.MSWord;
    tx.Load("https://example.com/invoice", StreamType.HTMLFormat, loadSettings);

    SaveSettings saveSettings = new SaveSettings();
    saveSettings.PDFAConformance = PDFAConformance.PDFa1b;
    tx.Save("output.pdf", StreamType.AdobePDF, saveSettings);
}
using (ServerTextControl tx = new ServerTextControl())
{
    tx.Create();

    LoadSettings loadSettings = new LoadSettings();
    loadSettings.ApplicationFieldFormat = ApplicationFieldFormat.MSWord;
    tx.Load("https://example.com/invoice", StreamType.HTMLFormat, loadSettings);

    SaveSettings saveSettings = new SaveSettings();
    saveSettings.PDFAConformance = PDFAConformance.PDFa1b;
    tx.Save("output.pdf", StreamType.AdobePDF, saveSettings);
}
Imports ServerTextControlNamespace

Using tx As New ServerTextControl()
    tx.Create()

    Dim loadSettings As New LoadSettings()
    loadSettings.ApplicationFieldFormat = ApplicationFieldFormat.MSWord
    tx.Load("https://example.com/invoice", StreamType.HTMLFormat, loadSettings)

    Dim saveSettings As New SaveSettings()
    saveSettings.PDFAConformance = PDFAConformance.PDFa1b
    tx.Save("output.pdf", StreamType.AdobePDF, saveSettings)
End Using
$vbLabelText   $csharpLabel

IronPDF方法

IronPDF 提供原生的 URL 渲染,透過其 Chromium 引擎執行 JavaScript 並應用所有樣式:

var renderer = new ChromePdfRenderer();

// PDF/A compliance - simple property
renderer.RenderingOptions.PdfAFormat = PdfAVersions.PdfA1B;

var pdf = renderer.RenderUrlAsPdf("https://example.com/invoice");
pdf.SaveAs("output.pdf");
var renderer = new ChromePdfRenderer();

// PDF/A compliance - simple property
renderer.RenderingOptions.PdfAFormat = PdfAVersions.PdfA1B;

var pdf = renderer.RenderUrlAsPdf("https://example.com/invoice");
pdf.SaveAs("output.pdf");
Dim renderer = New ChromePdfRenderer()

' PDF/A compliance - simple property
renderer.RenderingOptions.PdfAFormat = PdfAVersions.PdfA1B

Dim pdf = renderer.RenderUrlAsPdf("https://example.com/invoice")
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

RenderUrlAsPdf 方法 捕捉完整的渲染頁面,包括動態生成的內容,非常適合使用 React、Angular 或 Vue.js 等框架構建的現代 Web 應用程式。

頁面設置與配置

配置頁面尺寸、邊距和方向顯示了不同的文件設置方法。

TextControl 實現

TextControl 使用基於區段的頁面設置,測量單位為 TWIPS:

using (ServerTextControl tx = new ServerTextControl())
{
    tx.Create();
    tx.Load(html, StreamType.HTMLFormat);

    // Complex page settings through sections
    foreach (Section section in tx.Sections)
    {
        section.Format.PageSize = PageSize.A4;
        section.Format.PageMargins = new PageMargins(
            1440, 1440, 1440, 1440); // TWIPS
        section.Format.Landscape = true;
    }

    tx.Save("output.pdf", StreamType.AdobePDF);
}
using (ServerTextControl tx = new ServerTextControl())
{
    tx.Create();
    tx.Load(html, StreamType.HTMLFormat);

    // Complex page settings through sections
    foreach (Section section in tx.Sections)
    {
        section.Format.PageSize = PageSize.A4;
        section.Format.PageMargins = new PageMargins(
            1440, 1440, 1440, 1440); // TWIPS
        section.Format.Landscape = true;
    }

    tx.Save("output.pdf", StreamType.AdobePDF);
}
Imports TXTextControl

Using tx As New ServerTextControl()
    tx.Create()
    tx.Load(html, StreamType.HTMLFormat)

    ' Complex page settings through sections
    For Each section As Section In tx.Sections
        section.Format.PageSize = PageSize.A4
        section.Format.PageMargins = New PageMargins(1440, 1440, 1440, 1440) ' TWIPS
        section.Format.Landscape = True
    Next

    tx.Save("output.pdf", StreamType.AdobePDF)
End Using
$vbLabelText   $csharpLabel

IronPDF實施

IronPDF 將頁面設置集中在 RenderingOptions 中,具有直觀的毫米為基礎的測量單位:

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 25;
renderer.RenderingOptions.MarginRight = 25;

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginLeft = 25;
renderer.RenderingOptions.MarginRight = 25;

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Dim renderer = New ChromePdfRenderer()

renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
renderer.RenderingOptions.MarginTop = 25 ' mm
renderer.RenderingOptions.MarginBottom = 25
renderer.RenderingOptions.MarginLeft = 25
renderer.RenderingOptions.MarginRight = 25

Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

密碼保護與安全性

兩個程式庫都支援 PDF 安全功能,但 API 模式不同。

TextControl 實現

using (ServerTextControl tx = new ServerTextControl())
{
    tx.Create();
    tx.Load(html, StreamType.HTMLFormat);

    SaveSettings saveSettings = new SaveSettings();
    saveSettings.UserPassword = "user123";
    saveSettings.MasterPassword = "owner456";

    tx.Save("protected.pdf", StreamType.AdobePDF, saveSettings);
}
using (ServerTextControl tx = new ServerTextControl())
{
    tx.Create();
    tx.Load(html, StreamType.HTMLFormat);

    SaveSettings saveSettings = new SaveSettings();
    saveSettings.UserPassword = "user123";
    saveSettings.MasterPassword = "owner456";

    tx.Save("protected.pdf", StreamType.AdobePDF, saveSettings);
}
Imports ServerTextControlNamespace

Using tx As New ServerTextControl()
    tx.Create()
    tx.Load(html, StreamType.HTMLFormat)

    Dim saveSettings As New SaveSettings()
    saveSettings.UserPassword = "user123"
    saveSettings.MasterPassword = "owner456"

    tx.Save("protected.pdf", StreamType.AdobePDF, saveSettings)
End Using
$vbLabelText   $csharpLabel

IronPDF實施

IronPDF 透過 SecuritySettings 屬性提供詳細的安全控制:

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);

pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;

pdf.SaveAs("protected.pdf");
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);

pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;

pdf.SaveAs("protected.pdf");
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)

pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.OwnerPassword = "owner456"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights

pdf.SaveAs("protected.pdf")
$vbLabelText   $csharpLabel

當團隊考慮 TextControl 的替代方案時

幾個場景通常促使開發團隊評估 TextControl 的替代方案:

成本優化

由於 TextControl 授權起價為每位開發者 $3,398+,並且需要 40% 的年度續約,三年的總擁有成本超過每位開發者 $5,750+。 主要專注於 PDF 生成的團隊通常發現當替代方案存在時,很難證明這一價格合理,因為替代方案的成本明顯較低。

硬體相容性考量

已記錄的 Intel Iris Xe Graphics 錯誤影響第11代 Intel處理器,TextControl 部署需要註冊表解決方法。IronPDF的基於Chromium的渲染完全消除了這些硬體特定的渲染問題。

PDF 首要需求

當 PDF 生成而非文件編輯是主要使用情境時,TextControl 的文字處理器架構引入了不必要的複雜性。 不需要 DOCX 編輯能力或嵌入式 UI 控件的應用程式受益於IronPDF的專注 PDF 首要設計。

現代網路技術整合

TextControl 對 CSS 和 JavaScript 的有限支援為使用當代前端框架的應用程式帶來挑戰。IronPDF提供完整的HTML5、CSS3和ES2024 JavaScript 支援,以確保現代網頁內容的準確渲染。

簡化部署

TextControl 的 ServerTextControl 上下文管理和 UI 元件相依性增加了部署複雜性。IronPDF作為一個自包含的 NuGet 封裝運行,無需外部依賴或複雜的初始化模式。

模板和郵件合併替代方案

TextControl 的專有郵件合併系統使用具有合併欄位的 DOCX 模板。IronPDF使用標準 HTML 模板方法取代此功能:

// Use standard C# string interpolation
var data = new { CustomerName = "John Doe", InvoiceNumber = "12345", Total = "$1,500.00" };

var html = $@"
<html>
<head>
    <style>
        body {{font-family: Arial; padding: 40px;}}
        h1 {{color: #333;}}
        .total {{font-size: 24px; color: green;}}
    </style>
</head>
<body>
    <h1>Invoice #{data.InvoiceNumber}</h1>
    <p>Customer: {data.CustomerName}</p>
    <p class='total'>Total: {data.Total}</p>
</body>
</html>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
// Use standard C# string interpolation
var data = new { CustomerName = "John Doe", InvoiceNumber = "12345", Total = "$1,500.00" };

var html = $@"
<html>
<head>
    <style>
        body {{font-family: Arial; padding: 40px;}}
        h1 {{color: #333;}}
        .total {{font-size: 24px; color: green;}}
    </style>
</head>
<body>
    <h1>Invoice #{data.InvoiceNumber}</h1>
    <p>Customer: {data.CustomerName}</p>
    <p class='total'>Total: {data.Total}</p>
</body>
</html>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");
Imports IronPdf

Dim data = New With {.CustomerName = "John Doe", .InvoiceNumber = "12345", .Total = "$1,500.00"}

Dim html = $"
<html>
<head>
    <style>
        body {{font-family: Arial; padding: 40px;}}
        h1 {{color: #333;}}
        .total {{font-size: 24px; color: green;}}
    </style>
</head>
<body>
    <h1>Invoice #{data.InvoiceNumber}</h1>
    <p>Customer: {data.CustomerName}</p>
    <p class='total'>Total: {data.Total}</p>
</body>
</html>"

Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
$vbLabelText   $csharpLabel

對於更複雜的模板情境,IronPDF 整合了 Razor 引擎和其他模板框架。 請參閱 Razor 模板整合指南 ,以獲取詳細的實施模式。

.NET相容性和未來準備

兩個程式庫都支持當前的.NET實施。IronPDF保持積極地開發,提供定期更新,確保與 .NET 8、.NET 9 和即將於 2026 年推出的 .NET 10 相容。 該程式庫的 async/await 支援貫穿其 API,符合現代 C# 開發 做法,包括 C# 13 可用的功能和預期的 C# 14 功能。

額外的 PDF 功能

除了生成之外,IronPDF還提供文件操作功能,擴展了其效用:

結論

儘管 TX Text Control 和IronPDF均可生成 PDF 輸出,但它們服務的主要目的不同。 TextControl 作為全面的文件編輯器而優秀,具有 DOCX 操作和嵌入式 UI 控件,非常適合需要豐富文字編輯介面以及文件匯出功能的應用程式。

IronPDF 專注於從 HTML 和網頁內容生成 PDF,為需要從 HTML、URL 或動態生成內容轉換為 PDF 的開發人員提供精簡的解決方案,無需全套的文件編輯基礎設施。 其基於Chromium的渲染確保像素完美的輸出匹配瀏覽器顯示,而其API設計則優先考慮簡單性和與標準Web開發工作流程整合。

它們之間的選擇取決於專案需求:全面的文件編輯與PDF匯出偏好TextControl,而簡單地從網頁內容生成PDF則符合IronPDF的優勢。 對於目前主要使用 TextControl 進行 PDF 生成的團隊而言,評估IronPDF可能會發現顯著的成本降低和簡化的部署機會,而不需犧牲 PDF 的質量。

如需額外的實施指南,請探索IronPDF文件教程,涵蓋特定用例和高級功能。

請注意Text Control 是其各自所有者的註冊商標。 本網站與 Text Control 無關,不受其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開的資訊。)}