Como imprimir arquivos PDF usando Node.js
Imprimir um arquivo PDF em Node.js requer o envio do documento para o spooler de impressão do sistema operacional. O pacote npm pdf-to-printer abstrai essa chamada de sistema em uma API baseada em promessas que funciona no Windows, macOS e Linux, permitindo que você enfileire um trabalho de impressão em uma única chamada de método. Para geração de PDF antes da impressão — convertendo HTML, URLs ou modelos em documentos prontos para impressão — o IronPDF for Node.js combina naturalmente com este fluxo de trabalho.
Início Rápido: Imprimir um arquivo PDF em 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));
Fluxo de trabalho mínimo (5 etapas)
1. Instale o pacote: `npm install pdf-to-printer` 2. Importe o módulo: `const printer = require('pdf-to-printer');` 3. Chame `printer.print('./path/to/file.pdf')` -- retorna uma Promessa 4. Trata sucesso com `.then()` e erros com `.catch()` 5. Passe um objeto `printerOptions` como o segundo argumento para direcionar uma impressora específica ou configurar a quantidade de cópiasQuais são os pré-requisitos para imprimir PDFs em Node.js?
Node.js 14.x ou posterior e npm são necessários antes de usar pdf-to-printer. O pacote depende de comandos de impressão nativos do SO em vez de um mecanismo de impressão embutido, portanto, os drivers de impressora já devem estar configurados na máquina de destino.
No Windows, o pacote chama SumatraPDF via PowerShell. Certifique-se de que a execução de scripts do PowerShell não esteja bloqueada pela política do seu sistema. No macOS e Linux, o pacote delega ao comando lp, que faz parte do sistema de impressão CUPS. Confirme se o CUPS está instalado e se pelo menos uma impressora está registrada com lpstat -p.
pdf-to-printer suporta todas as versões LTS ativas do Node.js.Como configuro um projeto Node.js para impressão de PDF?
Inicialize um novo projeto, instale o pacote e crie uma estrutura de diretório mínima antes de escrever qualquer lógica de impressão.
//: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
Após a instalação, crie um arquivo index.js para sua lógica de impressão e uma pasta pdfs/ para armazenar os documentos que você deseja imprimir. Um config.js separado para configurações de impressora mantém os nomes das impressoras fora da sua lógica central -- um padrão útil para implantações em vários ambientes onde a impressora de destino difere entre desenvolvimento e produção.
O módulo usa bindings nativos que são resolvidos em tempo de execução, portanto, nenhum passo de compilação é necessário. O diretório node_modules/pdf-to-printer/dist/ conterá binários pré-compilados para a plataforma detectada.
Como imprimo um arquivo PDF com uso básico?
Passe o caminho do arquivo absoluto ou relativo para printer.print(). O método coloca o documento em fila com a impressora padrão do sistema e resolve a Promessa assim que o trabalho é aceito pelo spooler — não quando a impressão física é concluída.
//: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);
}
});
Verificar a existência do arquivo antes de chamar printer.print() previne falhas silenciosas quando um caminho está errado ou um arquivo foi movido. A chamada fs.access() lança ENOENT se o caminho não for resolvido, dando-lhe um erro descritivo em vez de uma rejeição genérica do spooler. As causas comuns de erros incluem caminhos relativos incorretos, drivers de impressora ausentes e status offline da impressora.
Como gero um PDF antes de imprimir?
Quando o documento ainda não existe como um arquivo, gere-o com IronPDF for Node.js antes de chamar printer.print(). IronPDF renderiza HTML, URLs e cadeias de caracteres modelo em arquivos PDF prontos para impressão sem exigir uma instância de navegador separada.
//: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');
Esse padrão é comum em fluxos de trabalho de relatórios, onde o conteúdo do PDF é montado em tempo de execução a partir de registros de banco de dados ou respostas de API. Veja o tutorial de conversão de HTML para PDF para um guia completo das opções de renderização do IronPDF, incluindo suporte a CSS e injeção de cabeçalho/rodapé.
Como faço para especificar opções de impressora personalizadas?
Passe um objeto printerOptions como o segundo argumento para printer.print() para direcionar uma impressora específica, definir a quantidade de cópias, selecionar intervalos de páginas ou controlar a escala da página. O nome da impressora deve corresponder exatamente ao valor retornado por 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);
Chamar getPrinters() antes de print() serve a dois propósitos: ele confirma que a impressora está online e acessível, e fornece a string de nome autoritativa que o sistema operacional usa para rotear trabalhos de impressão. Os nomes das impressoras geralmente incluem números de versão ou sufixos de rede que diferem dos nomes de exibição mostrados nas configurações do sistema.
getPrinters() retorna a lista de impressoras do registro. No macOS/Linux, ele consulta o CUPS. A flag isDefault identifica a impressora que recebe trabalhos quando nenhum nome de impressora é especificado.Quais opções de impressora podem ser configuradas?
O objeto printerOptions suporta os seguintes campos:
| Opção | Tipo | Descrição | Exemplo de valor |
|---|---|---|---|
printer |
string | Nome exato da impressora como retornado por getPrinters() |
'HP LaserJet Pro' |
copies |
number | Número de cópias a imprimir | 2 |
pages |
string | Cadeia de caracteres de intervalo de páginas | '1-3,5' |
scale |
string | Modo de escalonamento de página | 'fit' , 'noscale' , 'shrink' |
orientation |
string | Substituição da orientação da página | 'portrait' , 'landscape' |
Para documentos que precisam de tamanhos de papel personalizados ou de uma orientação de página específica aplicada durante a geração de PDF em vez de no momento da impressão, configure essas opções na etapa de renderização do IronPDF antes de salvar o arquivo.
O IronSuite desempenha um papel crucial nas nossas operações. Estas são ferramentas que aumentam a eficiência no negócio, incluindo a criação de plantas baixas e melhoria na gestão de inventário.
Como posso implementar impressão em lote em Node.js?
Processar uma pasta de arquivos PDF ou uma lista gerada dinamicamente por meio de iteração de um array e chamar printer.print() para cada arquivo. Usar for...of com await mantém os trabalhos sequenciais, o que impede que o spooler de impressão fique sobrecarregado com solicitações simultâneas.
//: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.`);
})();
A classe BatchPrinter separa a validação da execução. Arquivos que não existem são ignorados durante addFiles() para que um único arquivo ausente não aborte todo o lote. O método printAll() registra erros por arquivo e retorna um resumo que pode ser registrado ou encaminhado para um serviço de monitoramento.
Para relatórios gerados dinamicamente, combine este padrão com a conversão de string HTML para PDF do IronPDF para gerar e imprimir em um único pipeline. O exemplo de compressão de PDF vale a pena aplicar antes de lotes de impressão grandes para reduzir o tempo de transferência do spooler em impressoras de rede.
await entre os trabalhos se a impressora suportar o enfileiramento de impressão lentamente -- algumas impressoras de rede mais antigas rejeitam envios rápidos sucessivos. Uma pausa de 200-500ms é geralmente suficiente.Quais são as considerações específicas de plataforma para impressão de PDF em Node.js?
O pacote pdf-to-printer usa comandos de sistema diferentes em cada sistema operacional. Compreender o mecanismo subjacente ajuda a diagnosticar falhas específicas da plataforma.
Como funciona a impressão de PDF no Windows?
No Windows, pdf-to-printer utiliza o SumatraPDF através de um comando PowerShell. O SumatraPDF é incorporado ao pacote — nenhuma instalação separada é necessária. A execução de scripts do PowerShell deve ser permitida de acordo com a política de execução atual. Execute Get-ExecutionPolicy no PowerShell para verificar; se o resultado for Restricted, defina-o como RemoteSigned ou Bypass para a sessão.
Os nomes de impressoras no Windows são sensíveis a maiúsculas e minúsculas e devem corresponder exatamente ao valor mostrado em Configurações > Bluetooth & dispositivos > Impressoras e scanners, incluindo qualquer sufixo de rede entre parênteses.
Como funciona a impressão de PDF no macOS e Linux?
No macOS e Linux, o pacote chama lp (parte do CUPS). Confirme se o CUPS está em execução com lpstat -p -- isso lista todas as impressoras registradas e seu status atual. Se nenhuma impressora aparecer, o serviço CUPS pode não estar iniciado; use sudo systemctl start cups no Linux ou habilite-o via Preferências do Sistema > Impressoras no macOS.
O comando lp não suporta todas as mesmas opções que o caminho do SumatraPDF no Windows. As opções scale e orientation podem não ter efeito na impressão baseada no CUPS, dependendo do driver da impressora. Teste no hardware de destino antes de implantar.
pdf-to-printer atualmente imprime apenas para impressoras locais e de rede. Serviços de impressão em nuvem, como o Microsoft Universal Print, não são suportados através deste pacote.Como lido com segurança e permissões ao imprimir PDFs?
Sistemas de impressão de produção que processam documentos confidenciais — contratos, registros financeiros, formulários médicos — precisam de controles de acesso e trilhas de auditoria. Rastrear quem imprimiu o quê e quando é uma exigência de conformidade em muitas indústrias reguladas.
//: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'));
})();
A classe AuditedPrinter atribui um ID de trabalho único a cada solicitação de impressão e registra a identidade do usuário, caminho do arquivo e carimbos de data e hora. Persistir this.log em um banco de dados ou arquivo de log de acréscimo único transforma isso em um registro de auditoria durável. Para documentos que contêm informações de identificação pessoal, considere usar os recursos de criptografia de PDF do IronPDF para proteger arquivos em repouso antes de chegarem à fila de impressora.
Para aplicativos de servidor que aceitam solicitações de impressão via HTTP, valide o tipo e tamanho do arquivo antes de imprimir — rejeite qualquer upload que não seja um binário PDF válido. Nunca passe caminhos de arquivo fornecidos pelo usuário diretamente para printer.print() sem saneamento.
Quais são os próximos passos para impressão de PDF em Node.js?
Este guia cobriu a impressão de arquivos PDF existentes para impressoras locais e de rede usando pdf-to-printer, desde a impressão básica de arquivo único até filas em lote, opções de impressora personalizada, considerações de plataforma e registro de auditoria para ambientes regulamentados.
Para estender este fluxo de trabalho com geração de PDF, inicie um teste gratuito do IronPDF for Node.js e siga o tutorial de HTML para PDF para construir um pipeline de documentos de ponta a ponta. Para opções de licenciamento e preços por volume, veja a página de licenciamento do IronPDF.
Pronto para ir mais longe? Explore a coleção completa de tutoriais de IronPDF for Node.js para aprender como mesclar arquivos PDF, comprimir arquivos PDF e converter PDFs em imagens.
Perguntas frequentes
Qual é a maneira mais fácil de imprimir arquivos PDF em Node.js?
Use o pacote npm pdf-to-printer. Instale com npm install pdf-to-printer, depois chame printer.print('./file.pdf') -- ele retorna uma Promessa e coloca o trabalho na fila com a impressora padrão do sistema em uma única chamada.
Quais são os pré-requisitos para imprimir PDFs em Node.js?
Node.js 14.x ou superior, npm e um driver de impressora configurado na máquina anfitriã. No Windows, a política de execução do PowerShell deve permitir execução de scripts. No macOS e Linux, o CUPS deve estar instalado e em execução, com pelo menos uma impressora registrada via lpstat -p.
Como faço para imprimir em uma impressora específica no Node.js?
Passe um objeto printerOptions como segundo argumento para printer.print(). Defina o campo printer para o nome exato da impressora retornado por printer.getPrinters(). Os nomes de impressoras são sensíveis a maiúsculas e minúsculas e devem corresponder exatamente à entrada no registro do SO.
Posso gerar um PDF e depois imprimi-lo no mesmo script Node.js?
Sim. Use o IronPDF for Node.js para gerar o arquivo primeiro: chame PdfDocument.fromHtml(html) para renderizar o conteúdo HTML, salve com pdf.saveAs(path), e então passe esse caminho para printer.print(path). Instale o IronPDF com npm install @ironsoftware/ironpdf.
O pdf-to-printer funciona no macOS e Linux?
Sim. No macOS e Linux, o pacote delega para o comando lp do CUPS. Confirme que o CUPS está em execução com lpstat -p. Observe que as opções scale e orientation podem não ter efeito em todos os drivers de impressora CUPS.
Como adiciono um log de auditoria para trabalhos de impressão no Node.js?
Envolva printer.print() em uma classe que atribui um ID de trabalho único usando crypto.randomBytes(8).toString('hex') e registre o caminho do arquivo, ID do usuário e carimbos de data e hora. Persista o array de logs em um banco de dados ou arquivo somente apêndice fora do diretório gravável do aplicativo.

