Comment imprimer des fichiers PDF en utilisant Node.js
Imprimer un fichier PDF dans Node.js nécessite d'envoyer le document au spooler d'imprimante du système d'exploitation. Le paquet npm pdf-to-printer abstrait cet appel système en une API basée sur les promesses qui fonctionne sous Windows, macOS et Linux, vous permettant de mettre un travail d'impression en file d'attente en un seul appel de méthode. Pour la génération de PDF avant l'impression -- convertir des HTML, URLs ou modèles en documents prêts à imprimer -- IronPDF for Node.js s'associe naturellement à ce workflow.
Démarrage rapide : Imprimer un fichier PDF dans 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));
Flux de travail minimal (5 étapes)
1. Installez le package : `npm install pdf-to-printer` 2. Importer le module : `const printer = require('pdf-to-printer');` 3. Appel `printer.print('./path/to/file.pdf')` -- renvoie une Promise 4. Traiter les succès avec `.then()` et les erreurs avec `.catch()` 5. Passez un objet `printerOptions` comme deuxième argument pour cibler une imprimante spécifique ou définir le nombre de copiesQuels sont les prérequis pour imprimer des PDFs dans Node.js ?
Node.js 14.x ou une version ultérieure et npm sont requis avant d'utiliser pdf-to-printer. Le package repose sur les commandes d'impression natives de l'OS plutôt qu'un moteur d'impression intégré, donc les pilotes d'imprimante doivent déjà être configurés sur la machine cible.
Sur Windows, le package appelle SumatraPDF via PowerShell. Assurez-vous que l'exécution des scripts PowerShell n'est pas bloquée par votre politique système. Sous macOS et Linux, le paquet délègue à la commande lp, qui fait partie du système d'impression CUPS. Vérifiez que CUPS est installé et qu'au moins une imprimante est enregistrée avec lpstat -p.
Node.js 18.x LTS est recommandé pour les charges de travail en production. Le package pdf-to-printer prend en charge toutes les versions LTS actives de Node.js.)}]
Comment configurer un projet Node.js pour l'impression de PDF ?
Initialisez un nouveau projet, installez le package, et créez une structure de répertoire minimale avant d'écrire toute logique d'impression.
//: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-printer
Après l'installation, créez un fichier index.js pour votre logique d'impression et un dossier pdfs/ pour contenir les documents que vous souhaitez imprimer. Un config.js distinct pour les paramètres d'impression permet d'éviter d'intégrer les noms d'imprimantes dans votre logique principale — un modèle utile pour les déploiements multi-environnements où l'imprimante cible diffère entre le développement et la production.
Le module utilise des liaisons natives qui se résolvent à l'exécution, donc aucune étape de compilation n'est requise. Le répertoire node_modules/pdf-to-printer/dist/ contiendra des binaires précompilés pour la plateforme détectée.
Comment imprimer un fichier PDF avec une utilisation basique ?
Transmettez le chemin d'accès absolu ou relatif au fichier à printer.print(). La méthode met le document en file d'attente avec l'imprimante par défaut du système et résout la Promesse une fois que le travail est accepté par le spooler — pas quand l'impression physique est terminée.
//: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);
}
});
La vérification de l'existence d'un fichier avant d'appeler printer.print() permet d'éviter les échecs silencieux lorsqu'un chemin d'accès est incorrect ou qu'un fichier a été déplacé. L'appel fs.access() génère une exception ENOENT si le chemin d'accès ne peut être résolu, ce qui vous fournit une erreur descriptive plutôt qu'un rejet générique du spooler. Les causes d'erreur courantes incluent des chemins relatifs incorrects, des pilotes d'imprimante manquants, et le statut hors ligne de l'imprimante.
La Promesse est résolue lorsque le travail d'impression est accepté par le spooler de l'OS, pas lorsque le document a terminé l'impression. Pour des raisons d'audit, enregistrez l'horodatage à la résolution plutôt que de supposer que le document a quitté l'imprimante.
Comment générer un PDF avant d'imprimer ?
Si le document n'existe pas encore sous forme de fichier, générez-le avec IronPDF for Node.js avant d'appeler printer.print(). IronPDF rend HTML, URLs, et chaînes de modèles en fichiers PDF prêts à imprimer sans nécessiter une instance de navigateur séparée.
//: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');
Ce modèle est courant dans les workflows de reporting où le contenu PDF est assemblé à l'exécution à partir d'enregistrements de base de données ou de réponses d'API. Consultez le tutoriel de conversion HTML en PDF pour un guide complet des options de rendu d'IronPDF, y compris le support CSS et l'injection d'en-têtes/pieds de page.
Comment spécifier des options d'impression personnalisées ?
Passez un objet printerOptions comme deuxième argument à printer.print() pour cibler une imprimante spécifique, définir le nombre de copies, sélectionner des plages de pages ou contrôler le redimensionnement des pages. Le nom de l'imprimante doit correspondre exactement à la valeur renvoyée par 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 printWithOptions(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}"`);
}
printWithOptions('./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 printWithOptions(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}"`);
}
printWithOptions('./pdfs/shipping-label.pdf').catch(console.error);
L'appel de getPrinters() avant print() a deux objectifs : il confirme que l'imprimante est en ligne et accessible, et il vous fournit la chaîne de nom officielle que le système d'exploitation utilise pour acheminer les travaux d'impression. Les noms d'imprimante incluent souvent des numéros de version ou des suffixes réseau qui diffèrent des noms d'affichage montrés dans les paramètres système.
getPrinters() renvoie la liste des imprimantes à partir du registre. Sur macOS/Linux, elle interroge CUPS. Le drapeau isDefault identifie l'imprimante qui reçoit les travaux lorsqu'aucun nom d'imprimante n'est spécifié.Quelles options d'imprimante peuvent être configurées ?
L'objet printerOptions prend en charge les champs suivants :
| Option | Type de texte | Description du projet | Valeur d'exemple |
|---|---|---|---|
imprimante |
chaîne de caractères | Nom exact de l'imprimante comme renvoyé par getPrinters() |
" HP LaserJet Pro " |
copies |
nombre | Nombre de copies à imprimer | 2 |
pages |
chaîne de caractères | Chaîne de plage de pages | '1-3,5' |
échelle |
chaîne de caractères | Mode de mise à l'échelle de la page | 'fit', 'noscale', 'shrink' |
orientation |
chaîne de caractères | Surcharge d'orientation de la page | " portrait ", " paysage " |
Pour les documents qui nécessitent des tailles de papier personnalisées ou une orientation de page spécifique appliquée lors de la génération de PDF plutôt qu'au moment de l'impression, configurez ces options à l'étape de rendu d'IronPDF avant de sauvegarder le fichier.
Comment puis-je mettre en œuvre l'impression par lots dans Node.js ?
Traitez un dossier de fichiers PDF ou une liste générée dynamiquement en parcourant un tableau et en appelant printer.print() pour chaque fichier. L'utilisation de for...of avec await permet de traiter les tâches de manière séquentielle, ce qui évite que le spouleur d'impression ne soit submergé par des requêtes simultanées.
//: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 printOptions = {
...options,
...(this.printerName && { printer: this.printerName }),
};
await printer.print(filePath, printOptions);
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 printOptions = {
...options,
...(this.printerName && { printer: this.printerName }),
};
await printer.print(filePath, printOptions);
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.`);
})();
La classe BatchPrinter sépare la validation de l'exécution. Les fichiers qui n'existent pas sont ignorés pendant addFiles() afin qu'un seul fichier manquant n'interrompe pas l'ensemble du lot. La méthode printAll() enregistre les erreurs par fichier et renvoie un résumé qui peut être consigné ou transmis à un service de surveillance.
Pour les rapports générés dynamiquement, combinez cette méthode avec la conversion de chaîne HTML en PDF d'IronPDF pour générer et imprimer dans un seul pipeline. Pensez à appliquer l'exemple de compression PDF avant les très grands lots d'impression pour réduire le temps de transfert du spooler sur les imprimantes réseau.
await entre les tâches si l'imprimante prend en charge la mise en file d'attente d'impression de manière lente -- certaines imprimantes réseau plus anciennes rejettent les soumissions successives rapides. Une pause de 200 à 500 ms est généralement suffisante.Quelles sont les considérations spécifiques à la plate-forme pour l'impression de PDF Node.js ?
Le package pdf-to-printer utilise différentes commandes système selon le système d'exploitation. Comprendre le mécanisme sous-jacent aide à diagnostiquer les échecs spécifiques à la plate-forme.
Comment fonctionne l'impression de PDF sur Windows ?
Sous Windows, pdf-to-printer fait appel à SumatraPDF via une commande PowerShell. SumatraPDF est fourni avec le package — aucune installation séparée n'est nécessaire. L'exécution des scripts PowerShell doit être autorisée conformément à la politique d'exécution en cours. Exécutez Get-ExecutionPolicy dans PowerShell pour vérifier ; Si le résultat est Restricted, remplacez-le par RemoteSigned ou Bypass pour la session.
Les noms d'imprimante sur Windows sont sensibles à la casse et doivent correspondre exactement à la valeur affichée dans Paramètres > Bluetooth et appareils > Imprimantes et scanners, y compris tout suffixe réseau entre parenthèses.
Comment fonctionne l'impression de PDF sur macOS et Linux ?
Sous macOS et Linux, le paquet appelle lp (qui fait partie de CUPS). Vérifiez que CUPS est en cours d'exécution avec lpstat -p -- cela répertorie toutes les imprimantes enregistrées et leur état actuel. Si aucune imprimante n'apparaît, le service CUPS n'est peut-être pas démarré ; Utilisez sudo systemctl start cups sous Linux ou activez-le via Préférences Système > Imprimantes sur macOS.
La commande lp ne prend pas en charge toutes les options disponibles avec le chemin d'accès SumatraPDF de Windows. Les options scale et orientation peuvent ne pas avoir d'effet sur l'impression via CUPS selon le pilote d'imprimante. Testez sur le matériel cible avant de déployer.
pdf-to-printer n'imprime actuellement que sur des imprimantes locales et réseau. Les services d'impression cloud tels que Microsoft Universal Print ne sont pas supportés via ce package.Comment gérer la sécurité et les permissions lors de l'impression de PDFs ?
Les systèmes d'impression de production qui traitent des documents sensibles — contrats, états financiers, formulaires médicaux — nécessitent des contrôles d'accès et des pistes d'audit. Le suivi de qui a imprimé quoi et quand est une exigence de conformité dans de nombreuses industries réglementées.
//: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'));
})();
La classe AuditedPrinter attribue un identifiant de tâche unique à chaque demande de PRINT et enregistre l'identité de l'utilisateur, le chemin d'accès au fichier et les horodatages. L'enregistrement de this.log dans une base de données ou un fichier journal en mode ajout seul en fait un enregistrement d'audit durable. Pour les documents contenant des informations personnellement identifiables, envisagez d'utiliser les fonctionnalités de chiffrement de PDF d'IronPDF pour protéger les fichiers au repos avant qu'ils n'atteignent la file d'attente de l'imprimante.
Pour les applications serveur qui acceptent les demandes d'impression via HTTP, validez le type de fichier et la taille avant d'imprimer — rejetez tout téléchargement qui n'est pas un binaire PDF valide. Ne transmettez jamais les chemins d'accès aux fichiers fournis par l'utilisateur directement à printer.print() sans les avoir préalablement nettoyés.
Stockez les journaux d'audit en dehors du répertoire d'écriture de l'application. Un attaquant avec accès en écriture au système de fichiers ne doit pas pouvoir modifier les enregistrements des impressions.
Quelles sont les prochaines étapes pour l'impression de PDF Node.js ?
Ce guide a abordé l'impression de fichiers PDF existants sur des imprimantes locales et réseau à l'aide de pdf-to-printer, de l'impression de base d'un seul fichier aux files d'attente par lots, en passant par les options d'impression personnalisées, les considérations relatives à la plate-forme et la journalisation d'audit pour les environnements réglementés.
Pour étendre ce workflow avec la génération de PDF, commencez un essai gratuit de IronPDF for Node.js et suivez le tutoriel HTML en PDF pour créer un pipeline documentaire de bout en bout. Pour les options de licence et les prix en volume, veuillez consulter la page de licence IronPDF.
Prêt pour aller plus loin ? Explorez la collection complète de mode d'emploi IronPDF for Node.js pour apprendre comment fusionner des fichiers PDF, compresser des fichiers PDF, et convertir des PDFs en images.
Questions Fréquemment Posées
Quel est le moyen le plus simple d'imprimer des fichiers PDF dans Node.js ?
Utilisez le package npm pdf-to-printer. Installez-le avec npm install pdf-to-printer, puis appelez printer.print('./file.pdf') -- cela renvoie une Promise et met en file d'attente la tâche avec l'imprimante par défaut du système en un seul appel.
Quelles sont les conditions préalables à l'impression de PDF dans Node.js ?
Node.js 14.x ou version supérieure, npm, et un pilote d'imprimante configuré sur l'ordinateur hôte. Sous Windows, la stratégie d'exécution PowerShell doit autoriser l'exécution de scripts. Sous macOS et Linux, CUPS doit être installé et en cours d'exécution, avec au moins une imprimante enregistrée via lpstat -p.
Comment imprimer vers une imprimante spécifique dans Node.js ?
Passez un objet printerOptions en tant que second argument à printer.print(). Réglez le champ printer sur le nom exact de l'imprimante retourné par printer.getPrinters(). Les noms d'imprimante sont sensibles à la casse et doivent correspondre exactement à l'entrée du registre OS.
Puis-je générer un PDF et l'imprimer ensuite dans le même script Node.js ?
Oui. Utilisez IronPDF for Node.js pour générer le fichier d'abord : appelez PdfDocument.fromHtml(html) pour rendre le contenu HTML, sauvegardez-le avec pdf.saveAs(path), puis passez ce chemin à printer.print(path). Installez IronPDF avec npm install @ironsoftware/ironpdf.
pdf-to-printer fonctionne-t-il sur macOS et Linux ?
Oui. Sur macOS et Linux, le package délègue à la commande lp de CUPS. Confirmez que CUPS fonctionne avec lpstat -p. Notez que les options scale et orientation peuvent ne pas prendre effet sur tous les pilotes d'imprimante CUPS.
Comment ajouter un journal de suivi des audits pour les tâches d'impression dans Node.js ?
Enveloppez printer.print() dans une classe attribuant un ID de tâche unique en utilisant crypto.randomBytes(8).toString('hex') et enregistre le chemin du fichier, l'ID utilisateur et les horodatages. Conservez le tableau de journal dans une base de données ou un fichier en append-only en dehors du répertoire accessible en écriture de l'application.

