如何在 C# 中静默打印文档

This article was translated from English: Does it need improvement?
Translated
View the article in English

静默打印可直接从代码将文档发送至打印机——无需对话框、无需用户交互、不打断流程。 对于批量发票处理、自助终端应用和 Windows 服务后台任务等自动化工作流,取消打印对话框是一项硬性要求。 内置的 System.Drawing.Printing 命名空间虽提供了无交互打印的途径,但其依赖的事件驱动式代码模板在跨团队和跨项目时难以扩展。

IronPrint 将无声打印简化为一次方法调用。 我们安装一个 NuGet 包并调用 Printer.Print() ——该库会在后台处理打印机通信、文档渲染以及与打印队列的交互。

快速入门:静默打印

  1. 通过 NuGet 安装 IronPrint:Install-Package IronPrint
  2. 在文件中添加 using IronPrint;
  3. 调用 Printer.Print("filepath") 将文档发送至默认打印机
  4. 传递一个 PrintSettings 对象来控制打印机名称、DPI、份数和纸张配置
  5. 当打印操作不应阻塞调用线程时,请使用 Printer.PrintAsync()
  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPrint

    PM > Install-Package IronPrint
  2. 复制并运行这段代码。

    using IronPrint;
    
    // Silent print — no dialog, no user interaction
    Printer.Print("invoice.pdf");
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronPrint

    arrow pointer

.NET 中的静默打印如何工作?

.NET 的 System.Drawing.Printing 命名空间中包含一个 StandardPrintController 类,该类可在打印操作期间隐藏状态对话框。 默认情况下,.NET 使用 PrintControllerWithStatusDialog,这会显示"正在打印第 X 页(共 Y 页)"的弹出窗口。切换到 StandardPrintController 可以消除该对话框——但配置成本依然很高。

若要使用原生方法静默打印,我们需创建一个 PrintDocument,附加一个 PrintPage 事件处理程序以将内容绘制到打印图形表面,分配 StandardPrintController,配置 PrinterSettings,并调用 Print()。 这需要为单个文档编写大约 15–25 行配置代码,且每种新的文档类型或格式都需要在 PrintPage 事件中拥有独立的渲染逻辑。 特别是 PDF 渲染功能并未内置于 System.Drawing.Printing 中——我们需要一个独立的 PDF 解析库来提取页面并将其绘制到 Graphics 界面上。

IronPrint 将整个处理流程封装到了静态的 Printer 类中。 Print() 方法接受文件路径或字节数组作为参数,自动检测文件格式,通过相应的引擎进行渲染,并将其发送至默认打印机——整个过程均无需显示对话框。

:path=/static-assets/print/content-code-examples/how-to/silent-printing/silent-printing-print-pdf-and-byte-array.cs
using IronPrint;

// Print a PDF silently to the default printer
Printer.Print("quarterly-report.pdf");

// Print from a byte array (e.g., retrieved from a database or API)
byte[] pdfData = File.ReadAllBytes("shipping-label.pdf");
Printer.Print(pdfData);
Imports IronPrint

' Print a PDF silently to the default printer
Printer.Print("quarterly-report.pdf")

' Print from a byte array (e.g., retrieved from a database or API)
Dim pdfData As Byte() = File.ReadAllBytes("shipping-label.pdf")
Printer.Print(pdfData)
$vbLabelText   $csharpLabel

Print()方法支持PDF、PNG、TIFF、JPEG、GIF、HTML和BMP文件格式。 我们将文件路径作为字符串或原始文件数据作为 byte[] 传递,IronPrint 会自动确定渲染策略。

如何配置静默输出的打印设置?

PrintSettings 类使我们能够完全控制打印任务。 我们配置目标打印机、纸张尺寸、纸张方向、页边距、DPI、颜色模式、复印份数和双面打印行为,然后将设置对象传递给 Printer.Print()

:path=/static-assets/print/content-code-examples/how-to/silent-printing/silent-printing-print-with-settings.cs
using IronPrint;

// Configure detailed print settings
var settings = new PrintSettings
{
    PrinterName = "HP LaserJet Pro",
    PaperSize = PaperSize.A4,
    Orientation = PaperOrientation.Portrait,
    DPI = 300,
    NumberOfCopies = 2,
    Grayscale = false,
    PaperMargins = new Margins(10, 10, 10, 10)
};

// Print with custom settings — still silent, no dialog
Printer.Print("monthly-summary.pdf", settings);
Imports IronPrint

' Configure detailed print settings
Dim settings As New PrintSettings With {
    .PrinterName = "HP LaserJet Pro",
    .PaperSize = PaperSize.A4,
    .Orientation = PaperOrientation.Portrait,
    .DPI = 300,
    .NumberOfCopies = 2,
    .Grayscale = False,
    .PaperMargins = New Margins(10, 10, 10, 10)
}

' Print with custom settings — still silent, no dialog
Printer.Print("monthly-summary.pdf", settings)
$vbLabelText   $csharpLabel

每个属性均对应一个标准的打印队列设置。 DPI 控制输出分辨率 — 300 是商务文档的常见选择,而 150 适用于草稿。 Grayscale 在无需彩色打印时可减少碳粉消耗。 PaperMargins 处的数值以毫米为单位。

如何选择特定的打印机?

我们使用 Printer.GetPrinterNames() 枚举系统上安装的所有打印机,然后将目标打印机名称赋值给 PrintSettings.PrinterName

:path=/static-assets/print/content-code-examples/how-to/silent-printing/silent-printing-select-specific-printer.cs
using IronPrint;

// List all available printers
List<string> printers = Printer.GetPrinterNames();
foreach (string name in printers)
{
    Console.WriteLine(name);
}

// Target a specific network printer
var settings = new PrintSettings
{
    PrinterName = printers.First(p => p.Contains("LaserJet"))
};

Printer.Print("document.pdf", settings);
Imports IronPrint

' List all available printers
Dim printers As List(Of String) = Printer.GetPrinterNames()
For Each name As String In printers
    Console.WriteLine(name)
Next

' Target a specific network printer
Dim settings As New PrintSettings With {
    .PrinterName = printers.First(Function(p) p.Contains("LaserJet"))
}

Printer.Print("document.pdf", settings)
$vbLabelText   $csharpLabel

若未指定 PrinterName,IronPrint 将把打印任务发送到操作系统的默认打印机。 在拥有多台打印机的环境(如共享办公室、仓库或打印室)中,通过编程枚举并选择正确的打印机,可避免打印任务被错误路由。

如何批量打印文档?

批量打印遵循简单的循环模式。 我们遍历一组文件路径,并对每个文档调用 Printer.Print()。 由于每次调用均在后台执行,整个批处理过程将不显示任何对话框提示。

:path=/static-assets/print/content-code-examples/how-to/silent-printing/silent-printing-batch-print.cs
using IronPrint;

string[] invoices = Directory.GetFiles(@"C:\Invoices\Pending", "*.pdf");

var settings = new PrintSettings
{
    PrinterName = "Accounting Printer",
    NumberOfCopies = 1,
    Grayscale = true
};

int successCount = 0;
foreach (string invoice in invoices)
{
    try
    {
        Printer.Print(invoice, settings);
        successCount++;
        Console.WriteLine($"Printed: {Path.GetFileName(invoice)}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Failed: {Path.GetFileName(invoice)} — {ex.Message}");
    }
}
Console.WriteLine($"Batch complete: {successCount}/{invoices.Length} documents printed.");
Imports IronPrint

Dim invoices As String() = Directory.GetFiles("C:\Invoices\Pending", "*.pdf")

Dim settings As New PrintSettings With {
    .PrinterName = "Accounting Printer",
    .NumberOfCopies = 1,
    .Grayscale = True
}

Dim successCount As Integer = 0
For Each invoice As String In invoices
    Try
        Printer.Print(invoice, settings)
        successCount += 1
        Console.WriteLine($"Printed: {Path.GetFileName(invoice)}")
    Catch ex As Exception
        Console.WriteLine($"Failed: {Path.GetFileName(invoice)} — {ex.Message}")
    End Try
Next
Console.WriteLine($"Batch complete: {successCount}/{invoices.Length} documents printed.")
$vbLabelText   $csharpLabel

将每个 Print() 调用包裹在 try/catch 语句中,可确保单个损坏的文件或打印机超时不会导致整个批处理任务中断。 对于在后台服务中运行的大批量任务,将每个结果记录到数据库或监控系统中,可为运维团队提供可供审查的审计日志。

如何在不阻塞线程的情况下进行异步打印?

Printer.PrintAsync() 方法返回一个 Task,使其与 await 模式兼容。 这对用户界面应用程序至关重要——因为阻塞式的打印调用会导致界面冻结,同时也适用于处理并发操作的服务。

:path=/static-assets/print/content-code-examples/how-to/silent-printing/silent-printing-async-print.cs
using IronPrint;

// Non-blocking silent print
await Printer.PrintAsync("report.pdf");

// Async batch printing
string[] files = Directory.GetFiles(@"C:\Reports", "*.pdf");
foreach (string file in files)
{
    await Printer.PrintAsync(file);
}
Imports IronPrint

' Non-blocking silent print
Await Printer.PrintAsync("report.pdf")

' Async batch printing
Dim files As String() = Directory.GetFiles("C:\Reports", "*.pdf")
For Each file As String In files
    Await Printer.PrintAsync(file)
Next
$vbLabelText   $csharpLabel

PrintAsync() 接受与 Print() 相同的参数——文件路径或字节数组,以及一个可选的 PrintSettings 对象。 在高吞吐量场景下,当数十份文档同时排队等待打印时,异步重载可防止线程池资源耗尽。 这遵循了现代 .NET 开发中普遍推荐的基于任务的异步模式

平台方面有哪些注意事项?

IronPrint 支持在桌面和移动平台上的静默打印,但具体行为因操作系统而异。

平台 无声印刷 备注
Windows (7+) 全面支持 无对话框,完全 PrintSettings 控制
macOS (10+) 支持 使用原生 macOS 打印子系统
iOS (11+) 显示的对话框 Print() 仍显示系统打印对话框
Android(API 21+) 显示的对话框 Print() 仍显示系统打印对话框

在移动平台上,受操作系统限制,无法实现真正的静默打印——Printer.Print() 仍会显示原生打印对话框。 对于 Android,在执行任何打印操作之前,必须调用 Printer.Initialize(Android.Content.Context)。 桌面平台(Windows 和 macOS)支持完全无人值守的静默打印,且无任何限制。

这与原生 .NET 打印功能相比如何?

对于正在评估是采用该库还是基于原生 System.Drawing.Printing 命名空间进行开发的工程团队,其权衡因素如下:

PDF/UA-1 PDF/UA-2
已发布 2012 2024
基本规格 PDF 1.7(ISO 32000-1) PDF 2.0(ISO 32000-2)
监管覆盖范围 《美国残疾人法案》第508条、《美国残疾人法案》第二章、《欧盟无障碍法案》 与现有法规向前兼容
验证工具 veraPDF、Adobe Acrobat Pro、PAC 2024 veraPDF(支持率不断提高)
表单字段语义 标准 增强型(更丰富的辅助功能元数据)
最适合 当今的大多数项目 需要 PDF 2.0 功能的新系统

原生方案适用于团队已具备文档渲染基础设施的简单场景。 对于需要打印 PDF、图像或 HTML 却没有现成渲染代码的团队,IronPrint 可节省数周的开发时间并免除后续维护工作。 2025年5月版本中推出的打印速度提升30%这一优化,若由内部开发团队实现,将耗费大量工程资源。

下一步

IronPrint 的静默打印主要通过三种核心方法实现:Printer.Print() 用于同步静默输出,Printer.PrintAsync() 用于非阻塞执行,以及 PrintSettings 用于完全控制打印任务。 这些工具共同覆盖了桌面平台上的单文档、批量及并发打印场景。

请查阅 IronPrint 教程以获取更深入的指导,或参阅 Printer 类 API 参考文档以了解完整的方法接口。 打印设置指南涵盖了其他配置选项,例如纸盒选择和平放打印。

立即开始 30天试用,在实际环境中测试静默打印功能——无需信用卡。 准备部署时,请查看起价为 749 美元的许可方案

如需针对特定部署场景的帮助,请与 Iron Software 工程师联系

Curtis Chau
技术作家

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

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

准备开始了吗?
Nuget 下载 38,930 | 版本: 2026.4 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPrint
运行示例 观看您的文档打到打印机上。