在 ASP.NET Core MVC 中使用 IronPDF 將 CSHTML 轉換為 PDF
從PDFView4NET遷移到IronPDF將您的PDF工作流程從WinForms/WPF查看元件轉變為無頭的PDF生成和操作程式庫。 本指南提供逐步遷移路徑,可實現伺服器端處理、Web應用程式支援以及超出PDFView4NET的查看/渲染/列印範圍的更廣泛PDF生命週期管理。
為什麼從PDFView4NET遷移到IronPDF
了解PDFView4NET
PDFView4NET(O2 Solutions,o2sol.com)是一個適用於WinForms和WPF應用程式的查看/渲染/列印工具包。 它以兩個NuGet封裝形式提供——O2S.Components.PDFView4NET.WPF——並包括其自己的PDF渲染引擎。O2 Solutions出售一個單獨的程式庫PDF4NET用於程式化生成/操作; 本指南僅涵蓋PDFView4NET。
需要生成PDF、HTML轉PDF渲染或伺服器端工作流的團隊通常會將PDFView4NET與其他程式庫搭配使用,或直接遷移到像IronPDF這樣的工具包,涵蓋生成和操作以及無頭部署場景。
查看 / 渲染 / 列印範圍
PDFView4NET圍繞顯示、渲染和列印PDF以及註釋和表單填寫構建。 遷移的常見原因:
-
著重查看/渲染/列印:PDFView4NET載入現有PDF以供顯示、列印或圖像渲染。 它不會從HTML或URL生成PDF。
-
UI框架依賴性:以WinForms和WPF版本分發; 兩者都針對Windows桌面,這限制了在控制台工作者或伺服器端主機上的使用。
-
無HTML轉PDF:
O2S.Components.PDFView4NET中不存在。 -
操作有限:操作集中在註釋和表單欄位上,而不是完整內容創作。
-
無Linux/Docker/伺服器路徑:該工具包僅通過WinForms/WPF支援Windows,並不設計用於Linux上的ASP.NET主機或容器工作負載。
- 活躍,但範圍狹隘:O2 Solutions仍然提供版本; 產品得到維護,但其範圍有意地狹窄。
PDFView4NET與IronPDF比較
| 功能 | PDFView4NET | IronPDF |
|---|---|---|
| 主要重點 | PDF查看 | 完整PDF解決方案(建立、查看、編輯) |
| 需要UI框架 | WinForms,WPF | None |
| PDF建立 | 否 | 是 |
| PDF 操作 | 有限(註釋) | 是 |
| 伺服器端 | 不支持 | 完全支援 |
| Web應用程式 | 否 | 是 |
| 控制台應用程式 | 有限 | 完全支援 |
| Azure/Docker | 否 | 是 |
| HTML 到 PDF | 否 | 是 |
| 跨平台環境 | 否 | 是 |
| 整合便利性 | 中 | 高 |
IronPDF涵蓋PDF的建立、操作和渲染,超越PDFView4NET的查看/渲染/列印範圍,解決超出查看/渲染/列印範圍的需求。
IronPDF還是與環境無關的——它可以運行在Windows、Linux、macOS、Docker和Azure上的Web應用、服務和控制台應用,這對需要跨平台支援或伺服器端託管的專案來說很重要。
開始之前
前提條件
- .NET環境:.NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet存取: 有能力安裝NuGet套件
- IronPDF授權: 從ironpdf.com獲取您的授權金鑰
NuGet包變更
<PackageReference Include="O2S.Components.PDFView4NET.Win" Version="*" Remove />
<PackageReference Include="IronPdf" Version="*" />
<PackageReference Include="O2S.Components.PDFView4NET.Win" Version="*" Remove />
<PackageReference Include="IronPdf" Version="*" />
或透過CLI:
dotnet remove package O2S.Components.PDFView4NET.Win
# (use O2S.Components.PDFView4NET.WPF for theWPF edition)
dotnet add package IronPdf
dotnet remove package O2S.Components.PDFView4NET.Win
# (use O2S.Components.PDFView4NET.WPF for theWPF edition)
dotnet add package IronPdf
授權配置
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整API參考
名稱空間變更
// Before: PDFView4NET
using O2S.Components.PDFView4NET;
// After: IronPDF
using IronPdf;
// Before: PDFView4NET
using O2S.Components.PDFView4NET;
// After: IronPDF
using IronPdf;
Imports IronPdf
核心API對應
| PDFView4NET | IronPDF |
|---|---|
new PDFDocument(); doc.Load(path) |
PdfDocument.FromFile(path) |
new PDFDocument(); doc.Load(stream) |
PdfDocument.FromStream(stream) |
document.Pages[index] |
pdf.Pages[index] |
document.PageCount |
pdf.PageCount |
document.Print(...) |
pdf.Print() |
document.Close() |
pdf.Dispose() |
| 在PDFView4NET中不可用 | ChromePdfRenderer (HTML轉PDF) |
| 在PDFView4NET中不可用 | PdfDocument.Merge() |
| 在PDFView4NET中不可用 | pdf.ApplyWatermark() |
document.SecurityManager |
pdf.SecuritySettings |
程式碼遷移範例
範例1:URL轉PDF
之前(PDFView4NET):
// NuGet: Install-Package O2S.Components.PDFView4NET.Win
using O2S.Components.PDFView4NET;
using System;
class Program
{
static void Main()
{
// PDFView4NET cannot fetch a URL and emit a PDF; it can only consume one.
PDFDocument document = new PDFDocument();
document.Load("input.pdf");
Console.WriteLine($"Loaded {document.PageCount} page(s) for view/print.");
document.Close();
}
}
// NuGet: Install-Package O2S.Components.PDFView4NET.Win
using O2S.Components.PDFView4NET;
using System;
class Program
{
static void Main()
{
// PDFView4NET cannot fetch a URL and emit a PDF; it can only consume one.
PDFDocument document = new PDFDocument();
document.Load("input.pdf");
Console.WriteLine($"Loaded {document.PageCount} page(s) for view/print.");
document.Close();
}
}
Imports O2S.Components.PDFView4NET
Imports System
Class Program
Shared Sub Main()
' PDFView4NET cannot fetch a URL and emit a PDF; it can only consume one.
Dim document As New PDFDocument()
document.Load("input.pdf")
Console.WriteLine($"Loaded {document.PageCount} page(s) for view/print.")
document.Close()
End Sub
End Class
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("output.pdf")
End Sub
End Class
PDFView4NET沒有HTML/URL渲染介面——O2S.Components.PDFView4NET中不存在,因此URL必須先通過其他工具渲染為PDF,然後載入以供查看/列印。 IronPDF使用單一SaveAs() save。 查看更多HTML到PDF文件以獲得完整的範例。
範例2:HTML字串轉PDF
之前(PDFView4NET):
// NuGet: Install-Package O2S.Components.PDFView4NET.Win
using O2S.Components.PDFView4NET;
using System;
class Program
{
static void Main()
{
// The HTML string cannot be rendered by PDFView4NET. Assume an upstream
// tool produced "document.pdf"; PDFView4NET can then display or print it.
PDFDocument document = new PDFDocument();
document.Load("document.pdf");
Console.WriteLine($"Document ready for viewing — {document.PageCount} page(s).");
document.Close();
}
}
// NuGet: Install-Package O2S.Components.PDFView4NET.Win
using O2S.Components.PDFView4NET;
using System;
class Program
{
static void Main()
{
// The HTML string cannot be rendered by PDFView4NET. Assume an upstream
// tool produced "document.pdf"; PDFView4NET can then display or print it.
PDFDocument document = new PDFDocument();
document.Load("document.pdf");
Console.WriteLine($"Document ready for viewing — {document.PageCount} page(s).");
document.Close();
}
}
Imports O2S.Components.PDFView4NET
Imports System
Class Program
Shared Sub Main()
' The HTML string cannot be rendered by PDFView4NET. Assume an upstream
' tool produced "document.pdf"; PDFView4NET can then display or print it.
Dim document As New PDFDocument()
document.Load("document.pdf")
Console.WriteLine($"Document ready for viewing — {document.PageCount} page(s).")
document.Close()
End Sub
End Class
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("document.pdf");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("document.pdf")
End Sub
End Class
O2S.Components.PDFView4NET中不存在,因此HTML字串必須先作為PDF產出然後載入到查看器中。 IronPDF直接通過PdfDocument。 在我們的教程中了解更多。
範例3:從PDF中提取文字
之前(PDFView4NET):
// NuGet: Install-Package O2S.Components.PDFView4NET.Win
using O2S.Components.PDFView4NET;
using System;
using System.IO;
class Program
{
static void Main()
{
using (FileStream fs = File.OpenRead("document.pdf"))
{
PDFDocument document = new PDFDocument();
document.Load(fs);
string text = "";
for (int i = 0; i < document.PageCount; i++)
{
text += document.Pages[i].ExtractText();
}
Console.WriteLine(text);
document.Close();
}
}
}
// NuGet: Install-Package O2S.Components.PDFView4NET.Win
using O2S.Components.PDFView4NET;
using System;
using System.IO;
class Program
{
static void Main()
{
using (FileStream fs = File.OpenRead("document.pdf"))
{
PDFDocument document = new PDFDocument();
document.Load(fs);
string text = "";
for (int i = 0; i < document.PageCount; i++)
{
text += document.Pages[i].ExtractText();
}
Console.WriteLine(text);
document.Close();
}
}
}
Imports O2S.Components.PDFView4NET
Imports System
Imports System.IO
Class Program
Shared Sub Main()
Using fs As FileStream = File.OpenRead("document.pdf")
Dim document As New PDFDocument()
document.Load(fs)
Dim text As String = ""
For i As Integer = 0 To document.PageCount - 1
text &= document.Pages(i).ExtractText()
Next
Console.WriteLine(text)
document.Close()
End Using
End Sub
End Class
之後(IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
Console.WriteLine(text);
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim text As String = pdf.ExtractAllText()
Console.WriteLine(text)
End Sub
End Class
此範例突顯出顯著的API差異。 PDFView4NET需要建立一個Pages[i].ExtractText()以獲得每頁內容。
IronPDF大幅簡化這一過程:ExtractAllText()從所有頁面提取文字,僅需一次方法呼叫。 無需手動流管理,無需迴圈,無需字串連接——只需兩行程式碼。
關鍵遷移注意事項
HTML渲染介面
PDFView4NET沒有HTML轉PDF API。 IronPDF引入ChromePdfRenderer用於HTML/URL輸入:
// IronPDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// or: renderer.RenderUrlAsPdf(url);
pdf.SaveAs("output.pdf");
// IronPDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
// or: renderer.RenderUrlAsPdf(url);
pdf.SaveAs("output.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
' or: renderer.RenderUrlAsPdf(url)
pdf.SaveAs("output.pdf")
文件載入更改
// PDFView4NET: instantiate then Load(path) or Load(stream)
PDFDocument document = new PDFDocument();
document.Load("document.pdf");
// IronPDF: Direct file path
var pdf = PdfDocument.FromFile("document.pdf");
// PDFView4NET: instantiate then Load(path) or Load(stream)
PDFDocument document = new PDFDocument();
document.Load("document.pdf");
// IronPDF: Direct file path
var pdf = PdfDocument.FromFile("document.pdf");
' PDFView4NET: instantiate then Load(path) or Load(stream)
Dim document As New PDFDocument()
document.Load("document.pdf")
' IronPDF: Direct file path
Dim pdf = PdfDocument.FromFile("document.pdf")
頁面存取變更
// PDFView4NET: document.PageCount and document.Pages[i]
for (int i = 0; i < document.PageCount; i++)
{
document.Pages[i].ExtractText();
}
// IronPDF: pdf.PageCount and Pages[i] or ExtractAllText()
string text = pdf.ExtractAllText();
// Or per-page: pdf.ExtractTextFromPage(0);
// PDFView4NET: document.PageCount and document.Pages[i]
for (int i = 0; i < document.PageCount; i++)
{
document.Pages[i].ExtractText();
}
// IronPDF: pdf.PageCount and Pages[i] or ExtractAllText()
string text = pdf.ExtractAllText();
// Or per-page: pdf.ExtractTextFromPage(0);
Imports PDFView4NET
Imports IronPDF
' PDFView4NET: document.PageCount and document.Pages(i)
For i As Integer = 0 To document.PageCount - 1
document.Pages(i).ExtractText()
Next
' IronPDF: pdf.PageCount and Pages(i) or ExtractAllText()
Dim text As String = pdf.ExtractAllText()
' Or per-page: pdf.ExtractTextFromPage(0)
保存方法更改
// PDFView4NET has no save-from-HTML path; saving applies after edits on a loaded document.
// IronPDF: SaveAs()
pdf.SaveAs("output.pdf");
// PDFView4NET has no save-from-HTML path; saving applies after edits on a loaded document.
// IronPDF: SaveAs()
pdf.SaveAs("output.pdf");
遷移後的新能力
遷移到IronPDF後,您將獲得PDFView4NET無法提供的功能:
PDF合併
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
Dim pdf1 = PdfDocument.FromFile("chapter1.pdf")
Dim pdf2 = PdfDocument.FromFile("chapter2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("complete_book.pdf")
使用HTML的水印
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(@"
<div style='
font-size: 72pt;
color: rgba(255, 0, 0, 0.2);
transform: rotate(-45deg);
'>
CONFIDENTIAL
</div>");
pdf.SaveAs("watermarked.pdf");
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(@"
<div style='
font-size: 72pt;
color: rgba(255, 0, 0, 0.2);
transform: rotate(-45deg);
'>
CONFIDENTIAL
</div>");
pdf.SaveAs("watermarked.pdf");
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("
<div style='
font-size: 72pt;
color: rgba(255, 0, 0, 0.2);
transform: rotate(-45deg);
'>
CONFIDENTIAL
</div>")
pdf.SaveAs("watermarked.pdf")
密碼保護
var pdf = PdfDocument.FromFile("document.pdf");
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("protected.pdf");
var pdf = PdfDocument.FromFile("document.pdf");
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user456";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SaveAs("protected.pdf");
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.SecuritySettings.OwnerPassword = "owner123"
pdf.SecuritySettings.UserPassword = "user456"
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SaveAs("protected.pdf")
表單填寫
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.FindFormField("FirstName").Value = "John";
pdf.Form.FindFormField("LastName").Value = "Doe";
pdf.SaveAs("filled_form.pdf");
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.FindFormField("FirstName").Value = "John";
pdf.Form.FindFormField("LastName").Value = "Doe";
pdf.SaveAs("filled_form.pdf");
Dim pdf = PdfDocument.FromFile("form.pdf")
pdf.Form.FindFormField("FirstName").Value = "John"
pdf.Form.FindFormField("LastName").Value = "Doe"
pdf.SaveAs("filled_form.pdf")
伺服器端處理
PDFView4NET無法在伺服器環境中運行。 IronPDF在此處表現出色:
// ASP.NET Core
[HttpGet]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(GetReportHtml());
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
// ASP.NET Core
[HttpGet]
public IActionResult GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(GetReportHtml());
return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
<HttpGet>
Public Function GeneratePdf() As IActionResult
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(GetReportHtml())
Return File(pdf.BinaryData, "application/pdf", "report.pdf")
End Function
功能比較總結
| 功能 | PDFView4NET | IronPDF |
|---|---|---|
| 查看PDF | 是(UI) | 否(用查看器) |
| 載入PDF | 是 | 是 |
| 保存PDF | 有限 | 是 |
| HTML轉PDF | 否 | 是 |
| URL到PDF | 否 | 是 |
| 合併PDF | 否 | 是 |
| 拆分PDF | 有限 | 是 |
| 浮水印 | 否 | 是 |
| 頁眉/頁腳 | 否 | 是 |
| 密碼保護 | 否 | 是 |
| 數位簽名 | 否 | 是 |
| 文字提取 | 有限 | 是 |
| 填寫表單 | 有限 | 是 |
| WinForms | 是 | 是 |
| WPF | 是 | 是 |
| 控制台 | 有限 | 是 |
| ASP.NET | 否 | 是 |
| Azure | 否 | 是 |
| Docker | 否 | 是 |
遷移檢查表
遷移前
- 確定查看需求(確定IronPDF的功能是否可以替代基於UI的PDF查看)
- 文件列印工作流
- 列出PDF操作需求
- 視需要計劃查看器替換(IronPDF專注於生成/操作)
- 獲取IronPDF授權金鑰來自ironpdf.com
套件變更
- 移除
.WPF)NuGet包 - 安裝
dotnet add package IronPdf
程式碼變更
- 更新名稱空間導入(
using O2S.Components.PDFView4NET;→using IronPdf;) - 引入
ChromePdfRenderer用於所有HTML或URL輸入(無PDFView4NET等效項) - 替換
new PDFDocument(); document.Load(path)withPdfDocument.FromFile(path) - 替換
new PDFDocument(); document.Load(stream)withPdfDocument.FromStream(stream) - 替換手動
for (int i = 0; i < document.PageCount; i++)(orpdf.ExtractTextFromPage(i)) - 用
using區塊) - 在應用程式啟動時新增授權初始化
遷移後
- 測試PDF載入和保存
- 驗證文字提取功能
- 測試 HTML 到 PDF 的轉換
- 驗證伺服器部署是否正常工作(新功能)
- 視需要測試跨平台(新功能)
- 如果僅伺服器,移除UI特定的PDF程式碼

