如何在 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 中的静默打印如何工作?

.NETSystem.Drawing.Printing命名空间包括一个StandardPrintController类,它在打印操作过程中抑制状态对话框。 默认情况下,.NET使用StandardPrintController可以消除该对话框——但设置成本仍然显著。

要使用本地方法静默打印,我们创建一个Print()。 这需要大约15到25行的设置代码来处理单个文档,每种新的文档类型或格式都需要在PrintPage事件中拥有自己的渲染逻辑。 特别是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
Printer.Print("quarterly-report.pdf");

// Print from a byte array
byte[] pdfData = File.ReadAllBytes("shipping-label.pdf");
Printer.Print(pdfData);
Imports IronPrint

' Print a PDF silently
Printer.Print("quarterly-report.pdf")

' Print from a byte array
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()DPI Grayscale PaperMargins

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

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

// Print with custom settings
Printer.Print("report.pdf", settings);
Imports IronPrint

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

' Print with custom settings
Printer.Print("report.pdf", settings)
$vbLabelText   $csharpLabel

每个属性均对应一个标准的打印队列设置。 Resolution控制输出分辨率——300是商务文件的常见选择,而150对于草稿文档效果很好。 ColorMode在颜色不必要时减少碳粉使用。 Margins值以毫米为单位。

如何选择特定的打印机?

我们使用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"))
};

// Print the document
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"))
}

' Print the document
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;

// Collect all PDFs in the batch folder
string[] invoices = Directory.GetFiles(@"C:\Invoices\Pending", "*.pdf");

// Configure print settings for the batch
var settings = new PrintSettings
{
    PrinterName = "Accounting Printer",
    NumberOfCopies = 1,
    Grayscale = true
};

// Print each invoice and track successes
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}");
    }
}

// Report batch results
Console.WriteLine($"Batch complete: {successCount}/{invoices.Length} documents printed.");
Imports IronPrint
Imports System.IO

' Collect all PDFs in the batch folder
Dim invoices As String() = Directory.GetFiles("C:\Invoices\Pending", "*.pdf")

' Configure print settings for the batch
Dim settings As New PrintSettings With {
    .PrinterName = "Accounting Printer",
    .NumberOfCopies = 1,
    .Grayscale = True
}

' Print each invoice and track successes
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

' Report batch results
Console.WriteLine($"Batch complete: {successCount}/{invoices.Length} documents printed.")
$vbLabelText   $csharpLabel

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

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

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

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

// Print asynchronously without blocking the thread
await Printer.PrintAsync("report.pdf");

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

' Print asynchronously without blocking the thread
Await Printer.PrintAsync("report.pdf")

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

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静默打印归结为三种核心方法:用于同步静默输出的PrintSettings。 这些工具共同覆盖了桌面平台上的单文档、批量及并发打印场景。

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

立即开始 30天试用,在实际环境中测试静默打印功能——无需信用卡。 准备好部署时,查看许可选项,起始于$999。

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

常见问题解答

C#中的静默打印是什么?

C#中的静默打印指的是能够直接将文档打印到打印机而不显示任何打印对话框或用户交互提示。IronPrint通过允许开发人员以编程方式配置打印设置来实现此功能。

如何使用IronPrint进行静默打印?

使用IronPrint,您可以通过在C#代码中直接设置DPI、打印份数并启用异步批量打印来进行静默打印,从而绕过任何打印对话框。

IronPrint能处理PDF文件的静默打印吗?

是的,IronPrint专为处理PDF文件的静默打印而设计,使您能够无中断地无对话框打印PDF文档。

是否可以使用IronPrint配置打印机设置?

绝对可以。IronPrint允许您通过代码配置各种打印机设置,例如选择打印机、设置DPI和指定打印份数,无需用户干预。

IronPrint支持异步批量打印吗?

是的,IronPrint支持异步批量打印,这使您能够在后台排队多个打印作业并执行,提高您C#应用程序中的效率和性能。

IronPrint兼容什么编程语言?

IronPrint兼容C#,是需要强大静默打印功能的.NET框架开发人员的绝佳选择。

IronPrint可以在不打开任何打印对话框的情况下打印吗?

是的,IronPrint专为静默打印设计,意味着它可以将文档直接发送到打印机,而无需打开任何打印对话框或要求用户输入。

using IronPrint 可以打印哪种类型的文档?

IronPrint主要支持PDF文档打印,从您的C#应用程序直接提供无缝且无对话的打印体验。

IronPrint的静默打印适合批处理吗?

是的,使用IronPrint的静默打印非常适合批处理,因为它允许您异步管理和执行多个打印任务,提高生产力并简化工作流程。

IronPrint如何改善C#应用程序中的打印流程?

IronPrint通过提供无对话框打印解决方案来改善C#应用程序中的打印流程,使开发人员能够以编程方式控制打印配置,并支持异步操作以实现高效的批处理。

Curtis Chau
技术作家

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

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

准备开始了吗?
Nuget 下载 44,051 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

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