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 uma tarefa 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));
JAVASCRIPT

Quais são os pré-requisitos para imprimir PDFs em Node.js?

É necessário ter o Node.js 14.x ou posterior e o npm instalados 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 no Linux , o pacote delega para o 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.

ObserveÉ recomendada a versão 18.x LTS do Node.js para cargas de trabalho de produção. O pacote pdf-to-printer é compatível com 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
SHELL

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 deseja imprimir. Um arquivo config.js separado para configurações de impressora mantém os nomes das impressoras fora da sua lógica principal — um padrão útil para implantações em vários ambientes, onde a impressora de destino difere entre o ambiente de desenvolvimento e o de 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 absoluto ou relativo do arquivo 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);
  }
});
JAVASCRIPT

Verificar a existência do arquivo antes de chamar printer.print() evita falhas silenciosas quando um caminho está incorreto ou um arquivo foi movido. A chamada fs.access() gera ENOENT se o caminho não for resolvido, fornecendo 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.

ImportanteA Promessa é resolvida quando o trabalho de impressão é aceito pelo spooler do SO, não quando o documento termina de imprimir. Para fins de auditoria, registre o carimbo de data/hora na resolução em vez de presumir que o documento saiu 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');
JAVASCRIPT

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 printerOpçãos como segundo argumento para printer.print() para direcionar uma impressora específica, definir a contagem de cópias, selecionar intervalos de páginas ou controlar o dimensionamento 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 printWithOpçãos(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}"`);
}

printWithOpçãos('./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 printWithOpçãos(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}"`);
}

printWithOpçãos('./pdfs/shipping-label.pdf').catch(console.error);
JAVASCRIPT

Chamar getPrinters() antes de print() serve a dois propósitos: confirma que a impressora está online e acessível e fornece a corda de nome autorizada que o sistema operacional usa para encaminhar os 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.

PontasNo Windows, getPrinters() retorna a lista de impressoras do registro. No macOS/Linux, ele consulta o CUPS. O sinalizador isDefault identifica a impressora que recebe os trabalhos quando nenhum nome de impressora é especificado.

Quais opções de impressora podem ser configuradas?

O objeto printerOpçãos suporta os seguintes campos:

pdf-to-printer option properties
Opção Tipo Descrição Exemplo de valor
printer corda Nome exato da impressora como retornado por getPrinters() 'HP LaserJet Pro'
copies número Número de cópias a imprimir 2
pages corda Cadeia de caracteres de intervalo de páginas '1-3,5'
scale corda Modo de escalonamento de página 'fit' , 'noscale' , 'shrink'
orientation corda 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.

Como posso implementar impressão em lote em Node.js?

Processa uma pasta de arquivos PDF ou uma lista gerada dinamicamente, iterando sobre um array e chamando printer.print() para cada arquivo. O uso de for...of com await mantém os trabalhos sequenciais, o que evita que o spooler de impressão seja 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 printOpçãos = {
          ...options,
          ...(this.printerName && { printer: this.printerName }),
        };
        await printer.print(filePath, printOpçãos);
        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 printOpçãos = {
          ...options,
          ...(this.printerName && { printer: this.printerName }),
        };
        await printer.print(filePath, printOpçãos);
        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.`);
})();
JAVASCRIPT

A classe BatchPrinter separa a validação da execução. Os arquivos que não existem são ignorados durante addFiles() para que um único arquivo ausente não interrompa todo o lote. O método printAll() registra erros por arquivo e retorna um resumo que pode ser armazenado em log ou encaminhado para um serviço de monitoramento.

Para relatórios gerados dinamicamente, combine este padrão com a conversão de corda 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.

PontasAdicione um pequeno atraso await entre os trabalhos se a impressora suportar filas de impressão lentas -- algumas impressoras de rede mais antigas rejeitam envios sucessivos rápidos. 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 utiliza 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 executa um comando do PowerShell no SumatraPDF. 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 no Linux, o pacote chama lp (parte do CUPS). Confirme se o CUPS está em execução com lpstat -p -- esta mensagem lista todas as impressoras registradas e seus respectivos status atuais. Se nenhuma impressora aparecer, o serviço CUPS pode não estar iniciado; Use sudo systemctl start cups no Linux ou habilite-o através de 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 em CUPS, dependendo do driver da impressora. Teste no hardware de destino antes de implantar.

AvisoO pacote pdf-to-printer atualmente imprime apenas em 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'));
})();
JAVASCRIPT

A classe AuditedPrinter atribui um ID de trabalho exclusivo a cada solicitação de impressão e registra a identidade do usuário, o caminho do arquivo e os registros de data e hora. Persistir this.log em um banco de dados ou arquivo de log somente para anexação transforma isso em um registro de auditoria permanente. 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 arquivos fornecidos pelo usuário diretamente para printer.print() sem sanitização.

ImportanteArmazene logs de auditoria fora do diretório gravável do aplicativo. Um invasor com acesso de gravação no sistema de arquivos não deve ser capaz de adulterar registros de impressão.

Quais são os próximos passos para impressão de PDF em Node.js?

Este guia abordou a impressão de arquivos PDF existentes em impressoras locais e de rede usando pdf-to-printer, desde a impressão básica de arquivo único até filas de lotes, opções de impressora personalizadas, 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.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Versão: 2026.5 just released
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas?
executar um exemplo Veja seu HTML se transformar em um PDF.