Cómo imprimir archivos PDF usando Node.js

This article was translated from English: Does it need improvement?
Translated
View the article in English

Imprimir un archivo PDF en Node.js requiere enviar el documento a la cola de impresión del sistema operativo. El paquete npm pdf-to-printer abstrae esa llamada al sistema en una API basada en promesas que funciona en Windows, macOS y Linux, permitiéndote encolar un trabajo de impresión en una única llamada de método. Para la generación de PDF antes de imprimir — convertir HTML, URLs o plantillas a documentos listos para imprimir — IronPDF for Node.js se combina naturalmente con este flujo de trabajo.

Inicio rápido: imprimir un archivo PDF en 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

¿Cuáles son los requisitos para imprimir PDFs en Node.js?

Se requiere Node.js 14.x o posterior y npm antes de usar pdf-to-printer. El paquete se basa en comandos de impresión del sistema operativo nativos en lugar de un motor de impresión integrado, por lo que los controladores de impresora deben estar configurados en la máquina de destino.

En Windows, el paquete llama a SumatraPDF a través de PowerShell. Asegúrese de que la ejecución de scripts de PowerShell no esté bloqueada por la política de su sistema. En macOS y Linux, el paquete delega en el comando lp, que es parte del sistema de impresión CUPS. Confirma que CUPS está instalado y que al menos una impresora esté registrada con lpstat -p.

Por favor notaSe recomienda Node.js 18.x LTS para cargas de trabajo de producción. El paquete pdf-to-printer soporta todas las versiones activas LTS de Node.js.

¿Cómo configuro un proyecto de Node.js para imprimir PDFs?

Inicie un nuevo proyecto, instale el paquete y cree una estructura de directorios mínima antes de escribir cualquier lógica de impresión.

//: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

Después de la instalación, crea un archivo index.js para tu lógica de impresión y una carpeta pdfs/ para contener los documentos que deseas imprimir. Un archivo config.js separado para configuraciones de impresora mantiene los nombres de las impresoras fuera de tu lógica central, un patrón útil para despliegues en múltiples entornos donde la impresora objetivo varía entre desarrollo y producción.

El módulo utiliza enlaces nativos que se resuelven en tiempo de ejecución, por lo que no se requiere un paso de compilación. El directorio node_modules/pdf-to-printer/dist/ contendrá binarios preconstruidos para la plataforma detectada.

¿Cómo imprimo un archivo PDF con uso básico?

Pasa la ruta del archivo, ya sea absoluta o relativa, a printer.print(). El método encola el documento con la impresora predeterminada del sistema y resuelve la Promesa una vez que el trabajo es aceptado por el spooler, no cuando la impresión física se completa.

//: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 la existencia de archivos antes de llamar a printer.print() previene fallos silenciosos cuando una ruta es incorrecta o un archivo ha sido movido. La llamada fs.access() lanza ENOENT si la ruta no se resuelve, dándote un error descriptivo en lugar de un rechazo genérico del spooler. Las causas comunes de error incluyen rutas relativas incorrectas, controladores de impresora faltantes y estado de impresora fuera de línea.

ImportanteLa Promesa se resuelve cuando el trabajo de impresión es aceptado por el spooler del sistema operativo, no cuando el documento finaliza la impresión. Para fines de auditoría, registre la marca de tiempo en la resolución en lugar de asumir que el documento ha salido de la impresora.

¿Cómo genero un PDF antes de imprimir?

Cuando el documento no existe ya como archivo, genera el documento con IronPDF for Node.js antes de llamar a printer.print(). IronPDF representa HTML, URLs y cadenas de plantillas en archivos PDF listos para imprimir sin requerir una instancia 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

Este patrón es común en flujos de trabajo de informes donde el contenido PDF se ensambla en tiempo de ejecución a partir de registros de base de datos o respuestas de API. Consulte el tutorial de conversión de HTML a PDF para un recorrido completo de las opciones de renderizado de IronPDF, incluido el soporte para CSS y la inyección de encabezado/pie de página.

¿Cómo puedo especificar opciones de impresión personalizadas?

Pasa un objeto printerOpcións como segundo argumento a printer.print() para dirigirte a una impresora específica, establecer el número de copias, seleccionar rangos de páginas o controlar el escalado de página. El nombre de la impresora debe coincidir exactamente con el valor devuelto 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 printWithOpcións(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}"`);
}

printWithOpcións('./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 printWithOpcións(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}"`);
}

printWithOpcións('./pdfs/shipping-label.pdf').catch(console.error);
JAVASCRIPT

Llamar a getPrinters() antes de print() sirve para dos propósitos: confirma que la impresora está en línea y accesible, y te da el nombre autoritario que el sistema operativo usa para dirigir trabajos de impresión. Los nombres de impresora a menudo incluyen números de versión o sufijos de red que difieren de los nombres de pantalla mostrados en la configuración del sistema.

ConsejosEn Windows, getPrinters() devuelve la lista de impresoras desde el registro. En macOS/Linux, consulta CUPS. La bandera isDefault identifica la impresora que recibe trabajos cuando no se especifica un nombre de impresora.

¿Qué opciones de impresora se pueden configurar?

El objeto printerOpcións soporta los siguientes campos:

pdf-to-printer option properties
OpciónEscriba aDescripciónValor de ejemplo
impresoracadenaNombre exacto de la impresora tal como lo devuelve getPrinters()'HP LaserJet Pro'
copiasnúmeroNúmero de copias para imprimir2
páginascadenaCadena de rango de páginas'1-3,5'
escalacadenaModo de escala de página'ajustar', 'sin escala', 'reducir'
orientacióncadenaAnulación de orientación de página'vertical', 'horizontal'

Para documentos que necesitan tamaños de papel personalizados o una orientación de página específica aplicada durante la generación de PDF en lugar de en el momento de la impresión, configure esas opciones en el paso de renderización de IronPDF antes de guardar el archivo.

¿Cómo puedo implementar la impresión por lotes en Node.js?

Procesa una carpeta de archivos PDF o una lista generada dinámicamente iterando un array y llamando a printer.print() para cada archivo. Usar for...of con await mantiene los trabajos en secuencia, lo que previene que el spooler de impresión se sature con solicitudes 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 printOpcións = {
          ...options,
          ...(this.printerName && { printer: this.printerName }),
        };
        await printer.print(filePath, printOpcións);
        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 printOpcións = {
          ...options,
          ...(this.printerName && { printer: this.printerName }),
        };
        await printer.print(filePath, printOpcións);
        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

La clase BatchPrinter separa la validación de la ejecución. Los archivos que no existen son saltados durante addFiles() para que un solo archivo faltante no aborte todo el lote. El método printAll() registra errores por archivo y devuelve un resumen que puede ser registrado o enviado a un servicio de monitoreo.

Para informes generados dinámicamente, combine este patrón con la conversión de cadena HTML a PDF de IronPDF para generar e imprimir en un solo canal. El ejemplo de compresión de PDF vale la pena aplicarlo antes de lotes grandes de impresión para reducir el tiempo de transferencia del spooler en impresoras de red.

ConsejosAgrega un pequeño retraso await entre trabajos si la impresora soporta la creación de filas de impresión lentamente, ya que algunas impresoras de red antiguas rechazan envíos sucesivos rápidos. Una pausa de 200-500 ms suele ser suficiente.

¿Cuáles son las consideraciones específicas de la plataforma para la impresión de PDFs en Node.js?

El paquete pdf-to-printer utiliza distintos comandos del sistema en cada sistema operativo. Comprender el mecanismo subyacente ayuda a diagnosticar fallos específicos de la plataforma.

¿Cómo funciona la impresión de PDFs en Windows?

En Windows, pdf-to-printer utiliza SumatraPDF a través de un comando de PowerShell. SumatraPDF se incluye con el paquete, no se necesita una instalación separada. Debe permitirse la ejecución de scripts de PowerShell bajo la política de ejecución actual. Ejecuta Get-ExecutionPolicy en PowerShell para verificar; si el resultado es Restricted, configúralo en RemoteSigned o Bypass para la sesión.

Los nombres de impresoras en Windows son sensibles a mayúsculas y minúsculas y deben coincidir exactamente con el valor mostrado en Configuración > Bluetooth y dispositivos > Impresoras y escáneres, incluyendo cualquier sufijo de red entre paréntesis.

¿Cómo funciona la impresión de PDFs en macOS y Linux?

En macOS y Linux, el paquete llama a lp (parte de CUPS). Confirma que CUPS está ejecutándose con lpstat -p -- esto lista todas las impresoras registradas y su estado actual. Si no aparecen impresoras, el servicio de CUPS puede no estar iniciado; usa sudo systemctl start cups en Linux o habilítalo a través de Preferencias del Sistema > Impresoras en macOS.

El comando lp no soporta todas las mismas opciones que el camino de SumatraPDF en Windows. Las opciones scale y orientation pueden no tener efecto en la impresión basada en CUPS dependiendo del controlador de la impresora. Pruebe en el hardware de destino antes de implementar.

AdvertenciaEl paquete pdf-to-printer actualmente solo imprime en impresoras locales y de red. Los servicios de impresión en la nube como Microsoft Universal Print no son compatibles a través de este paquete.

¿Cómo manejo la seguridad y los permisos al imprimir PDFs?

Los sistemas de impresión en producción que procesan documentos sensibles -- contratos, registros financieros, formularios médicos -- necesitan controles de acceso y registros de auditoría. Rastrear quién imprimió qué y cuándo es un requisito de cumplimiento en muchas industrias 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

La clase AuditedPrinter asigna un ID de trabajo único a cada requerimiento de impresión y registra la identidad del usuario, la ruta del archivo y las marcas de tiempo. Persistir this.log en una base de datos o en un archivo de registro solo adjunto lo convierte en un registro de auditoría duradero. Para documentos que contienen información personal identificable, considere usar las funciones de cifrado de PDF de IronPDF para proteger archivos en reposo antes de que lleguen a la cola de impresión.

Para aplicaciones de servidor que aceptan solicitudes de impresión a través de HTTP, valide el tipo y tamaño del archivo antes de imprimir -- rechace cualquier carga que no sea un binario PDF válido. Nunca pases rutas de archivos proporcionadas por el usuario directamente a printer.print() sin depurar.

ImportanteAlmacene los registros de auditoría fuera del directorio escribible de la aplicación. Un atacante con acceso de escritura al sistema de archivos no debería poder manipular los registros de impresión.

¿Cuáles son los próximos pasos para la impresión de PDFs en Node.js?

Esta guía cubrió la impresión de archivos PDF existentes en impresoras locales y de red usando pdf-to-printer, desde la impresión básica de un solo archivo hasta colas de lotes, opciones de impresora personalizadas, consideraciones de plataforma y registro de auditoría para entornos regulados.

Para extender este flujo de trabajo con generación de PDF, comience una prueba gratuita de IronPDF for Node.js y siga el tutorial de HTML a PDF para crear un pipeline de documentos de extremo a extremo. Para opciones de licencia y precios por volumen, consulte la página de licencias de IronPDF.

¿Listo para ir más allá? Explore la colección completa de cómo hacer de IronPDF for Node.js para aprender cómo fusionar archivos PDF, comprimir archivos PDF y convertir PDFs en imágenes.

Preguntas Frecuentes

¿Cuál es la forma más sencilla de imprimir archivos PDF en Node.js?

Usa el paquete npm pdf-to-printer. Instálalo con npm install pdf-to-printer, luego llama a printer.print('./file.pdf') -- devuelve una Promesa y encola el trabajo con la impresora predeterminada del sistema en una sola llamada.

¿Cuáles son los requisitos previos para imprimir PDF en Node.js?

Node.js 14.x o superior, npm, y un controlador de impresora configurado en la máquina anfitriona. En Windows, la política de ejecución de PowerShell debe permitir la ejecución de scripts. En macOS y Linux, CUPS debe estar instalado y en ejecución, con al menos una impresora registrada a través de lpstat -p.

¿Cómo imprimo en una impresora específica en Node.js?

Pasa un objeto printerOptions como segundo argumento a printer.print(). Establece el campo printer al nombre exacto de la impresora retornado por printer.getPrinters(). Los nombres de impresoras son sensibles a mayúsculas y deben coincidir exactamente con la entrada de registro del SO.

¿Puedo generar un PDF y luego imprimirlo en el mismo script de Node.js?

Sí. Usa IronPDF for Node.js para generar el archivo primero: llama a PdfDocument.fromHtml(html) para renderizar contenido HTML, guárdalo con pdf.saveAs(path), luego pasa esa ruta a printer.print(path). Instala IronPDF con npm install @ironsoftware/ironpdf.

¿Funciona pdf-to-printer en macOS y Linux?

Sí. En macOS y Linux, el paquete delega al comando lp de CUPS. Confirma que CUPS está corriendo con lpstat -p. Nota que las opciones scale y orientation pueden no tomar efecto en todos los controladores de impresoras CUPS.

¿Cómo agrego un registro de auditoría para trabajos de impresión en Node.js?

Envuelve printer.print() en una clase que asigne un ID único de trabajo usando crypto.randomBytes(8).toString('hex') y registra la ruta del archivo, el ID de usuario, y las estampas de tiempo. Persiste el arreglo de registros a una base de datos o un archivo de solo adición fuera del directorio escribible de la aplicación.

Darrius Serrant
Ingeniero de Software Full Stack (WebOps)

Darrius Serrant tiene una licenciatura en Ciencias de la Computación de la Universidad de Miami y trabaja como Ingeniero de Marketing WebOps Full Stack en Iron Software. Atraído por la programación desde joven, vio la computación como algo misterioso y accesible, convirtiéndolo en el ...

Leer más
¿Listo para empezar?
Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida?
ejecutar una muestra Mira cómo tu HTML se convierte en PDF.