Jak drukować pliki PDF za pomocą Node.js
Aby wydrukować plik PDF w Node.js, trzeba wysłać dokument do spoolera wydruków systemu operacyjnego. Pakiet pdf-to-printer npm abstrahuje to wywołanie systemowe w API oparte na obietnicach, które działa na Windows, macOS i Linux, umożliwiając kolejkowanie zadania drukowania w jednym wywołaniu metody. Do generowania PDF-ów przed wydrukiem — konwersji HTML, URL-i lub szablonów na dokumenty gotowe do druku — IronPDF dla Node.js naturalnie współpracuje z tym przepływem pracy.
Szybki start: Wydrukuj plik PDF w Node.js
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/quickstart.js
// 1. Install: npm install pdf-to-printer
const printer = require('pdf-to-printer');
// 2. Print the PDF file (returns a Promise)
printer
.print('./invoice.pdf')
.then(() => console.log('Print job queued successfully.'))
.catch((err) => console.error('Print failed:', err));//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/quickstart.js
// 1. Install: npm install pdf-to-printer
const printer = require('pdf-to-printer');
// 2. Print the PDF file (returns a Promise)
printer
.print('./invoice.pdf')
.then(() => console.log('Print job queued successfully.'))
.catch((err) => console.error('Print failed:', err));Minimalny przebieg pracy (5 kroków)
1. Zainstalować pakiet: `npm install pdf-to-printer` 2. Importować moduł: `const printer = require('pdf-to-printer');` 3. Wywołać `printer.print('./path/to/file.pdf')` — zwraca Obietnicę 4. Obsłużyć sukces za pomocą `.then()` i błędy za pomocą `.catch()` 5. Przekazać obiekt `printerOpcjas` jako drugi argument, aby celować w konkretną drukarkę lub ustawić ilość kopiiJakie są wymagania wstępne do drukowania PDF-ów w Node.js?
Node.js 14.x lub nowszy i npm są wymagane przed użyciem pdf-to-printer. Pakiet polega na natywnych komendach wydruku systemu operacyjnego zamiast wbudowanego silnika drukującego, więc sterowniki drukarki muszą już być skonfigurowane na docelowej maszynie.
Na Windows pakiet wywołuje SumatraPDF za pomocą PowerShell. Upewnij się, że wykonanie skryptów PowerShell nie jest blokowane przez zasady systemowe. Na macOS i Linux, pakiet deleguje do polecenia lp, które jest częścią systemu drukowania CUPS. Potwierdź, że CUPS jest zainstalowany i że przynajmniej jedna drukarka jest zarejestrowana za pomocą lpstat -p.
pdf-to-printer obsługuje wszystkie aktywne wersje LTS Node.js.Jak skonfigurować projekt Node.js do drukowania PDF-ów?
Zainicjuj nowy projekt, zainstaluj pakiet i stwórz minimalną strukturę katalogów przed napisaniem jakiejkolwiek logiki drukowania.
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/setup.sh
mkdir pdf-printer
cd pdf-printer
npm init -y
npm install pdf-to-printer//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/setup.sh
mkdir pdf-printer
cd pdf-printer
npm init -y
npm install pdf-to-printerPo instalacji, utworzyć plik index.js dla swojej logiki drukowania i folder pdfs/, aby przechowywać dokumenty, które chcesz wydrukować. Oddzielny config.js dla ustawień drukarki utrzymuje nazwy drukarek poza twoją logiką główną — użyteczny wzorzec dla wdrożeń wielośrodowiskowych, gdzie docelowa drukarka różni się między tworzeniem a produkcją.
Moduł używa natywnych wiązań, które rozwiązują się w czasie wykonywania, więc nie ma potrzeby wykonywania etapu kompilacji. Katalog node_modules/pdf-to-printer/dist/ będzie zawierać wstępnie zbudowane binaria dla wykrytego systemu operacyjnego.
Jak wydrukować plik PDF z podstawowym użyciem?
Przekazać ścieżkę pliku absolutną lub względną do printer.print(). Metoda umieszcza dokument w kolejkach z domyślną drukarką systemu i rozwiązuje Obietnicę, gdy zadanie zostanie zaakceptowane przez spooler — nie w momencie zakończenia wydruku fizycznego.
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/basic-print.js
const fs = require('fs').promises;
const printer = require('pdf-to-printer');
async function printPDF(filePath) {
// Verify the file exists before sending to printer
await fs.access(filePath);
const stats = await fs.stat(filePath);
if (stats.size === 0) {
throw new Error('PDF file is empty');
}
await printer.print(filePath);
console.log(`Print job queued: ${filePath}`);
}
printPDF('./pdfs/invoice.pdf').catch((err) => {
if (err.code === 'ENOENT') {
console.error('File not found:', err.path);
} else {
console.error('Print error:', err.message);
}
});//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/basic-print.js
const fs = require('fs').promises;
const printer = require('pdf-to-printer');
async function printPDF(filePath) {
// Verify the file exists before sending to printer
await fs.access(filePath);
const stats = await fs.stat(filePath);
if (stats.size === 0) {
throw new Error('PDF file is empty');
}
await printer.print(filePath);
console.log(`Print job queued: ${filePath}`);
}
printPDF('./pdfs/invoice.pdf').catch((err) => {
if (err.code === 'ENOENT') {
console.error('File not found:', err.path);
} else {
console.error('Print error:', err.message);
}
});Sprawdzenie istnienia pliku przed wywołaniem printer.print() zapobiega cichym awariom, gdy ścieżka jest błędna lub plik został przeniesiony. Wywołanie fs.access() wyrzuca ENOENT, jeśli ścieżka nie zostanie rozwiązana, dając ci opisowy błąd zamiast ogólnego odrzucenia przez drukarkę. Częste przyczyny błędów obejmują nieprawidłowe ścieżki względne, brakujące sterowniki drukarek oraz status offline drukarek.
Jak wygenerować PDF przed drukowaniem?
Gdy dokument nie istnieje jeszcze jako plik, wygenerować go przy użyciu IronPDF dla Node.js przed wywołaniem printer.print(). IronPDF renderuje HTML, URL-e oraz ciągi szablonów na gotowe do druku pliki PDF bez potrzeby oddzielnego uruchomienia przeglądarki.
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/generate-and-print.js
const { PdfDocument } = require('@ironsoftware/ironpdf');
const printer = require('pdf-to-printer');
async function generateAndPrint(htmlContent, outputPath) {
// Render HTML to a PDF file using IronPDF
const pdf = await PdfDocument.fromHtml(htmlContent);
await pdf.saveAs(outputPath);
// Send the generated file to the default printer
await printer.print(outputPath);
console.log(`Generated and printed: ${outputPath}`);
}
generateAndPrint('<h1>Monthly Report</h1><p>Sales data for May 2026.</p>', './pdfs/report.pdf');//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/generate-and-print.js
const { PdfDocument } = require('@ironsoftware/ironpdf');
const printer = require('pdf-to-printer');
async function generateAndPrint(htmlContent, outputPath) {
// Render HTML to a PDF file using IronPDF
const pdf = await PdfDocument.fromHtml(htmlContent);
await pdf.saveAs(outputPath);
// Send the generated file to the default printer
await printer.print(outputPath);
console.log(`Generated and printed: ${outputPath}`);
}
generateAndPrint('<h1>Monthly Report</h1><p>Sales data for May 2026.</p>', './pdfs/report.pdf');Ten wzór jest powszechny w przepływach raportowych, gdzie treść PDF jest zgromadzona w czasie wykonywania z rekordów baz danych lub odpowiedzi API. Zobacz samouczek konwersji HTML do PDF na pełną lekcję dotyczącą opcji renderingu IronPDF, w tym wsparcie CSS i wstawianie nagłówków/stopek.
Jak określić niestandardowe opcje drukarki?
Przekazać obiekt printerOpcjas jako drugi argument do printer.print(), aby celować w konkretną drukarkę, ustawić ilość kopii, wybrać zakresy stron lub kontrolować skalowanie stron. Nazwa drukarki musi być dokładna i odpowiadać wartości zwracanej przez printer.getPrinters().
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/custom-options.js
const printer = require('pdf-to-printer');
async function printWithOpcjas(filePath) {
// List available printers to find the correct name
const printers = await printer.getPrinters();
printers.forEach((p) => {
console.log(`${p.name} -- default: ${p.isDefault}`);
});
const options = {
printer: 'HP LaserJet Pro', // Exact name from getPrinters()
copies: 2, // Number of copies
pages: '1-3,5', // Pages to print (optional)
scale: 'fit', // 'fit' | 'noscale' | 'shrink'
orientation: 'portrait', // 'portrait' | 'landscape'
};
await printer.print(filePath, options);
console.log(`Printed ${options.copies} copies to "${options.printer}"`);
}
printWithOpcjas('./pdfs/shipping-label.pdf').catch(console.error);//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/custom-options.js
const printer = require('pdf-to-printer');
async function printWithOpcjas(filePath) {
// List available printers to find the correct name
const printers = await printer.getPrinters();
printers.forEach((p) => {
console.log(`${p.name} -- default: ${p.isDefault}`);
});
const options = {
printer: 'HP LaserJet Pro', // Exact name from getPrinters()
copies: 2, // Number of copies
pages: '1-3,5', // Pages to print (optional)
scale: 'fit', // 'fit' | 'noscale' | 'shrink'
orientation: 'portrait', // 'portrait' | 'landscape'
};
await printer.print(filePath, options);
console.log(`Printed ${options.copies} copies to "${options.printer}"`);
}
printWithOpcjas('./pdfs/shipping-label.pdf').catch(console.error);Wywołanie getPrinters() przed print() służy dwóm celom: potwierdza, że drukarka jest online i osiągalna, oraz daje ci autorytatywny ciąg nazwy, którego system operacyjny używa do kierowania zadań drukowania. Nazwy drukarek często zawierają numery wersji lub rozszerzenia sieciowe, które różnią się od nazw wyświetlanych w ustawieniach systemowych.
getPrinters() zwraca listę drukarek z rejestru. Na macOS/Linux, zapytuje CUPS. Flaga isDefault identyfikuje drukarkę, która odbiera zadania, gdy nie określono nazwy drukarki.Jakie opcje drukarek można skonfigurować?
Obiekt printerOpcjas wspiera następujące pola:
| Opcja | Typ | Opis | Przykładowa wartość |
|---|---|---|---|
drukarka | string | Dokładna nazwa drukarki, jak zwrócona przez getPrinters() | "HP LaserJet Pro" |
kopie | number | Liczba kopii do wydruku | 2 |
strony | string | Zakres stron jako ciąg | '1-3,5' |
skalowanie | string | Tryb skalowania stron | 'dopasuj', 'bezskalowania', 'zmniejsz' |
orientacja | string | Nadpisanie orientacji strony | 'portret', 'landscape' |
Dla dokumentów, które wymagają niestandardowych rozmiarów papieru lub określonej orientacji stron zastosowanej podczas generacji PDF, a nie w czasie drukowania, skonfiguruj te opcje na etapie renderingu IronPDF przed zapisaniem pliku.
IronSuite odgrywa kluczową rolę w naszej działalności. Są to narzędzia zwiększające wydajność w całej firmie, w tym tworzenie planów pięter i poprawa zarządzania zapasami.
Jak zaimplementować drukowanie wsadowe w Node.js?
Przetwórz folder plików PDF lub dynamicznie utworzoną listę, iterując tablicę i wywołując printer.print() dla każdego pliku. Użycie for...of z await utrzymuje prace sekwencyjne, co zapobiega przeciążeniu kolejki drukarki przez jednoczesne żądania.
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/batch-print.js
const printer = require('pdf-to-printer');
const fs = require('fs').promises;
const path = require('path');
class BatchPrinter {
constructor(printerName = null) {
this.printerName = printerName;
this.queue = [];
}
async addFiles(filePaths) {
for (const filePath of filePaths) {
try {
await fs.access(filePath);
this.queue.push(filePath);
} catch {
console.warn(`Skipped (not found): ${filePath}`);
}
}
}
async printAll(options = {}) {
const results = { successful: 0, failed: 0, errors: [] };
for (const filePath of this.queue) {
try {
const printOpcjas = {
...options,
...(this.printerName && { printer: this.printerName }),
};
await printer.print(filePath, printOpcjas);
results.successful++;
console.log(`Printed: ${path.basename(filePath)}`);
} catch (err) {
results.failed++;
results.errors.push({ file: filePath, error: err.message });
}
}
this.queue = [];
return results;
}
}
// Usage: print monthly reports to a specific printer
(async () => {
const batch = new BatchPrinter('Office Printer A3');
await batch.addFiles([
'./reports/january.pdf',
'./reports/february.pdf',
'./reports/march.pdf',
]);
const results = await batch.printAll({ copies: 1 });
console.log(`Done -- ${results.successful} printed, ${results.failed} failed.`);
})();//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/batch-print.js
const printer = require('pdf-to-printer');
const fs = require('fs').promises;
const path = require('path');
class BatchPrinter {
constructor(printerName = null) {
this.printerName = printerName;
this.queue = [];
}
async addFiles(filePaths) {
for (const filePath of filePaths) {
try {
await fs.access(filePath);
this.queue.push(filePath);
} catch {
console.warn(`Skipped (not found): ${filePath}`);
}
}
}
async printAll(options = {}) {
const results = { successful: 0, failed: 0, errors: [] };
for (const filePath of this.queue) {
try {
const printOpcjas = {
...options,
...(this.printerName && { printer: this.printerName }),
};
await printer.print(filePath, printOpcjas);
results.successful++;
console.log(`Printed: ${path.basename(filePath)}`);
} catch (err) {
results.failed++;
results.errors.push({ file: filePath, error: err.message });
}
}
this.queue = [];
return results;
}
}
// Usage: print monthly reports to a specific printer
(async () => {
const batch = new BatchPrinter('Office Printer A3');
await batch.addFiles([
'./reports/january.pdf',
'./reports/february.pdf',
'./reports/march.pdf',
]);
const results = await batch.printAll({ copies: 1 });
console.log(`Done -- ${results.successful} printed, ${results.failed} failed.`);
})();Klasa BatchPrinter oddziela walidację od wykonania. Pliki, które nie istnieją, są pomijane podczas addFiles(), więc pojedynczy brakujący plik nie przerywa całej partii. Metoda printAll() rejestruje błędy dla każdego pliku i zwraca podsumowanie, które można zapisać do dziennika lub przesłać do usługi monitorowania.
Dla dynamicznie generowanych raportów połącz ten wzór z konwersją HTML string na PDF IronPDF, aby generować i drukować w jednym potoku. Przykład kompresji PDF warto zastosować przed dużymi partiami drukowania, aby skrócić czas transferu spoolera na drukarkach sieciowych.
await opóźnienie między zadaniami, jeśli drukarka powoli obsługuje kolejkowanie wydruków — niektóre starsze drukarki sieciowe odrzucają szybkie kolejne zgłoszenia. Przerwa 200-500 ms jest zwykle wystarczająca.Jakie są uwagi dotyczące konkretnych platform przy drukowaniu PDF za pomocą Node.js?
Pakiet pdf-to-printer używa różnych poleceń systemowych na każdym systemie operacyjnym. Zrozumienie podstawowego mechanizmu pomaga w diagnozowaniu awarii specyficznych dla platformy.
Jak działa drukowanie PDF w systemie Windows?
Na Windows, pdf-to-printer używa powłoki zewnętrznej do SumatraPDF przez polecenie PowerShell. SumatraPDF jest dołączona do pakietu – nie jest potrzebna osobna instalacja. Wykonywanie skryptów PowerShell musi być dozwolone zgodnie z bieżącą polityką wykonania. Uruchomić Get-ExecutionPolicy w PowerShell, aby sprawdzić; jeśli wynik to Restricted, ustawić na RemoteSigned lub Bypass na sesję.
Nazwy drukarek w systemie Windows są wrażliwe na wielkość liter i muszą dokładnie odpowiadać wartości pokazanej w Ustawienia > Bluetooth i urządzenia > Drukarki i skanery, wliczając jakikolwiek sieciowy sufiks w nawiasach.
Jak działa drukowanie PDF na macOS i Linuxie?
Na macOS i Linux pakiet wywołuje lp (część CUPS). Potwierdź, że CUPS jest uruchomiony, za pomocą lpstat -p — wyświetli to listę wszystkich zarejestrowanych drukarek i ich obecny status. Jeśli drukarki się nie pojawiają, może być tak, że usługa CUPS nie została uruchomiona; użyj sudo systemctl start cups na Linux lub włącz to poprzez Preferencje systemowe > Drukarki na macOS.
Polecenie lp nie obsługuje wszystkich tych samych opcji co ścieżka Windows SumatraPDF. Opcje scale i orientation mogą nie mieć wpływu na drukowanie oparte na CUPS w zależności od sterownika drukarki. Przetestuj na docelowym sprzęcie przed wdrożeniem.
pdf-to-printer obecnie drukuje tylko na lokalne i sieciowe drukarki. Usługi drukowania w chmurze, takie jak Microsoft Universal Print, nie są obsługiwane przez ten pakiet.Jak obsługiwać bezpieczeństwo i uprawnienia przy drukowaniu PDF?
Systemy drukowania produkcyjnego, które przetwarzają poufne dokumenty – umowy, dokumenty finansowe, formularze medyczne – potrzebują kontroli dostępu i rejestrów audytowych. Śledzenie, kto wydrukował co i kiedy, jest wymogiem wymogiem regulacyjnym w wielu branżach o rygorystycznych przepisach.
//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/secure-print.js
const printer = require('pdf-to-printer');
const crypto = require('crypto');
class AuditedPrinter {
constructor() {
this.log = [];
}
async print(filePath, userId, options = {}) {
const jobId = crypto.randomBytes(8).toString('hex');
const entry = { jobId, userId, filePath, options, status: 'pending', startedAt: new Date().toISOString() };
this.log.push(entry);
try {
await printer.print(filePath, options);
entry.status = 'completed';
entry.completedAt = new Date().toISOString();
return { success: true, jobId };
} catch (err) {
entry.status = 'failed';
entry.error = err.message;
throw err;
}
}
getLog(userId = null) {
return userId ? this.log.filter((e) => e.userId === userId) : this.log;
}
}
// Usage
const auditedPrinter = new AuditedPrinter();
(async () => {
await auditedPrinter.print('./contracts/nda-2026.pdf', 'user-42', { copies: 1 });
console.log('Audit log:', auditedPrinter.getLog('user-42'));
})();//:path=/static-assets/pdf/content-code-examples/nodejs/how-to/nodejs-print-pdf/secure-print.js
const printer = require('pdf-to-printer');
const crypto = require('crypto');
class AuditedPrinter {
constructor() {
this.log = [];
}
async print(filePath, userId, options = {}) {
const jobId = crypto.randomBytes(8).toString('hex');
const entry = { jobId, userId, filePath, options, status: 'pending', startedAt: new Date().toISOString() };
this.log.push(entry);
try {
await printer.print(filePath, options);
entry.status = 'completed';
entry.completedAt = new Date().toISOString();
return { success: true, jobId };
} catch (err) {
entry.status = 'failed';
entry.error = err.message;
throw err;
}
}
getLog(userId = null) {
return userId ? this.log.filter((e) => e.userId === userId) : this.log;
}
}
// Usage
const auditedPrinter = new AuditedPrinter();
(async () => {
await auditedPrinter.print('./contracts/nda-2026.pdf', 'user-42', { copies: 1 });
console.log('Audit log:', auditedPrinter.getLog('user-42'));
})();Klasa AuditedPrinter przypisuje unikalny identyfikator pracy do każdego żądania drukowania i rejestruje tożsamość użytkownika, ścieżkę pliku i sygnatury czasowe. Utrwalenie this.log w bazie danych lub w pliku dziennika tylko do dodawania zamienia to w trwały zapis audytu. Dla dokumentów zawierających informacje umożliwiające identyfikację osoby, rozważ użycie funkcji szyfrowania PDF IronPDF, aby chronić pliki w spoczynku przed osiągnięciem kolejki drukarki.
W przypadku aplikacji serwerowych akceptujących żądania drukowania przez HTTP, zweryfikuj typ pliku i rozmiar przed drukowaniem – odrzucaj każdy upload, który nie jest prawidłowym binarnym PDF-em. Nigdy nie przesyłaj ścieżek plików dostarczonych przez użytkownika bezpośrednio do printer.print() bez sanitizacji.
Jakie są kolejne kroki dla drukowania PDF za pomocą Node.js?
Niniejszy przewodnik obejmował drukowanie istniejących plików PDF na drukarki lokalne i sieciowe za pomocą pdf-to-printer, od podstawowego drukowania pojedynczych plików po kolejki zadań, niestandardowe opcje drukarki, kwestie platformowe i rejestrowanie audytów dla środowisk regulowanych.
Aby rozszerzyć ten przepływ pracy o generowanie PDF, rozpocznij darmowy okres próbny IronPDF for Node.js i postępuj zgodnie z samouczkiem HTML do PDF, aby zbudować kompletny przepływ dokumentów. Aby uzyskać opcje licencji i ceny hurtowe, zobacz stronę licencjonowania IronPDF.
Czy jesteś gotów pójść dalej? Poznaj pełną kolekcję poradników IronPDF for Node.js, aby dowiedzieć się, jak scalić pliki PDF, kompresować pliki PDF i konwertować PDF na obrazy.
Często Zadawane Pytania
Jaki jest najprostszy sposób drukowania plików PDF w Node.js?
Użyj pakietu npm pdf-to-printer. Zainstaluj go za pomocą npm install pdf-to-printer, a następnie wywołaj printer.print('./file.pdf') -- zwraca Obietnicę i umieszcza zadanie w kolejce domyślnej drukarki systemowej w jednym wywołaniu.
Jakie są wymogi wstępne do drukowania PDF-ów w Node.js?
Node.js 14.x lub wyższy, npm oraz skonfigurowany sterownik drukarki na maszynie-host. Na Windows, polityka wykonywania PowerShell musi umożliwiać wykonywanie skryptów. Na macOS oraz Linux, CUPS musi być zainstalowany i działać, z przynajmniej jedną drukarką zarejestrowaną przez lpstat -p.
Jak drukować na określoną drukarkę w Node.js?
Przekaż obiekt printerOptions jako drugi argument do printer.print(). Ustaw pole printer na dokładną nazwę drukarki zwróconą przez printer.getPrinters(). Nazwy drukarek są uwzględniające wielkość liter i muszą dokładnie odpowiadać wpisowi w rejestrze systemu operacyjnego.
Czy mogę wygenerować PDF, a następnie go wydrukować w tym samym skrypcie Node.js?
Tak. Użyj IronPDF dla Node.js, aby najpierw wygenerować plik: wywołaj PdfDocument.fromHtml(html), aby wyrenderować treść HTML, zapisz go za pomocą pdf.saveAs(path), a potem przekaż tę ścieżkę do printer.print(path). Zainstaluj IronPDF za pomocą npm install @ironsoftware/ironpdf.
Czy pdf-to-printer działa na macOS i Linux?
Tak. Na macOS i Linux pakiet deleguje do polecenia lp z CUPS. Potwierdź, że CUPS działa za pomocą lpstat -p. Zauważ, że opcje scale i orientation mogą nie działać na wszystkich sterownikach drukarek CUPS.
Jak dodać dziennik audytu zadań drukowania w Node.js?
Owiń printer.print() w klasę, która przypisuje unikalny identyfikator zadania za pomocą crypto.randomBytes(8).toString('hex') i rejestruje ścieżkę pliku, ID użytkownika i znaczniki czasu. Przechowuj tablicę dziennika w bazie danych lub pliku tylko do dodawania danych, poza zapisywaną przez aplikację ścieżką katalogu.





