如何在 C# 中擷取印表機名稱

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

在任何需要列印文件的 .NET 應用程式中,了解系統上可用的印表機是常見的前置條件。 無論目標是讓使用者從下拉選單選取印表機,還是自動將列印工作路由至特定設備,以程式化方式擷取印表機名稱都是第一步。

IronPrint 提供一個靜態方法 — Printer.GetPrinterNames() — 可傳回目前 Windows 機器上所有已安裝的印表機,以 List<string> 形式呈現。 以下涵蓋安裝、同步與非同步擷取,以及如何將選取的印表機名稱傳入列印工作。

快速入門:擷取印表機名稱

  1. 透過 NuGet 安裝 IronPrint:Install-Package IronPrint
  2. using IronPrint; 加入檔案中
  3. 呼叫 Printer.GetPrinterNames() 以取得印表機名稱的 List<string>
  4. 遍歷清單並顯示或儲存每個名稱
  5. 列印時將選取的名稱傳遞給 PrintSettings.PrinterName
  1. 使用NuGet套件管理器安裝https://www.nuget.org/packages/IronPrint

    PM > Install-Package IronPrint
  2. 複製並運行這段程式碼。

    using IronPrint;
    
    // Retrieve every printer installed on this machine
    List<string> printers = Printer.GetPrinterNames();
    
    foreach (var name in printers)
    {
        Console.WriteLine(name);
    }
  3. 部署到您的生產環境進行測試

    今天就在您的專案中開始使用免費試用IronPrint

    arrow pointer

如何列出所有已安裝的印表機名稱?

Printer.GetPrinterNames() 會查詢作業系統並以 List<string> 形式傳回所有已登錄的印表機。 我們呼叫此方法一次並遍歷結果:

:path=/static-assets/print/content-code-examples/how-to/retrieve-printer-names/retrieve-printer-names-list-all-printers.cs
using IronPrint;
using System;
using System.Collections.Generic;

// Get every printer registered on this Windows machine
List<string> printerNames = Printer.GetPrinterNames();

Console.WriteLine($"Found {printerNames.Count} printer(s):\n");

foreach (string name in printerNames)
{
    Console.WriteLine($"  • {name}");
}
Imports IronPrint
Imports System
Imports System.Collections.Generic

' Get every printer registered on this Windows machine
Dim printerNames As List(Of String) = Printer.GetPrinterNames()

Console.WriteLine($"Found {printerNames.Count} printer(s):" & vbCrLf)

For Each name As String In printerNames
    Console.WriteLine($"  • {name}")
Next
$vbLabelText   $csharpLabel

控制台輸出

Found 3 printer(s):

  • Microsoft Print to PDF
  • HP LaserJet Pro MFP M428
  • OneNote (Desktop)

傳回的清單包含本地印表機、網路印表機和虛擬列印驅動程式。 每個字串與 Windows 設定 > 印表機與掃描器面板中顯示的確切名稱相符,因此可直接用於列印設定配置

若未安裝任何印表機,此方法會傳回空清單而非拋出例外。 在向使用者呈現選項前,只需快速檢查 printerNames.Count 即可。

如何以非同步方式擷取印表機名稱?

對於不允許阻塞 UI 執行緒的應用程式(WPF、MAUI 或 ASP.NET Web 應用程式),IronPrint 提供 Printer.GetPrinterNamesAsync()。 此方法傳回 Task<List<string>>,其運作方式與同步版本完全相同:

:path=/static-assets/print/content-code-examples/how-to/retrieve-printer-names/retrieve-printer-names-async-printer-names.cs
using IronPrint;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

// Await the async call to avoid blocking the UI thread
List<string> printerNames = await Printer.GetPrinterNamesAsync();

foreach (string name in printerNames)
{
    Console.WriteLine(name);
}
Imports IronPrint
Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks

' Await the async call to avoid blocking the UI thread
Dim printerNames As List(Of String) = Await Printer.GetPrinterNamesAsync()

For Each name As String In printerNames
    Console.WriteLine(name)
Next
$vbLabelText   $csharpLabel

我們像其他非同步 API 一樣 await 此呼叫。 結果是 GetPrinterNames() 傳回的相同 List<string>,因此不需要額外的解析或轉換。 此非同步模式可自然整合到 async Task 控制器動作和 async void 事件處理程序中。

如何依名稱列印至特定印表機?

取得印表機名稱後,我們將其指派給 PrintSettings.PrinterName 並將設定物件傳遞給 Printer.Print()。 這會直接將文件傳送至所選印表機,而不顯示對話方塊:

:path=/static-assets/print/content-code-examples/how-to/retrieve-printer-names/retrieve-printer-names-print-to-specific-printer.cs
using IronPrint;
using System.Collections.Generic;

// Step 1 — Retrieve available printers
List<string> printers = Printer.GetPrinterNames();

// Step 2 — Select a printer (first match containing "LaserJet" as an example)
string targetPrinter = printers.Find(p => p.Contains("LaserJet"))
                       ?? printers[0]; // fallback to first available

// Step 3 — Configure print settings
PrintSettings settings = new PrintSettings
{
    PrinterName = targetPrinter,
    PaperSize = PaperSize.A4,
    NumberOfCopies = 1
};

// Step 4 — Print the document
Printer.Print("invoice.pdf", settings);
Imports IronPrint
Imports System.Collections.Generic

' Step 1 — Retrieve available printers
Dim printers As List(Of String) = Printer.GetPrinterNames()

' Step 2 — Select a printer (first match containing "LaserJet" as an example)
Dim targetPrinter As String = printers.Find(Function(p) p.Contains("LaserJet")) _
                       OrElse printers(0) ' fallback to first available

' Step 3 — Configure print settings
Dim settings As New PrintSettings With {
    .PrinterName = targetPrinter,
    .PaperSize = PaperSize.A4,
    .NumberOfCopies = 1
}

' Step 4 — Print the document
Printer.Print("invoice.pdf", settings)
$vbLabelText   $csharpLabel

PrintSettings 支援其他屬性,如 DpiPaperOrientationGrayscalePaperMargins。 請參閱 PrintSettings API 參考列印設定操作指南中的完整清單。

我們也可以使用 Printer.GetPrinterTrays(printerName) 擷取特定印表機的可用紙匣,這在列印工作需要從特定紙匣取紙時非常有用。

接下來我該怎麼做?

我們涵蓋了四項操作:安裝 IronPrint、使用 GetPrinterNames() 列出所有印表機名稱、使用 GetPrinterNamesAsync() 非同步執行相同查詢,以及透過 PrintSettings.PrinterName 將文件路由至特定印表機。

如需進一步閱讀和更深入的範例,請探索以下資源:

立即取得免費試用授權,在實際環境中測試所有功能;或於準備部署時查看授權選項

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

準備好開始了嗎?
Nuget 下載 38,930 | 版本: 2026.4 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想要快速證明? PM > Install-Package IronPrint
執行範例 觀看您的文件打到印表機上。