跳至页脚内容
视频

在 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,以及注释和表单填写而构建。 迁移的常见原因:

  1. 查看/渲染/打印重点:PDFView4NET加载现有PDF以用于显示、打印或图像渲染。 它不从HTML或URL生成PDF。

  2. UI框架依赖:以WinForms和WPF版本分布; 都以Windows桌面为目标,这限制了在控制台工人或服务器端主机中的使用。

  3. 没有HTML到PDF:HtmlToPdfConverter或HTML渲染API。

  4. 限制的操作:操作集中在注释和表单字段而不是完整内容创作上。

  5. 无Linux/Docker/服务器路径:该工具包通过WinForms/WPF仅限于Windows,未设计用于Linux上的ASP.NET主机或容器工作负载。

  6. 活跃但范围狭窄: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应用程序、服务和控制台应用程序中,对于需要跨平台支持或服务器端托管的项目来说可能至关重要。


开始之前

前提条件

  1. .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 访问权限:能够安装 NuGet 包
  3. 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="*" />
XML

或通过 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
SHELL

许可配置

// 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"
$vbLabelText   $csharpLabel

完整的 API 参考

命名空间变更

// Before: PDFView4NET
using O2S.Components.PDFView4NET;

// After: IronPDF
using IronPdf;
// Before: PDFView4NET
using O2S.Components.PDFView4NET;

// After: IronPDF
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

核心 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

本例强调了 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")
$vbLabelText   $csharpLabel

文档加载更改

// 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")
$vbLabelText   $csharpLabel

页面访问更改

// 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)
$vbLabelText   $csharpLabel

保存方法更改

//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")
$vbLabelText   $csharpLabel

迁移后的新功能

迁移到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")
$vbLabelText   $csharpLabel

使用 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")
$vbLabelText   $csharpLabel

密码保护

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")
$vbLabelText   $csharpLabel

表格填写

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")
$vbLabelText   $csharpLabel

服务器端处理

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
$vbLabelText   $csharpLabel

功能对比摘要

特征 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包
  • 安装IronPdf NuGet包:dotnet add package IronPdf

代码更改

  • 更新命名空间导入(using O2S.Components.PDFView4NET;using IronPdf;
  • 为任何HTML或URL输入引入ChromePdfRenderer(没有PDFView4NET等效项)
  • 替换new PDFDocument(); document.Load(path) with PdfDocument.FromFile(path)
  • 替换new PDFDocument(); document.Load(stream) with PdfDocument.FromStream(stream)
  • 替换手动for (int i = 0; i < document.PageCount; i++) (or pdf.ExtractTextFromPage(i))
  • using块)
  • 在应用程序启动时添加许可证初始化

后迁移

  • 测试 PDF 加载和保存
  • 验证文本提取功能
  • 测试 HTML 到 PDF 的转换
  • 验证服务器部署是否正常工作(新增功能)
  • 如有需要,进行跨平台测试(新增功能)
  • 如果仅服务器端,则移除特定于用户界面的 PDF 代码

请注意PDFView4NET是其相应所有者的注册商标。 本网站与O2 Solutions无关联、未获认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我