Jak drukować dokumenty w tle w języku C

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

Ciche drukowanie wysyła dokumenty bezpośrednio do drukarki z poziomu kodu — bez okien dialogowych, bez interakcji użytkownika, bez przerw. W przypadku zautomatyzowanych procesów, takich jak przetwarzanie faktur w trybie wsadowym, aplikacje kioskowe i zadania w tle usług Windows, wyeliminowanie okna dialogowego drukowania jest bezwzględnym wymogiem. Wbudowana przestrzeń nazw System.Drawing.Printing oferuje możliwość cichego drukowania, ale wymaga szablonu opartego na zdarzeniach, który słabo skaluje się w zespołach i projektach.

IronPrint sprowadza ciche drukowanie do jednego wywołania metody. Instalujemy jeden pakiet NuGet i wywołujemy Printer.Print() — biblioteka zajmuje się komunikacją z drukarką, renderowaniem dokumentów i interakcją z systemem drukowania w tle.

Szybki start: Drukowanie w tle

  1. Zainstaluj IronPrint za pomocą NuGet: Install-Package IronPrint
  2. Dodaj using IronPrint; do pliku
  3. Wywołaj Printer.Print("filepath"), aby wysłać dokument do domyślnej drukarki
  4. Przekaż obiekt PrintSettings, aby kontrolować nazwę drukarki, DPI, kopie i konfigurację papieru
  5. Użyj Printer.PrintAsync(), gdy operacja drukowania nie powinna blokować wątku wywołującego
  1. Install IronPrint with NuGet Package Manager

    PM > Install-Package IronPrint
  2. Skopiuj i uruchom ten fragment kodu.

    using IronPrint;
    
    // Silent print — no dialog, no user interaction
    Printer.Print("invoice.pdf");
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronPrint w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer

Jak działa ciche drukowanie w .NET?

.NET System.Drawing.Printing zawiera klasę StandardPrintController, która tłumi dialog o statusie podczas operacji drukowania. Domyślnie .NET używa PrintControllerWithStatusDialog, który pokazuje popup „Drukowanie strony X z Y". Zmiana na StandardPrintController eliminuje ten dialog — ale koszt konfiguracji pozostaje znaczący.

Aby drukować po cichu w podejściu natywnym, tworzymy PrintDocument, dołączamy obsługę zdarzenia PrintPage, która rysuje zawartość na powierzchni grafiki drukarki, przypisujemy StandardPrintController, konfigurujemy PrinterSettings i wywołujemy Print(). Wymaga to około 15–25 linii kodu konfiguracyjnego dla pojedynczego dokumentu, a każdy nowy typ lub format dokumentu potrzebuje swojej logiki renderowania w zdarzeniu PrintPage. Renderowanie PDF w szczególności nie jest wbudowane w System.Drawing.Printing — potrzebna byłaby oddzielna biblioteka parsowania PDF, aby wyodrębnić strony i narysować je na powierzchni Graphics.

IronPrint łączy cały ten proces w statycznej klasie Printer. Metoda Print() akceptuje ścieżkę do pliku lub tablicę bajtów, wykrywa format pliku, renderuje go poprzez odpowiedni silnik i wysyła do domyślnej drukarki — wszystko to bez wyświetlania dialogu.

: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

Metoda Print() obsługuje formaty plików PDF, PNG, TIFF, JPEG, GIF, HTML i BMP. Przekazujemy ścieżkę do pliku jako ciąg znaków lub surowe dane pliku jako byte[], a IronPrint automatycznie określa strategię renderowania.

Jak skonfigurować ustawienia drukowania dla cichego wydruku?

Klasa PrintSettings zapewnia nam pełną kontrolę nad zadaniem drukowania. Konfigurujemy docelową drukarkę, wymiary papieru, orientację, marginesy, DPI, tryb kolorów, liczbę kopii i zachowanie druku dwustronnego — a następnie przekazujemy obiekt ustawień do 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

Każda właściwość odpowiada standardowemu ustawieniu bufora wydruku. DPI kontroluje rozdzielczość wyjściową — 300 to częsty wybór dla dokumentów biznesowych, a 150 dobrze sprawdza się w szkicach. Grayscale zmniejsza zużycie tonera, gdy kolor nie jest konieczny. Wartości PaperMargins są określane w milimetrach.

Jak wybrać konkretną drukarkę?

Używamy Printer.GetPrinterNames(), aby wyliczyć wszystkie drukarki zainstalowane w systemie, a następnie przypisujemy nazwę docelowej drukarki do 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

Gdy PrinterName nie jest określony, IronPrint kieruje zadanie do domyślnej drukarki systemu operacyjnego. W środowiskach z wieloma drukarkami — wspólnych biurach, magazynach lub pomieszczeniach drukarskich — programowe wyliczanie i wybieranie właściwej drukarki zapobiega błędnemu kierowaniu zadań.

Jak wydrukować wiele dokumentów w partii?

Drukowanie wsadowe przebiega według prostego schematu pętli. Iterujemy po kolekcji ścieżek do plików i wywołujemy Printer.Print() dla każdego dokumentu. Ponieważ każde wywołanie przebiega w tle, cała partia jest przetwarzana bez wyświetlania żadnych okien dialogowych.

: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

Zawijanie każdego wywołania Print() w blok try/catch zapewnia, że jeden uszkodzony plik lub timeout drukarki nie wstrzyma całej partii. W przypadku dużych partii przetwarzanych w usługach działających w tle rejestrowanie każdego wyniku w bazie danych lub systemie monitorowania zapewnia ścieżkę audytu, którą mogą przeglądać zespoły operacyjne.

Jak drukować asynchronicznie bez blokowania wątku?

Metoda Printer.PrintAsync() zwraca Task, co sprawia, że jest kompatybilna ze schematami await. Ma to kluczowe znaczenie w przypadku aplikacji z interfejsem użytkownika, w których blokujące wywołanie PRINT spowodowałoby zawieszenie interfejsu, oraz w przypadku usług obsługujących operacje współbieżne.

: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() akceptuje te same parametry co Print() — ścieżkę do pliku lub tablicę bajtów i opcjonalny obiekt PrintSettings. Przeładowanie async zapobiega wyczerpaniu puli wątków w scenariuszach o dużej przepustowości, w których dziesiątki dokumentów czekają jednocześnie w kolejce do wydruku. Jest to zgodne z tym samym wzorcem asynchronicznym opartym na zadaniach, który jest zalecany w nowoczesnym programowaniu .NET.

Jakie są kwestie związane z platformą?

IronPrint obsługuje drukowanie w tle na platformach stacjonarnych i mobilnych, choć zachowanie różni się w zależności od systemu operacyjnego.

Platforma Ciche drukowanie Uwagi
Windows (7+) Pełne wsparcie Bez dialogu, pelna kontrola PrintSettings
macOS (10+) Obsługiwane Wykorzystuje natywny podsystem drukowania systemu macOS
iOS (11+) Wyświetlony dialog Print() nadal wyswietla systemowy dialog drukowania
Android (API 21+) Wyświetlony dialog Print() nadal wyswietla systemowy dialog drukowania

Na platformach mobilnych ograniczenia systemu operacyjnego uniemożliwiają prawdziwie ciche drukowanie — Printer.Print() zawsze wyświetli natywny dialog drukowania. Na Androidzie wywołanie Printer.Initialize(Android.Content.Context) jest wymagane przed rozpoczęciem jakiejkolwiek operacji drukowania. Platformy stacjonarne (Windows i macOS) obsługują w pełni automatyczne drukowanie w trybie cichym bez żadnych zastrzeżeń.

Jak to się ma do natywnego drukowania w .NET?

Dla zespołów inżynierskich oceniających, czy wdrożyć bibliotekę czy budować na natywnej przestrzeni nazw System.Drawing.Printing, kompromisy wyglądają następująco:

IronPrint System.Drawing.Printing
Obsługiwane formaty PDF, PNG, TIFF, JPEG, GIF, HTML, BMP Wymaga osobnego renderowania
Wierszy konfiguracji 1–3 15–25
Platformy Windows, macOS, iOS, Android Głównie Windows
Wymagany kod zdarzenia PrintPage Nie Tak
Wbudowane renderowanie PDF Tak Nie
Wsparcie asynchroniczne PrintAsync() Ręczne

Podejście natywne sprawdza się w prostych scenariuszach, w których zespół dysponuje już infrastrukturą do renderowania dokumentów. Dla zespołów drukujących pliki PDF, obrazy lub HTML bez istniejącego kodu renderującego, IronPrint eliminuje tygodnie pracy programistycznej i bieżącej konserwacji. 30-procentowy wzrost szybkości drukowania wprowadzony w wydaniu z maja 2025 r. to rodzaj optymalizacji, której wdrożenie we własnym zakresie wymagałoby poświęcenia czasu inżynierów.

Kolejne kroki

Ciche drukowanie za pomocą IronPrint sprowadza się do trzech podstawowych metod: Printer.Print() dla synchronicznego cichego wyjścia, Printer.PrintAsync() dla nieblokującego wykonania i PrintSettings dla pełnej kontroli nad zadaniem drukowania. Łącznie obejmują one scenariusze drukowania pojedynczych dokumentów, drukowania wsadowego oraz drukowania równoległego na platformach stacjonarnych.

Zapoznaj się z samouczkami IronPrint, aby uzyskać bardziej szczegółowe instrukcje, lub przejrzyj Dokumentację API klasy Printer, aby zapoznać się z pełnym zestawem metod. Poradnik dotyczący ustawień drukowania obejmuje dodatkowe opcje konfiguracyjne, takie jak wybór tacy i spłaszczanie.

Rozpocznij bezpłatny 30-dniowy okres próbny, aby przetestować ciche drukowanie w rzeczywistym środowisku — nie jest wymagana karta kredytowa. Gdy wszystko będzie gotowe do wdrożenia, zapoznaj się z opcjami licencyjnymi już od 749 USD.

Porozmawiaj z inżynierem Iron Software, aby uzyskać pomoc w konkretnych scenariuszach wdrożeniowych.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 38,948 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronPrint
uruchom próbkę obserwuj, jak twój dokument trafia do drukarki.