在 ASP.NET Core MVC 中将 CSHTML 转换为 PDF,使用 IronPDF
从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: 在
HtmlToPdfConverter或HTML渲染API。 -
限制的操作:操作集中在注释和表单字段而不是完整内容创作上。
-
无Linux/Docker/服务器路径:该工具包通过WinForms/WPF仅限于Windows,未设计用于Linux上的ASP.NET主机或容器工作负载。
- 活跃但范围狭窄:O2 Solutions仍发布版本; 产品得到维护,但其范围有意狭窄。
PDFView4NET与IronPDF对比
| 特征 | PDFView4NET | IronPDF |
|---|---|---|
| 主要关注点 | 查看 PDF | 完整的 PDF 解决方案(创建、查看、编辑) |
| 需要使用用户界面框架 | WinForms、WPF | None |
| PDF 创建 | 否 | 是 |
| PDF 操作 | 有限(注释) | 是 |
| 服务器端 | 不支持 | 全面支持 |
| 网络应用 | 否 | 是 |
| 控制台应用程序 | 有限的 | 全面支持 |
| 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 theWPFedition)
dotnet add package IronPdf
dotnet remove package O2S.Components.PDFView4NET.Win
# (use O2S.Components.PDFView4NET.WPF for theWPFedition)
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()
{
//PDFView4NETcannot 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()
{
//PDFView4NETcannot 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
After (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渲染界面——在HtmlToPdfConverter,因此URL必须先通过其他工具渲染为PDF,然后再加载以查看/打印。 IronPDF通过单个SaveAs()保存。 请参阅 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";PDFView4NETcan 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";PDFView4NETcan 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
After (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
在HtmlContent属性或HTML渲染API,因此需要在其他地方将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
After (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引入了用于HTML/URL输入的ChromePdfRenderer:
// 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)
保存方法更改
//PDFView4NEThas no save-from-HTML path; saving applies after edits on a loaded document.
// IronPDF: SaveAs()
pdf.SaveAs("output.pdf");
//PDFView4NEThas no save-from-HTML path; saving applies after edits on a loaded document.
// IronPDF: SaveAs()
pdf.SaveAs("output.pdf");
'PDFView4NEThas 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 | 是(用户界面) | 否(使用查看器) |
| 加载 PDF | 是 | 是 |
| 保存 PDF | 有限的 | 是 |
| HTML 至 PDF | 否 | 是 |
| URL 至 PDF | 否 | 是 |
| 合并 PDF | 否 | 是 |
| 拆分 PDF | 有限的 | 是 |
| 水印 | 否 | 是 |
| 页眉/页脚 | 否 | 是 |
| 密码保护 | 否 | 是 |
| 数字签名 | 否 | 是 |
| 文本提取 | 有限的 | 是 |
| 填写表格 | 有限的 | 是 |
| WinForms | 是 | 是 |
| WPF | 是 | 是 |
| 控制台 | 有限的 | 是 |
| ASP.NET | 否 | 是 |
| 天域 | 否 | 是 |
| 多克 | 否 | 是 |
迁移清单
迁移前
- 确定查看需求(确定IronPDF的功能是否可以取代基于 UI 的 PDF 查看方式)
- 文档打印工作流程
- 列出 PDF 处理需求
- 如有需要,可更换计划查看器(IronPDF 主要侧重于生成/操作)
- 从ironpdf.com获取IronPDF许可证密钥
软件包变更
- 移除
.WPF)NuGet包 - 安装
IronPdfNuGet包:dotnet add package IronPdf
代码更改
- 更新命名空间导入(
using O2S.Components.PDFView4NET;→using IronPdf;) - 为任何HTML或URL输入引入
ChromePdfRenderer(没有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 的转换
- 验证服务器部署是否正常工作(新增功能)
- 如有需要,进行跨平台测试(新增功能)
- 如果仅服务器端,则移除特定于用户界面的 PDF 代码

