RawPrint .NET vs IronPDF:技术比较指南
当 .NET 开发人员评估文档打印和 PDF 生成解决方案时,RawPrint .NET 和IronPDF提供了截然不同的方法和功能。RawPrint .NET提供对打印机后台处理程序的底层访问,以便直接向打印机发送原始字节,而IronPDF提供完整的高级 API,用于创建、操作和打印 PDF 文档。 本技术比较从对专业开发人员和为 .NET 应用程序做出文档处理决策的架构师最重要的方面对两种解决方案进行了审查。
了解 RawPrint .NET.
RawPrint .NET 是一种低级打印实用程序,可将原始字节直接发送到打印机线轴。 它使应用程序能够绕过传统的打印机驱动程序,直接向打印机传输命令数据。 该功能对于专业打印机特别有用,例如使用 ZPL(斑马编程语言)或 EPL(Eltron 编程语言)的标签创建器。
关键区别:RawPrint .NET不是一个 PDF 库。 它不会创建、生成、渲染或处理 PDF 文档。 它的唯一功能是通过视窗打印子系统将字节传输到打印机硬件。
这种方法要求开发人员使用从 winspool.Drv 导入的视窗专用 DLL,通过一系列函数调用手动管理打印机句柄:OpenPrinter, StartDocPrinter, StartPagePrinter, WritePrinter, EndPagePrinter, EndDocPrinter, 和 ClosePrinter.
RawPrint .NET 的架构要求对打印机命令语言有深入的了解。 在文档格式化方面,开发人员必须手动构建 PCL(打印机命令语言)或 PostScript 命令,并将其作为转义序列嵌入字节流中。
了解IronPDF
IronPDF为 .NET 应用程序中的 PDF 操作提供了一个完整的高级 API。 该库包括一个基于 Chromium 的渲染引擎,可将 HTML、CSS 和 JavaScript 完全逼真地转换成 PDF 文档。 除了生成功能外,IronPDF 还提供 PDF 操作功能,包括合并、分割、编辑和安全功能。
IronPDF 的架构抽象了文档渲染和打印机通信的复杂性。ChromePdfRenderer类处理 HTML 到 PDF 的转换,而 PdfDocument 类提供无需手动资源管理的操作和打印方法。
核心能力差距
RawPrint .NET 和IronPDF的根本区别在于它们的目的和功能:
| 任务 | RawPrint .NET | IronPDF |
|---|---|---|
| 从 HTML 创建 PDF | 不支持。 | 是 |
| 从 URL 创建 PDF | 不支持。 | 是 |
| 编辑/修改 PDF | 不支持。 | 是 |
| 合并/拆分 PDF | 不支持。 | 是 |
| 打印现有 PDF | 是(仅限原始字节) | 是(高级应用程序接口) |
| 打印控制 | 基本的 | 全部选项 |
| 跨平台 | 仅限 Windows | 是 |
通过比较可以发现,RawPrint .NET 和IronPDF的用例完全不同。RawPrint .NET解决底层打印机通信问题,而IronPDFfor .NET 则提供完整的 PDF 文档生命周期管理。
HTML 至 PDF 转换
在考察 HTML 到 PDF 的转换场景时,RawPrint .NET 和IronPDF之间的对比就变得非常鲜明。
RawPrint .NETHTML 处理
RawPrint .NET 无法将 HTML 转换为 PDF。 它只能向打印机发送原始数据:
// NuGet: Install-Package System.Drawing.Common
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Text;
class RawPrinterHelper
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOCINFOA
{
[MarshalAs(UnmanagedType.LPStr)] public string pDocName;
[MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;
[MarshalAs(UnmanagedType.LPStr)] public string pDataType;
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
dwCount = szString.Length;
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
IntPtr hPrinter;
if (OpenPrinter(szPrinterName, out hPrinter, IntPtr.Zero))
{
DOCINFOA di = new DOCINFOA();
di.pDocName = "HTML Document";
di.pDataType = "RAW";
if (StartDocPrinter(hPrinter, 1, di))
{
if (StartPagePrinter(hPrinter))
{
Int32 dwWritten;
WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
return false;
}
}
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
// RawPrint cannot directly convert HTML to PDF
// It sends raw data to printer, no PDF generation capability
RawPrinterHelper.SendStringToPrinter("Microsoft Print to PDF", html);
}
}// NuGet: Install-Package System.Drawing.Common
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Text;
class RawPrinterHelper
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DOCINFOA
{
[MarshalAs(UnmanagedType.LPStr)] public string pDocName;
[MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;
[MarshalAs(UnmanagedType.LPStr)] public string pDataType;
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);
[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);
[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
dwCount = szString.Length;
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
IntPtr hPrinter;
if (OpenPrinter(szPrinterName, out hPrinter, IntPtr.Zero))
{
DOCINFOA di = new DOCINFOA();
di.pDocName = "HTML Document";
di.pDataType = "RAW";
if (StartDocPrinter(hPrinter, 1, di))
{
if (StartPagePrinter(hPrinter))
{
Int32 dwWritten;
WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
return false;
}
}
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
// RawPrint cannot directly convert HTML to PDF
// It sends raw data to printer, no PDF generation capability
RawPrinterHelper.SendStringToPrinter("Microsoft Print to PDF", html);
}
}Imports System
Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Runtime.InteropServices
Imports System.Text
Class RawPrinterHelper
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
Public Class DOCINFOA
<MarshalAs(UnmanagedType.LPStr)> Public pDocName As String
<MarshalAs(UnmanagedType.LPStr)> Public pOutputFile As String
<MarshalAs(UnmanagedType.LPStr)> Public pDataType As String
End Class
<DllImport("winspool.Drv", EntryPoint:="OpenPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function OpenPrinter(<MarshalAs(UnmanagedType.LPStr)> szPrinter As String, ByRef hPrinter As IntPtr, pd As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="ClosePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function ClosePrinter(hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartDocPrinterA", SetLastError:=True, CharSet:=CharSet.Ansi, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function StartDocPrinter(hPrinter As IntPtr, level As Integer, <[In], MarshalAs(UnmanagedType.LPStruct)> di As DOCINFOA) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndDocPrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function EndDocPrinter(hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="StartPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function StartPagePrinter(hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="EndPagePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function EndPagePrinter(hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.Drv", EntryPoint:="WritePrinter", SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)>
Public Shared Function WritePrinter(hPrinter As IntPtr, pBytes As IntPtr, dwCount As Integer, ByRef dwWritten As Integer) As Boolean
End Function
Public Shared Function SendStringToPrinter(szPrinterName As String, szString As String) As Boolean
Dim pBytes As IntPtr
Dim dwCount As Integer
dwCount = szString.Length
pBytes = Marshal.StringToCoTaskMemAnsi(szString)
Dim hPrinter As IntPtr
If OpenPrinter(szPrinterName, hPrinter, IntPtr.Zero) Then
Dim di As New DOCINFOA()
di.pDocName = "HTML Document"
di.pDataType = "RAW"
If StartDocPrinter(hPrinter, 1, di) Then
If StartPagePrinter(hPrinter) Then
Dim dwWritten As Integer
WritePrinter(hPrinter, pBytes, dwCount, dwWritten)
EndPagePrinter(hPrinter)
End If
EndDocPrinter(hPrinter)
End If
ClosePrinter(hPrinter)
Marshal.FreeCoTaskMem(pBytes)
Return True
End If
Return False
End Function
End Class
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
' RawPrint cannot directly convert HTML to PDF
' It sends raw data to printer, no PDF generation capability
RawPrinterHelper.SendStringToPrinter("Microsoft Print to PDF", html)
End Sub
End Class这段代码展示了RawPrint .NET的局限性:它将原始 HTML 字符串发送到打印机,而不是将其呈现为格式化文档。 输出将是字面上的 HTML 标记文本,而不是渲染的网页。
IronPDFHTML 转换
IronPDF 可提供 HTML 到 PDF 的实际转换,并可进行完全渲染:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End ClassIronPDF 方法使用 RenderHtmlAsPdf 方法将 HTML 内容转换为正确渲染的 PDF 文档。 Chromium 引擎处理 CSS、JavaScript 和 HTML,以产生与浏览器渲染相匹配的输出。
将 URL 转换为 PDF.
将实时网页转换为 PDF 进一步说明了能力上的差异。
RawPrint .NETURL 处理
RawPrint .NET 不能呈现网页,只能传输原始数据:
// NuGet: Install-Package System.Drawing.Common
using System;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
static void Main()
{
// RawPrint cannot render web pages - only sends raw text/data
// This would just print HTML source code, not rendered content
using (WebClient client = new WebClient())
{
string htmlSource = client.DownloadString("https://example.com");
// This prints raw HTML, not a rendered PDF
RawPrinterHelper.SendStringToPrinter("Microsoft Print to PDF", htmlSource);
Console.WriteLine("Raw HTML sent to printer (not rendered)");
}
}
}// NuGet: Install-Package System.Drawing.Common
using System;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
static void Main()
{
// RawPrint cannot render web pages - only sends raw text/data
// This would just print HTML source code, not rendered content
using (WebClient client = new WebClient())
{
string htmlSource = client.DownloadString("https://example.com");
// This prints raw HTML, not a rendered PDF
RawPrinterHelper.SendStringToPrinter("Microsoft Print to PDF", htmlSource);
Console.WriteLine("Raw HTML sent to printer (not rendered)");
}
}
}Imports System
Imports System.Net
Imports System.Runtime.InteropServices
Imports System.Text
Module Program
Sub Main()
' RawPrint cannot render web pages - only sends raw text/data
' This would just print HTML source code, not rendered content
Using client As New WebClient()
Dim htmlSource As String = client.DownloadString("https://example.com")
' This prints raw HTML, not a rendered PDF
RawPrinterHelper.SendStringToPrinter("Microsoft Print to PDF", htmlSource)
Console.WriteLine("Raw HTML sent to printer (not rendered)")
End Using
End Sub
End Module这种方法可以下载 HTML 源代码,并将其作为原始文本发送到打印机。 翻译结果是打印的 HTML 标记,而不是带有样式、图像或布局的渲染网页。
IronPDFURL 转换
IronPDF 可将实时网站直接渲染为 PDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Render a live website directly to PDF with full CSS, JavaScript, and images
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("Website rendered to PDF successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Render a live website directly to PDF with full CSS, JavaScript, and images
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("Website rendered to PDF successfully");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
' Render a live website directly to PDF with full CSS, JavaScript, and images
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("Website rendered to PDF successfully")
End Sub
End ClassRenderUrlAsPdf 方法导航到 URL、执行 JavaScript、应用 CSS 样式、加载图像,并将完全渲染的页面捕获为 PDF 文档。
文档格式比较
格式化功能揭示了两种方法之间的架构差异。
RawPrint .NET格式化
RawPrint .NET 要求使用手动 PCL 或 PostScript 命令进行任何格式化:
// NuGet: Install-Package System.Drawing.Common
using System;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
static void Main()
{
// RawPrint requires manual PCL/PostScript commands for formatting
string pclCommands = "\x1B&l0O\x1B(s0p16.66h8.5v0s0b3T";
string text = "Plain text document - limited formatting";
byte[] data = Encoding.ASCII.GetBytes(pclCommands + text);
RawPrinterHelper.SendBytesToPrinter("HP LaserJet", data);
}
}// NuGet: Install-Package System.Drawing.Common
using System;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
static void Main()
{
// RawPrint requires manual PCL/PostScript commands for formatting
string pclCommands = "\x1B&l0O\x1B(s0p16.66h8.5v0s0b3T";
string text = "Plain text document - limited formatting";
byte[] data = Encoding.ASCII.GetBytes(pclCommands + text);
RawPrinterHelper.SendBytesToPrinter("HP LaserJet", data);
}
}Imports System
Imports System.Drawing.Printing
Imports System.Runtime.InteropServices
Imports System.Text
Module Program
Sub Main()
' RawPrint requires manual PCL/PostScript commands for formatting
Dim pclCommands As String = ChrW(&H1B) & "&l0O" & ChrW(&H1B) & "(s0p16.66h8.5v0s0b3T"
Dim text As String = "Plain text document - limited formatting"
Dim data As Byte() = Encoding.ASCII.GetBytes(pclCommands & text)
RawPrinterHelper.SendBytesToPrinter("HP LaserJet", data)
End Sub
End Module转义序列(\x1B&l0O\x1B(s0p16.66h8.5v0s0b3T)表示打印机配置的 PCL 命令。 开发人员必须理解打印机特定的命令语言,并手动构建格式化指令。
IronPDF格式化
IronPdf 使用标准 HTML 和 CSS 来实现丰富的格式化:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = @"
<html>
<head>
<style>
body { font-family: Arial; margin: 40px; }
h1 { color: #2c3e50; font-size: 24px; }
p { line-height: 1.6; color: #34495e; }
.highlight { background-color: yellow; font-weight: bold; }
</style>
</head>
<body>
<h1>Formatted Document</h1>
<p>This is a <span class='highlight'>beautifully formatted</span> document with CSS styling.</p>
<p>Complex layouts, fonts, colors, and images are fully supported.</p>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("formatted.pdf");
Console.WriteLine("Formatted PDF created successfully");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = @"
<html>
<head>
<style>
body { font-family: Arial; margin: 40px; }
h1 { color: #2c3e50; font-size: 24px; }
p { line-height: 1.6; color: #34495e; }
.highlight { background-color: yellow; font-weight: bold; }
</style>
</head>
<body>
<h1>Formatted Document</h1>
<p>This is a <span class='highlight'>beautifully formatted</span> document with CSS styling.</p>
<p>Complex layouts, fonts, colors, and images are fully supported.</p>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("formatted.pdf");
Console.WriteLine("Formatted PDF created successfully");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "
<html>
<head>
<style>
body { font-family: Arial; margin: 40px; }
h1 { color: #2c3e50; font-size: 24px; }
p { line-height: 1.6; color: #34495e; }
.highlight { background-color: yellow; font-weight: bold; }
</style>
</head>
<body>
<h1>Formatted Document</h1>
<p>This is a <span class='highlight'>beautifully formatted</span> document with CSS styling.</p>
<p>Complex layouts, fonts, colors, and images are fully supported.</p>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("formatted.pdf")
Console.WriteLine("Formatted PDF created successfully")
End Sub
End ClassIronPdf 利用现有的网络开发技能。 开发人员使用熟悉的 HTML 和 CSS 语法,而不是特定于打印机的命令语言。 这种方法通过标准网络技术来支持复杂的布局、字体、颜色和图像。
API 映射参考
评估将RawPrint .NET移植到IronPDF的团队可参考此操作映射:
| RawPrint .NET | IronPDF |
|---|---|
Printer.SendBytesToPrinter() | |
Printer.OpenPrinter() | 不适用 |
Printer.ClosePrinter() | 不适用 |
Printer.StartDocPrinter() | 不适用 |
Printer.WritePrinter() | 不适用 |
Printer.EndDocPrinter() | 不适用 |
| 不适用 | ChromePdfRenderer |
| 不适用 | PdfDocument.Merge() |
| 不适用 | pdf.ApplyWatermark() |
映射表明,IronPDF 完全消除了手动打印机手柄管理。RawPrint .NET中需要明确调用打开/关闭/开始/结束的操作由IronPDF的高级 API 自动处理。
功能比较矩阵
| 特征 | RawPrint .NET | IronPDF |
|---|---|---|
| PDF 创建 | ||
| HTML 至 PDF | 否 | 是 |
| URL 至 PDF | 否 | 是 |
| 从零开始 | 否 | 是 |
| PDF 操作 | ||
| 合并 PDF | 否 | 是 |
| 拆分 PDF | 否 | 是 |
| 添加水印 | 否 | 是 |
| 编辑现有内容 | 否 | 是 |
| 打印 | ||
| 打印 PDF | 是(原始) | 是(高级) |
| 打印对话框 | 否 | 是 |
| 多份 | 有限的 | 是 |
| DPI 控制 | 否 | 是 |
| 双工 | 否 | 是 |
| 平台 | ||
| 视窗 | 是 | 是 |
| Linux | 否 | 是 |
| MacOS | 否 | 是 |
| 多克 | 否 | 是 |
| 其他 | ||
| 安全性 | 否 | 是 |
| 数字签名 | 否 | 是。 |
| PDF/A | 否 | 是 |
打印比较
对于RawPrint .NET所提供的一项功能--打印现有文档--API 的复杂性差别很大。
RawPrint .NET打印
using RawPrint;
using System.IO;
byte[] pdfBytes = File.ReadAllBytes("document.pdf");
bool success = Printer.SendBytesToPrinter(
"Brother HL-L2340D",
pdfBytes,
pdfBytes.Length
);
if (!success)
{
throw new Exception("Print failed");
}using RawPrint;
using System.IO;
byte[] pdfBytes = File.ReadAllBytes("document.pdf");
bool success = Printer.SendBytesToPrinter(
"Brother HL-L2340D",
pdfBytes,
pdfBytes.Length
);
if (!success)
{
throw new Exception("Print failed");
}Imports RawPrint
Imports System.IO
Dim pdfBytes As Byte() = File.ReadAllBytes("document.pdf")
Dim success As Boolean = Printer.SendBytesToPrinter("Brother HL-L2340D", pdfBytes, pdfBytes.Length)
If Not success Then
Throw New Exception("Print failed")
End IfRawPrint .NET 需要以字节形式读取文件,并手动管理成功/失败状态。
IronPDF打印
using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Simple print
pdf.Print();
// Or specify printer
pdf.Print("Brother HL-L2340D");using IronPdf;
var pdf = PdfDocument.FromFile("document.pdf");
// Simple print
pdf.Print();
// Or specify printer
pdf.Print("Brother HL-L2340D");Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
' Simple print
pdf.Print()
' Or specify printer
pdf.Print("Brother HL-L2340D")IronPDF 提供了一种简单的打印方法,可以自动处理打印机通信。 对于高级场景,IronPDF 支持打印选项,包括副本、DPI 和灰度设置。
团队何时考虑迁移 RawPrint .NET?
有几个因素促使开发团队评估RawPrint .NET的替代方案:
当应用程序需要创建 PDF 文档时,PDF 生成要求就会成为障碍。RawPrint .NET不能生成 PDF,只能将字节传输到打印机。 需要将 HTML 转换为 PDF 或创建文档的团队必须在使用RawPrint .NET的同时使用其他库。
跨平台部署要求超出了RawPrint .NET的能力范围。 通过 winspool.Drv DLL 导入,该库完全依赖于视窗打印子系统。 Linux、macOS 和多克部署需要不同的解决方案。
API 的复杂性造成维护负担。 与高级 API 相比,使用明确的打开/关闭/开始/结束序列手动管理打印机句柄会增加代码的复杂性和出错的可能性。
有限的印刷控制影响了生产要求。RawPrint .NET提供基本的字节传输功能,没有副本、DPI、双面打印或打印对话框选项。
优势和权衡
RawPrint .NET的优势
- 专用硬件的直接打印机访问(标签打印机、ZPL/EPL 设备)
- 将原始字节传输的开销降至最低
- 适用于基本打印场景的简单架构
- 除视窗DLL 之外,无任何外部依赖性
RawPrint .NET的限制
- 无 PDF 创建或生成功能
- 仅支持视窗平台
- 需要手动管理打印机手柄
- 无 HTML 或 URL 呈现
- 格式有限(要求具备 PCL/PostScript 知识)
- 无 PDF 操作功能
IronPDF的优势
IronPDF注意事项
- 商业许可模式
- Chromium 渲染引擎足迹
- 专为 PDF 工作流程而非原始打印机访问而设计
结论
RawPrint .NET 和IronPDF在 .NET 文档处理方面有着根本不同的用途。RawPrint .NET提供了向打印机线轴发送原始字节的底层访问权限--对于使用标签打印机或需要直接传输命令的设备的特殊打印场景非常有用。 但是,不能创建、渲染或操作 PDF 文档。
对于需要生成 PDF、HTML 到 PDF 转换、文档操作或跨平台打印的应用程序,IronPDF 可提供RawPrint .NET所无法提供的全面功能。 高级应用程序接口消除了手动打印机句柄管理,同时增加了合并、拆分、安全和数字签名等功能。
在评估将RawPrint .NET移植到IronPDF时,团队应考虑其具体要求。 如果主要需求是创建和处理 PDF 文档,打印是次要功能,那么IronPDF可以满足完整的工作流程。 对于 2026 年以 .NET 10 和 C# 14 为目标并有跨平台部署要求的团队来说,IronPDF 的架构比视窗专用的RawPrint .NET方法提供了更合适的基础。
有关实施指导,请查阅IronPDF 文档和打印教程,其中涵盖了 .NET 应用程序的 PDF 生成和打印模式。