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 npm pdf-to-printer przekształca to wywołanie systemowe w API oparte na obietnicach, które działa w systemach Windows, macOS i Linux, umożliwiając umieszczenie zadania drukowania w kolejce za pomocą jednego wywołania 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. Zainstaluj pakiet: `npm install pdf-to-printer` 2. Zaimportuj moduł: `const printer = require('pdf-to-printer');` 3. Wywołanie `printer.print('./path/to/file.pdf')` — zwraca obietnicę (Promise) 4. Obsługa sukcesu za pomocą `.then()` i błędów za pomocą `.catch()` 5. Przekaż obiekt `printerOpcjas` jako drugi argument, aby wybrać konkretną drukarkę lub ustawić liczbę kopiiJakie są wymagania wstępne do drukowania PDF-ów w Node.js?
Przed użyciem pdf-to-printer wymagane jest Node.js 14.x lub nowsze oraz npm. 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. W systemach macOS i Linux pakiet przekazuje zadanie do polecenia lp, które jest częścią systemu drukowania CUPS. Sprawdź, czy CUPS jest zainstalowany i czy przynajmniej jedna drukarka jest zarejestrowana w lpstat -p.
pdf-to-printer obsługuje wszystkie aktywne wersje Node.js LTS.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 utwórz plik index.js zawierający logikę drukowania oraz folder pdfs/, w którym będą przechowywane dokumenty przeznaczone do wydruku. Oddzielny config.js dla ustawień drukarki pozwala wyłączyć nazwy drukarek z logiki głównej — jest to przydatny wzorzec w przypadku wdrożeń w wielu srodowiskach, gdzie docelowa drukarka różni się w srodowisku programistycznym i produkcyjnym.
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ł gotowe pliki binarne dla wykrytej platformy.
Jak wydrukować plik PDF z podstawowym użyciem?
Przekaż bezwzględną lub względną ścieżkę do pliku 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 błędom w przypadku nieprawidłowej ścieżki lub przeniesienia pliku. Wywołanie fs.access() generuje ENOENT, jeśli ścieżka nie zostanie rozpoznana, co daje opisowy błąd zamiast ogólnego odrzucenia przez bufor wydruku. 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?
Jeśli dokument nie istnieje jeszcze jako plik, należy go wygenerować za pomocą IronPDF for 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?
Przekaż obiekt printerOpcjas jako drugi argument do printer.print(), aby wybrać konkretną drukarkę, ustawić liczbę kopii, wybrać zakres stron lub kontrolować skalowanie stron. Nazwa drukarki musi dokładnie 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 podłączona do sieci i dostępna, oraz dostarcza autorytatywny ciąg znaków, 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 podano nazwy drukarki.Jakie opcje drukarek można skonfigurować?
Obiekt printerOpcjas obsługuje następujące pola:
| Opcja | Typ | Opis | Przykładowa wartość |
|---|---|---|---|
drukarka | ciąg znaków | Dokładna nazwa drukarki, jak zwrócona przez getPrinters() | "HP LaserJet Pro" |
kopie | liczba | Liczba kopii do wydruku | 2 |
strony | ciąg znaków | Zakres stron jako ciąg | '1-3,5' |
skalowanie | ciąg znaków | Tryb skalowania stron | 'dopasuj', 'bezskalowania', 'zmniejsz' |
orientacja | ciąg znaków | 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.
Jak zaimplementować drukowanie wsadowe w Node.js?
Przetwarzaj folder plików PDF lub dynamicznie generowaną listę, iterując tablicę i wywołując printer.print() dla każdego pliku. Użycie for...of z await zapewnia sekwencyjność zadań, co zapobiega przeciążeniu bufora wydruku jednoczesnymi żądaniami.
//: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(), aby pojedynczy brakujący plik nie spowodował przerwania całej partii. Metoda printAll() rejestruje błędy dla poszczególnych plików i zwraca podsumowanie, które można zapisać w dzienniku lub przekazać do usługi monitorującej.
Dla dynamicznie generowanych raportów połącz ten wzór z konwersją HTML ciąg znaków 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 przerwę między zadaniami, jeśli drukarka obsługuje kolejkowanie wydruków w wolnym tempie — 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 wykorzystuje różne polecenia systemowe w każdym systemie operacyjnym. Zrozumienie podstawowego mechanizmu pomaga w diagnozowaniu awarii specyficznych dla platformy.
Jak działa drukowanie PDF w systemie Windows?
W systemie Windows pdf-to-printer uruchamia SumatraPDF za pomocą polecenia 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. Uruchom Get-ExecutionPolicy w PowerShell, aby sprawdzić; jeśli wynikiem jest Restricted, ustaw go na RemoteSigned lub Bypass dla tej sesji.
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?
W systemach macOS i Linux pakiet wywołuje lp (część CUPS). Sprawdź, czy CUPS działa za pomocą lpstat -p — wyświetli to listę wszystkich zarejestrowanych drukarek i ich aktualny 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 w systemie Linux lub włącz tę funkcję w menu Preferencje systemowe > Drukarki w systemie macOS.
Polecenie lp nie obsługuje wszystkich opcji dostępnych w ścieżce SumatraPDF systemu Windows. 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 wyłącznie na drukarkach lokalnych i sieciowych. 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 zadania do każdego żądania drukowania i rejestruje tożsamość użytkownika, ścieżkę pliku oraz znaczniki czasu. Zapisanie this.log w bazie danych lub pliku dziennika tylko do dopisywania zamienia to w trwały zapis audytowy. 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 przekazuj ścieżek plików podanych przez użytkownika bezpośrednio do printer.print() bez ich oczyszczenia.
Jakie są kolejne kroki dla drukowania PDF za pomocą Node.js?
W niniejszym przewodniku omówiono drukowanie istniejących plików PDF na drukarkach lokalnych i sieciowych przy użyciu pdf-to-printer, od podstawowego drukowania pojedynczych plików po kolejki wsadowe, niestandardowe opcje drukarki, kwestie związane z platformą oraz rejestrowanie audytowe dla srodowisk podlegających regulacjom.
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.





