VectSharp與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 | 沒有 | 有 |
| 分割PDF | 沒有 | 有 |
| 水印 | 手動 | 內建 |
| 標頭/頁腳 | 每頁手動 | 自動 |
| 密碼保護 | 沒有 | 有 |
| 數位簽名 | 沒有 | 有 |
| 學習曲線 | 高(坐標) | 低(HTML/CSS) |
| 代碼冗長度 | 非常高 | Low |
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()
{
//VectSharpdoesn'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()
{
//VectSharpdoesn'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此方法需要了解座標系統、點測量以及為每個文本元素、形狀和圖形進行明確定位。
IronPDF基於HTML的方法
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 ClassCSS屬性如border-radius: 50%創建圓形,而標準HTML/CSS定位則處理佈局。 對於複雜的向量圖形,IronPDF在HTML中直接支持內嵌SVG元素。
多頁文件創建
創建多頁文件展示了每個程式庫處理分頁的方法。
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 page-break規則自動處理分頁:
// 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 在<div> |
graphics.StrokeRectangle() | CSS border 在<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的實現需要明顯更多的代碼。 一份簡單的文件在HTML中只需5行代碼,而在VectSharp中可能需要50多行的繪圖代碼,每行均需指定精確的座標、顏色和字體。
現代網頁技術支持
VectSharp無法呈現CSS3布局(Flexbox,Grid),執行JavaScript,或支持現代網頁字體。 使用當代網頁設計的團隊發現,通過手動繪製重現這些佈局是不切實際的。
PDF功能要求
VectSharp僅專注於通過向量圖形創建PDF。 需要PDF操作(合并、拆分)、數位簽名、密碼保護或自動頁眉/頁腳的團隊需增加額外的程式庫,或考慮像IronPDF這樣原生提供這些功能的替代方案。
VectSharp的獨特優勢
VectSharp在特定情況下具有優勢:
科學視覺化的精確
對於生成科學圖形、技術圖紙或數學圖的應用程式,VectSharp的基於座標的方法提供像素級控制,這是HTML/CSS佈局無法完全匹敵的。
開源授權
VectSharp在LGPL下釋出,允許在不需要商業授權費用的情況下整合——這是對於開源項目或有嚴格授權政策的組織的重要考量。
輕量級依賴
與IronPDF的基於Chromium的渲染引擎相比,VectSharp具有最小的依賴性,這使其可能更適合於資源受限的部署環境。
額外的IronPDF功能
除了基本的PDF生成外,IronPDF提供了VectSharp無法提供的文件操作功能:
.NET兼容性和未來準備
兩個程式庫都支持當前的.NET實現。 IronPDF持續活躍開發並定期更新,確保與.NET 8,.NET 9的兼容性,以及未來包括預計2026年推出的.NET 10版本的兼容性。 程式庫在其API中全面支持async/await,符合包括預期於C# 14中推出的現代C#開發實踐。
結論
雖然VectSharp和IronPDF都生成PDF輸出,但它們的本質目的截然不同。 VectSharp擅長作為科學可視化、技術圖紙及需像素級精確座標繪圖的應用程式的向量圖形程式庫。 其LGPL授權和輕量級足迹使其對於特定使用案例很有吸引力,這些使用案例中,精確的圖形控制比文件的複雜性更為重要。
IronPDF專注於從HTML內容生成文檔,為需要將網頁內容、模板或動態生成HTML轉換為PDF的開發人員提供一個流暢的解決方案。 其基於Chromium的渲染確保準確再現現代網頁設計,API的設計優先考慮簡單性和與標準網頁開發工作流的整合。
在它們之間的選擇取決於項目需求:科學可視化和精確圖形偏好VectSharp,而從網頁內容生成文檔則與IronPDF的優勢一致。 對於當前使用VectSharp但在文件生成複雜性上掙扎的團隊,評估IronPDF可以揭示顯著減少代碼量和提高可維護性的潛力。
欲瞭解更多實施指導,請探索IronPDF文檔和教程,涵蓋具體使用案例和高級功能。
