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之間的基本差異:
| 功能 | VectSharp | IronPDF |
|---|---|---|
| 主要用途 | 向量圖形 | 文件建立 |
| 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這種方法需要了解座標系統、點測量和對每個文字元素、形狀和圖形進行明確定位。
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 ClassChromePdfRenderer類自動處理所有佈局、定位和分頁。 有關全面的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此程式碼演示了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如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每頁需要它自己的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 ClassCSS page-break-after: always 指令告知Chromium渲染器建立新頁面。 當內容超過頁面邊界時,IronPDF還支援自動分頁—這是VectSharp完全不具備的能力。
API映射參考
評估從VectSharp過渡到IronPDF的團隊會發現這張映射有助於理解概念等價性:
| VectSharp | IronPDF |
|---|---|
Document | ChromePdfRenderer |
Page | 自動 |
Graphics | HTML/CSS |
graphics.FillRectangle() | CSS background-color on <div> |
graphics.StrokeRectangle() | CSS border on <div> |
graphics.FillText() | HTML文字元素 |
graphics.StrokePath() | SVG或CSS邊框 |
GraphicsPath | SVG <path>元素 |
Colour.FromRgb() | CSS顏色值 |
Font / FontFamily | CSS 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文件和教程,涵蓋特定用例和高級功能。
