RawPrint .NET vs IronPDF:技术比较指南
RawPrint .NET与 IronPDF:.NET PDF 和打印比较指南
当 .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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com这段代码展示了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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF 方法使用 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)");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com这种方法可以下载 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comRenderUrlAsPdf 方法导航到 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com转义序列(\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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 利用现有的网络开发技能。 开发人员使用熟悉的 HTML 和 CSS 语法,而不是特定于打印机的命令语言。 这种方法通过标准网络技术来支持复杂的布局、字体、颜色和图像。
API 映射参考
评估将RawPrint .NET移植到IronPDF的团队可参考此操作映射:
| RawPrint .NET | IronPDF | 备注 |
|---|---|---|
| <代码>Printer.SendBytesToPrinter()</代码 | <代码>pdf.Print()</代码 | 高级打印 |
| <代码>Printer.OpenPrinter()</代码 | 不适用 | 不需要 |
| <代码>Printer.ClosePrinter()</代码 | 不适用 | 自动翻译 |
| <代码>Printer.StartDocPrinter()</代码 | 不适用 | 自动翻译 |
| <代码>Printer.WritePrinter()</代码 | 不适用 | 自动翻译 |
| <代码>Printer.EndDocPrinter()</代码 | 不适用 | 自动翻译 |
| 不适用 | <代码>ChromePdfRenderer</代码 | 创建 PDF |
| 不适用 | <代码>PdfDocument.Merge()</代码 | Merge PDFs |
| 不适用 | <代码>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");
}IRON VB CONVERTER ERROR developers@ironsoftware.comRawPrint .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");IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 提供了一个简单的 Print 方法,可自动处理打印机通信。 对于高级场景,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 生成和打印模式。