比較

QuestPDF與IronPDF:技術比較指南

當.NET開發者需要建立PDF文件時,他們會遇到設計哲學根本不同的程式庫。 VectSharp和IronPDF代表兩種不同的PDF生成方法:一種專注於向量圖形和科學可視化,另一種專注於從HTML內容生成文件。 本技術比較考量兩個程式庫,以幫助架構師和開發者選擇適合其特定需求的工具。

理解VectSharp

VectSharp是一個向量圖形程式庫,旨在讓開發者建立複雜的向量圖並將其匯出為PDF檔案。 與專注於文件建立的傳統PDF程式庫不同,VectSharp專長於處理向量圖形,使其特別適合需要高精度圖形應用,如科學可視化、圖表和技術插圖。

該程式庫通過基於座標的API進行PDF生成,開發者可以使用X,Y精確座標來定位每個元素:

  • 科學專注: 主要為資料可視化、繪圖和圖形建立而設計
  • 基於座標的繪圖: 所有元素都需從左上角原點使用點數進行明確定位
  • 圖形優先範式: 為科學家建立圖表和繪圖而設計,而非商業文件
  • 開放原始碼: 在LGPL協議下發布,允許無需商業授權即可進行定制

VectSharp限制

VectSharp的專門焦點為一般文件生成引入了限制:

  • 無HTML支援: 無法將HTML或CSS轉換為PDF—需要手動向量繪圖處理所有內容
  • 無CSS樣式: 所有樣式必須以程式方式實施
  • 無JavaScript執行: 無法呈現動態網頁內容
  • 無自動文字排版: 無文字換行、分頁或流佈局—開發者必須手動管理所有內容
  • 手動頁面管理: 每個頁面必須明確建立並管理

了解IronPDF

IronPDF採取文件專注的方法,使用HTML作為PDF生成的通用文件格式。 IronPDF不用需要基於座標的定位,而是使用現代Chromium引擎透過HTML內容來呈現,完全支援CSS3和JavaScript。

關鍵特性包括:

  • 文件專註架構: 設計用於可靠的文件生成,包括發票、報告和內容豐富的文件
  • HTML優先方法: 使用開發人員已經知曉的網頁技術—HTML、CSS和JavaScript
  • Chromium呈現引擎: 支援現代CSS3、Flexbox、Grid和ES6+ JavaScript
  • 自動佈局: 自動處理文字換行、分頁和流佈局
  • 商業支援: 穩定的更新、支持和企業級功能

功能比較

下表突出顯示VectSharp和IronPDF之間的基本差異:

功能VectSharpIronPDF
主要用途向量圖形文件建立
PDF輸出
HTML支援
授權LGPL(開放原始碼)商業
最佳用途科學可視化一般PDF文件
客製化僅限於圖形廣泛的、與文件相關的
CSS支援完全支持 CSS3
JavaScript完整的ES6+
自動佈局
自動分頁符號
文字換行手動自動
表格手動繪圖HTML <table>
合併 PDF s
分割 PDF s
水印手動內建支持
頁眉/頁腳每頁手動自動
密碼保護
數位簽名
學習曲線高(座標)低(HTML/CSS)
程式碼冗長非常高

API 架構差異

在檢查每個庫建立PDF內容的方式時,VectSharp和IronPDF的架構差異立即顯示出來。

VectSharp座標基礎方法

VectSharp要求開發人員建立Document和Page物件,然後使用Graphics方法並指定座標來繪製每個元素:

// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using VectSharp.SVG;
using System.IO;

class Program
{
    static void Main()
    {
        // VectSharp doesn't directly support HTML to PDF
        // It requires manual creation of graphics objects
        Document doc = new Document();
        Page page = new Page(595, 842); // A4 size
        Graphics graphics = page.Graphics;

        graphics.FillText(100, 100, "Hello from VectSharp", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));

        doc.Pages.Add(page);
        doc.SaveAsPDF("output.pdf");
    }
}
// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using VectSharp.SVG;
using System.IO;

class Program
{
    static void Main()
    {
        // VectSharp doesn't directly support HTML to PDF
        // It requires manual creation of graphics objects
        Document doc = new Document();
        Page page = new Page(595, 842); // A4 size
        Graphics graphics = page.Graphics;

        graphics.FillText(100, 100, "Hello from VectSharp", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));

        doc.Pages.Add(page);
        doc.SaveAsPDF("output.pdf");
    }
}
Imports VectSharp
Imports VectSharp.PDF
Imports VectSharp.SVG
Imports System.IO

Module Program
    Sub Main()
        ' VectSharp doesn't directly support HTML to PDF
        ' It requires manual creation of graphics objects
        Dim doc As New Document()
        Dim page As New Page(595, 842) ' A4 size
        Dim graphics As Graphics = page.Graphics

        graphics.FillText(100, 100, "Hello from VectSharp", 
            New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24))

        doc.Pages.Add(page)
        doc.SaveAsPDF("output.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

這種方法需要了解座標系統、點測量和對每個文字元素、形狀和圖形進行明確定位。

IronPDFHTML基礎方法

IronPDF使用熟悉的HTML和CSS,讓開發人員使用已知的網頁技術來建立文件:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is HTML content.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is HTML content.</p>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is HTML content.</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

ChromePdfRenderer類自動處理所有佈局、定位和分頁。 有關全面的HTML轉換指導,請參見HTML轉PDF教程

繪圖形狀和文字

建立視覺內容揭示了向量圖形程式設計和文件生成之間的範式差異。

VectSharp形狀繪製

VectSharp提供底層圖形原語,用於使用明確座標和GraphicsPath物件繪製形狀:

// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();
        Page page = new Page(595, 842);
        Graphics graphics = page.Graphics;

        // Draw rectangle
        graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255));

        // Draw circle
        GraphicsPath circle = new GraphicsPath();
        circle.Arc(400, 100, 50, 0, 2 * Math.PI);
        graphics.FillPath(circle, Colour.FromRgb(255, 0, 0));

        // Add text
        graphics.FillText(50, 200, "VectSharp Graphics", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 20));

        doc.Pages.Add(page);
        doc.SaveAsPDF("shapes.pdf");
    }
}
// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();
        Page page = new Page(595, 842);
        Graphics graphics = page.Graphics;

        // Draw rectangle
        graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255));

        // Draw circle
        GraphicsPath circle = new GraphicsPath();
        circle.Arc(400, 100, 50, 0, 2 * Math.PI);
        graphics.FillPath(circle, Colour.FromRgb(255, 0, 0));

        // Add text
        graphics.FillText(50, 200, "VectSharp Graphics", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 20));

        doc.Pages.Add(page);
        doc.SaveAsPDF("shapes.pdf");
    }
}
Imports VectSharp
Imports VectSharp.PDF
Imports System

Module Program
    Sub Main()
        Dim doc As New Document()
        Dim page As New Page(595, 842)
        Dim graphics As Graphics = page.Graphics

        ' Draw rectangle
        graphics.FillRectangle(50, 50, 200, 100, Colour.FromRgb(0, 0, 255))

        ' Draw circle
        Dim circle As New GraphicsPath()
        circle.Arc(400, 100, 50, 0, 2 * Math.PI)
        graphics.FillPath(circle, Colour.FromRgb(255, 0, 0))

        ' Add text
        graphics.FillText(50, 200, "VectSharp Graphics", 
            New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 20))

        doc.Pages.Add(page)
        doc.SaveAsPDF("shapes.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

此程式碼演示了VectSharp在精確向量圖形中的強大能力—每個元素都使用精確的像素座標進行定位,顏色程式生成,圓形等形狀需要構造具有弧形定義的GraphicsPath物件。

IronPDFHTML/CSS形狀

IronPDF使用標準HTML和CSS達到類似視覺效果:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <div style='width: 200px; height: 100px; background-color: blue; margin: 50px;'></div>
            <div style='width: 100px; height: 100px; background-color: red; 
                        border-radius: 50%; margin-left: 350px; margin-top: -50px;'></div>
            <h2 style='margin-left: 50px;'>IronPDF Graphics</h2>
        ";

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <div style='width: 200px; height: 100px; background-color: blue; margin: 50px;'></div>
            <div style='width: 100px; height: 100px; background-color: red; 
                        border-radius: 50%; margin-left: 350px; margin-top: -50px;'></div>
            <h2 style='margin-left: 50px;'>IronPDF Graphics</h2>
        ";

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

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()

        Dim html As String = "
            <div style='width: 200px; height: 100px; background-color: blue; margin: 50px;'></div>
            <div style='width: 100px; height: 100px; background-color: red; 
                        border-radius: 50%; margin-left: 350px; margin-top: -50px;'></div>
            <h2 style='margin-left: 50px;'>IronPDF Graphics</h2>
        "

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

border-radius: 50%的CSS屬性建立圓形,標準的HTML/CSS定位處理佈局。 對於複雜的向量圖形,IronPDF直接支援內嵌SVG元素在HTML中。

多頁文件建立

建立帶多頁的文件展示了每個程式庫如何處理分頁。

VectSharp手動頁面管理

VectSharp需要每頁的明確建立和管理:

// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();

        // Page 1
        Page page1 = new Page(595, 842);
        Graphics g1 = page1.Graphics;
        g1.FillText(50, 50, "Page 1", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g1.FillText(50, 100, "First page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page1);

        // Page 2
        Page page2 = new Page(595, 842);
        Graphics g2 = page2.Graphics;
        g2.FillText(50, 50, "Page 2", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g2.FillText(50, 100, "Second page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page2);

        doc.SaveAsPDF("multipage.pdf");
    }
}
// NuGet: Install-Package VectSharp.PDF
using VectSharp;
using VectSharp.PDF;
using System;

class Program
{
    static void Main()
    {
        Document doc = new Document();

        // Page 1
        Page page1 = new Page(595, 842);
        Graphics g1 = page1.Graphics;
        g1.FillText(50, 50, "Page 1", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g1.FillText(50, 100, "First page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page1);

        // Page 2
        Page page2 = new Page(595, 842);
        Graphics g2 = page2.Graphics;
        g2.FillText(50, 50, "Page 2", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24));
        g2.FillText(50, 100, "Second page content", 
            new Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14));
        doc.Pages.Add(page2);

        doc.SaveAsPDF("multipage.pdf");
    }
}
Imports VectSharp
Imports VectSharp.PDF
Imports System

Class Program
    Shared Sub Main()
        Dim doc As New Document()

        ' Page 1
        Dim page1 As New Page(595, 842)
        Dim g1 As Graphics = page1.Graphics
        g1.FillText(50, 50, "Page 1", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24))
        g1.FillText(50, 100, "First page content", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14))
        doc.Pages.Add(page1)

        ' Page 2
        Dim page2 As New Page(595, 842)
        Dim g2 As Graphics = page2.Graphics
        g2.FillText(50, 50, "Page 2", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 24))
        g2.FillText(50, 100, "Second page content", New Font(FontFamily.ResolveFontFamily(FontFamily.StandardFontFamilies.Helvetica), 14))
        doc.Pages.Add(page2)

        doc.SaveAsPDF("multipage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

每頁需要它自己的Page物件、Graphics上下文和每個文字元素的單獨FillText調用。 程式碼的冗長度隨著頁數和內容複雜性線性增加。

IronPDF自動分頁

IronPDF使用CSS分頁規則自動處理分頁:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <h1>Page 1</h1>
            <p>First page content</p>
            <div style='page-break-after: always;'></div>
            <h1>Page 2</h1>
            <p>Second page content</p>
        ";

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = @"
            <h1>Page 1</h1>
            <p>First page content</p>
            <div style='page-break-after: always;'></div>
            <h1>Page 2</h1>
            <p>Second page content</p>
        ";

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

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()

        Dim html As String = "
            <h1>Page 1</h1>
            <p>First page content</p>
            <div style='page-break-after: always;'></div>
            <h1>Page 2</h1>
            <p>Second page content</p>
        "

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

CSS page-break-after: always 指令告知Chromium渲染器建立新頁面。 當內容超過頁面邊界時,IronPDF還支援自動分頁—這是VectSharp完全不具備的能力。

API映射參考

評估從VectSharp過渡到IronPDF的團隊會發現這張映射有助於理解概念等價性:

VectSharpIronPDF
DocumentChromePdfRenderer
Page自動
GraphicsHTML/CSS
graphics.FillRectangle()CSS background-color on <div>
graphics.StrokeRectangle()CSS border on <div>
graphics.FillText()HTML文字元素
graphics.StrokePath()SVG或CSS邊框
GraphicsPathSVG <path>元素
Colour.FromRgb()CSS顏色值
Font / FontFamilyCSS font-family
doc.SaveAsPDF()pdf.SaveAs()
手動頁面大小RenderingOptions.PaperSize

當團隊考慮從VectSharp轉向IronPDF

幾種情況常常促使開發團隊評估IronPDF作為VectSharp的替代方案:

文件生成要求

VectSharp在科學可視化中表現出色,但對於一般文件建立變得不實用。 構建發票系統、報告生成器或內容管理平台的團隊發現,手動定位每個文字元素和形狀會產生HTML基礎方法完全避免的維護負擔。

HTML內容整合

需要將現有HTML模板、電子郵件內容或網頁轉換為PDF的應用程式無法使用VectSharp。該程式庫沒有HTML解析或呈現功能,無法用於內容來源為HTML的工作流程。

開發速度

VectSharp中的基於座標的API需要顯著更多的程式碼行數比等效的IronPDF實作。 一個簡單的文件可能需要5行HTML但可能需要50多行VectSharp繪圖程式碼,每行都需指定精確坐標、顏色和字體。

現代網路技術支援

VectSharp無法呈現CSS3佈局(Flexbox、Grid)、執行JavaScript或支援現代網路字體。 使用當代網路設計的團隊發現通過手動繪圖重現這些佈局是不實際的。

PDF特性需求

VectSharp僅專注於通過向量圖形進行PDF建立。 需要PDF操作(合併、拆分)、數位簽名、密碼保護或自動化頁眉/頁腳的團隊必須新增其他程式庫或考慮IronPDF等原生提供這些功能的替代方案。

獨特的VectSharp優勢

VectSharp在特定場景中保有優勢:

科學可視化精度

對於生成科學圖形、技術圖或數學圖的應用程式來說,VectSharp的基於坐標方法提供的像素級控制是HTML/CSS定位難以匹敵的。

開源授權

在LGPL下發布,VectSharp允許無需商業授權費用的整合—這對於開源專案或具有嚴格授權政策的組織來說是一個重要考量。

輕量級依賴性

與IronPDF的基於Chromium的渲染引擎相比,VectSharp具有較少的依賴性,這可能使其更適合於資源受限的部署環境。

IronPDF的額外功能

除了基本的PDF生成外,IronPDF還提供VectSharp無法提供的文件操作功能:

.NET相容性和未來準備

兩個程式庫都支持當前的.NET實施。 IronPDF保持積極的開發並定期更新,確保與.NET 8、.NET 9及包括預計在2026年發佈的.NET 10在內的未來版本的相容性。該程式庫在其API中全面支援async/await,符合現代C#開發實踐,包括預計在C# 14中推出的功能。

結論

VectSharp和IronPDF儘管都生成PDF輸出,但是用途根本不同。 VectSharp作為為科學可視化、技術圖和需要像素級精度的應用的向量圖形程式庫表現出色。 其LGPL授權和輕量化使其對於精確圖形控制比文件複雜性更重要的特定用途情境中具有吸引力。

IronPDF專註於從HTML內容生成文件,為那些需將網頁內容、模板或動態生成HTML轉換為PDF的開發者提供了簡化解決方案。 其基於Chromium的渲染確保了現代網頁設計的精確再現,而其API設計優先考慮了簡化和與標準網頁開發工作流的整合。

在它們之間的選擇取決於專案需求:科學可視化和精度圖像偏向於VectSharp,而從網頁內容生成文件與IronPDF的優勢相符。 對於目前使用VectSharp但對文件生成複雜性感到困惑的團隊,評估IronPDF可能揭示出大幅減少程式碼量和改善可維護性的機會。

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

請注意VectSharp 是其商標擁有者的註冊商標。 此網站與VectSharp無關,並未獲得其認可或贊助。所有產品名稱、徽標和品牌皆屬其各自擁有者。 比較僅供資訊參考,並反映了撰寫時公開的資訊。)}