Cómo combinar archivos PDF en un único PDF con Node.js

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

IronPDF le permite fusionar varios archivos PDF en un único documento en Node.js con solo unas pocas líneas de código. Cargue cada archivo con PdfDocument.fromFile(), pase el conjunto a PdfDocument.merge() y guarde el resultado con toFile().

Inicio rápido: Fusionar archivos PDF

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/quickstart-merge.js
// Install: npm install ironpdf
const IronPdf = require('ironpdf');

async function quickMerge() {
  const docs = await Promise.all([
    IronPdf.PdfDocument.fromFile('doc1.pdf'),
    IronPdf.PdfDocument.fromFile('doc2.pdf'),
    IronPdf.PdfDocument.fromFile('doc3.pdf'),
  ]);
  const merged = await IronPdf.PdfDocument.merge(docs);
  await merged.toFile('merged-output.pdf');
}

quickMerge();
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/quickstart-merge.js
// Install: npm install ironpdf
const IronPdf = require('ironpdf');

async function quickMerge() {
  const docs = await Promise.all([
    IronPdf.PdfDocument.fromFile('doc1.pdf'),
    IronPdf.PdfDocument.fromFile('doc2.pdf'),
    IronPdf.PdfDocument.fromFile('doc3.pdf'),
  ]);
  const merged = await IronPdf.PdfDocument.merge(docs);
  await merged.toFile('merged-output.pdf');
}

quickMerge();
JAVASCRIPT

IronPDF es una biblioteca de manipulación de PDF for Node.js que maneja conversión de HTML a PDF, ensamblado de documentos y modificación de PDF sin requerir ninguna herramienta PDF a nivel de sistema. Al fusionar documentos, preserva fuentes, imágenes, formularios incrustados y geometría de página de cada archivo fuente.

Antes de desplegar en producción, configure su clave de licencia de IronPDF para eliminar la marca de agua de prueba y habilitar la salida completa. Para configurar el motor de renderizado para su sistema operativo, siga la guía de configuración de IronPdfEngine.


¿Cómo fusiono varios archivos PDF en Node.js?

PdfDocument.merge() acepta un conjunto de objetos PdfDocument y devuelve un nuevo documento que contiene cada página en el orden en que aparecen los documentos fuente en el conjunto. La operación no es destructiva; los objetos de archivo originales no se modifican.

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-pdfs.js
const IronPdf = require('ironpdf');

async function mergePdfs(outputFilePath, inputFiles) {
  // Load all source documents in parallel
  const pdfDocs = await Promise.all(
    inputFiles.map(file => IronPdf.PdfDocument.fromFile(file))
  );

  // Combine into one document, preserving page order
  const mergedPdf = await IronPdf.PdfDocument.merge(pdfDocs);

  // Write the result to disk
  await mergedPdf.toFile(outputFilePath);
  console.log(`Merged PDF saved to ${outputFilePath}`);
}

(async () => {
  const inputFiles = ['report-jan.pdf', 'report-feb.pdf', 'report-mar.pdf'];
  await mergePdfs('quarterly-report.pdf', inputFiles);
})();
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-pdfs.js
const IronPdf = require('ironpdf');

async function mergePdfs(outputFilePath, inputFiles) {
  // Load all source documents in parallel
  const pdfDocs = await Promise.all(
    inputFiles.map(file => IronPdf.PdfDocument.fromFile(file))
  );

  // Combine into one document, preserving page order
  const mergedPdf = await IronPdf.PdfDocument.merge(pdfDocs);

  // Write the result to disk
  await mergedPdf.toFile(outputFilePath);
  console.log(`Merged PDF saved to ${outputFilePath}`);
}

(async () => {
  const inputFiles = ['report-jan.pdf', 'report-feb.pdf', 'report-mar.pdf'];
  await mergePdfs('quarterly-report.pdf', inputFiles);
})();
JAVASCRIPT

Promise.all() carga los archivos fuente en paralelo en lugar de uno a la vez, lo cual es importante al procesar colecciones más grandes. La llamada merge() concatena los documentos en el orden del conjunto, por lo que coloque los archivos en el conjunto en la secuencia que desea que aparezcan en la salida.

ConsejosPasar rutas de archivo como rutas absolutas o rutas relativas al directorio de trabajo del proceso de Node.js. El método fromFile() no resuelve rutas relativas al archivo de script mismo.

¿Qué hace cada parte del código?

  • PdfDocument.fromFile(): Lee un PDF desde el disco y devuelve un objeto PdfDocument. Para ver las firmas completas de los métodos, consulte la Referencia de API de IronPDF for Node.js.
  • Promise.all(): Despacha todas las operaciones de carga de archivos simultáneamente, reduciendo el tiempo total de carga para fusiones de múltiples documentos. Este patrón es adecuado para escenarios de generación de PDF multihilo y concurrente.
  • PdfDocument.merge(): Concatena el conjunto de documentos cargados en un único PdfDocument, preservando todo el formato, imágenes y contenido incrustado de cada fuente.
  • toFile(): Escribe el documento fusionado en la ruta especificada. Combine esto con la compresión de PDF para reducir el tamaño del archivo de salida cuando sea necesario.

¿Cómo fusiono páginas específicas de cada PDF?

Pasar cada página de cada documento fuente no siempre es el objetivo. Para fusionar rangos de páginas selectivos de cada archivo de entrada, extraiga las páginas deseadas antes de pasar los documentos a merge().

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-specific-pages.js
const IronPdf = require('ironpdf');

// Each entry specifies a file and the range of pages to include (zero-indexed)
const pageRanges = [
  { file: 'contract.pdf',  startPage: 0, endPage: 2 },
  { file: 'appendix.pdf',  startPage: 0, endPage: 0 },
  { file: 'signature.pdf', startPage: 0, endPage: 0 },
];

async function mergeSpecificPages(outputFile, ranges) {
  const pdfsToMerge = [];

  for (const range of ranges) {
    const pdf = await IronPdf.PdfDocument.fromFile(range.file);
    // extractPages returns a new PdfDocument with only the specified page range
    const pages = pdf.extractPages(range.startPage, range.endPage);
    pdfsToMerge.push(pages);
  }

  const merged = await IronPdf.PdfDocument.merge(pdfsToMerge);
  await merged.toFile(outputFile);
}

mergeSpecificPages('assembled-contract.pdf', pageRanges);
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-specific-pages.js
const IronPdf = require('ironpdf');

// Each entry specifies a file and the range of pages to include (zero-indexed)
const pageRanges = [
  { file: 'contract.pdf',  startPage: 0, endPage: 2 },
  { file: 'appendix.pdf',  startPage: 0, endPage: 0 },
  { file: 'signature.pdf', startPage: 0, endPage: 0 },
];

async function mergeSpecificPages(outputFile, ranges) {
  const pdfsToMerge = [];

  for (const range of ranges) {
    const pdf = await IronPdf.PdfDocument.fromFile(range.file);
    // extractPages returns a new PdfDocument with only the specified page range
    const pages = pdf.extractPages(range.startPage, range.endPage);
    pdfsToMerge.push(pages);
  }

  const merged = await IronPdf.PdfDocument.merge(pdfsToMerge);
  await merged.toFile(outputFile);
}

mergeSpecificPages('assembled-contract.pdf', pageRanges);
JAVASCRIPT

extractPages(startPage, endPage) acepta índices de páginas basados en cero. Pasar 0, 0 extrae solo la primera página, mientras que 0, 2 extrae las primeras tres páginas. El bucle construye un conjunto de documentos de rango de páginas en el orden en que aparecen en ranges, luego merge() los concatena en la salida final.

Este patrón es útil cuando se ensamblan contratos a partir de una página de firma, un apéndice y una hoja de portada almacenados en archivos separados. Puede recopilar exactamente las páginas que importan de cada fuente sin duplicar archivos en el disco.

Por favor notaLos índices de página en IronPDF están basados en cero. La página 1 de un documento es el índice 0, la página 2 es el índice 1, y así sucesivamente.


Icon Quote related to ¿Cómo fusiono páginas específicas de cada PDF?

Mi biblioteca favorita de este tipo es IronPDF. Permite una manipulación rápida y eficiente de archivos PDF. También tiene muchas funciones valiosas, como exportar al formato PDF/A y firmar documentos PDF digitalmente.

Milan Jovanovic related to ¿Cómo fusiono páginas específicas de cada PDF?

Milan Jovanovic

Microsoft MVP

Ver estudio de caso
Icon Quote related to ¿Cómo fusiono páginas específicas de cada PDF?

IronOCR significa que podemos ahorrar $40,000 anualmente en el procesamiento manual, mientras mejoramos la productividad y liberamos recursos para tareas de alto impacto. Lo recomendaría encarecidamente.

Brent Matzelle related to ¿Cómo fusiono páginas específicas de cada PDF?

Brent Matzelle

Director de Tecnología, OPYN

Ver estudio de caso
Icon Quote related to ¿Cómo fusiono páginas específicas de cada PDF?

El Iron Suite juega un papel crucial en nuestras operaciones. Estas son herramientas que aumentan la eficiencia en toda la empresa, incluyendo la creación de planos y la mejora en la gestión de inventario.

David Jones related to ¿Cómo fusiono páginas específicas de cada PDF?

David Jones

Ingeniero de Software Principal, Agorus Build

Ver estudio de caso

¿Cómo agrego encabezados y pies de página a un PDF fusionado?

Después de fusionar, llame a addHtmlHeader() y addHtmlFooter() en el documento resultante para aplicar encabezados y pies de página consistentes en todas las páginas. Estos métodos aceptan una cadena HTML y un objeto de opciones.

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-headers-footers.js
const IronPdf = require('ironpdf');

async function mergeWithHeadersFooters(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Apply a styled header to every page
  await mergedPdf.addHtmlHeader('<h3 style="color:#333;">Quarterly Report</h3>', {
    height: 25,
    drawDividerLine: true,
  });

  // Apply a page-numbering footer
  await mergedPdf.addHtmlFooter('<p style="font-size:10px;">Page {page} of {total-pages}</p>', {
    height: 20,
    drawDividerLine: true,
  });

  await mergedPdf.toFile(outputFile);
}

mergeWithHeadersFooters(['q1.pdf', 'q2.pdf', 'q3.pdf'], 'annual-report.pdf');
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-headers-footers.js
const IronPdf = require('ironpdf');

async function mergeWithHeadersFooters(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Apply a styled header to every page
  await mergedPdf.addHtmlHeader('<h3 style="color:#333;">Quarterly Report</h3>', {
    height: 25,
    drawDividerLine: true,
  });

  // Apply a page-numbering footer
  await mergedPdf.addHtmlFooter('<p style="font-size:10px;">Page {page} of {total-pages}</p>', {
    height: 20,
    drawDividerLine: true,
  });

  await mergedPdf.toFile(outputFile);
}

mergeWithHeadersFooters(['q1.pdf', 'q2.pdf', 'q3.pdf'], 'annual-report.pdf');
JAVASCRIPT

Los marcadores de posición {page} y {total-pages} se resuelven en el momento de la renderización frente al recuento de páginas del documento fusionado. Utilice drawDividerLine: true para separar visualmente el encabezado o pie de página del contenido de la página.

Aplicar encabezados y pies de página después de la fusión significa que cada página en el documento combinado recibe el mismo tratamiento, sin importar de qué archivo fuente provenga. Para opciones completas de configuración de encabezados y pies de página, consulte los ejemplos de encabezados y pies de página HTML.


¿Cómo protejo un PDF fusionado con una contraseña?

Aplique protección por contraseña y restricciones de permisos después de fusionar llamando a saveAs() con un objeto de opciones de seguridad. Esto previene el acceso no autorizado al documento combinado.

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-security.js
const IronPdf = require('ironpdf');

async function mergeWithSecurity(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Restrict the merged document to print-only access
  await mergedPdf.saveAs(outputFile, {
    userPassword: 'viewerpass',
    ownerPassword: 'adminpass',
    allowUserAnnotations: false,
    allowUserCopyPasteContent: false,
    allowUserFormData: false,
    allowUserPrinting: true,
  });
}

mergeWithSecurity(['invoice-1.pdf', 'invoice-2.pdf'], 'secured-invoices.pdf');
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-security.js
const IronPdf = require('ironpdf');

async function mergeWithSecurity(inputFiles, outputFile) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Restrict the merged document to print-only access
  await mergedPdf.saveAs(outputFile, {
    userPassword: 'viewerpass',
    ownerPassword: 'adminpass',
    allowUserAnnotations: false,
    allowUserCopyPasteContent: false,
    allowUserFormData: false,
    allowUserPrinting: true,
  });
}

mergeWithSecurity(['invoice-1.pdf', 'invoice-2.pdf'], 'secured-invoices.pdf');
JAVASCRIPT

El userPassword es necesario para abrir el documento; el ownerPassword controla las configuraciones de permiso en sí mismas. Establecer allowUserPrinting: true mientras deshabilita otras banderas de permiso permite que los destinatarios impriman el documento, pero impide la edición, copia y anotación. Para una lista completa de las banderas de permiso disponibles, consulte la Referencia de API de IronPDF Node.js.

ImportanteSi los PDFs fuente ya están protegidos por contraseña, proporcione la contraseña de descifrado de cada documento al cargar con fromFile(). Intentar fusionar un documento cifrado sin proporcionar su contraseña resultará en un error.


¿Cómo fusiono PDFs y agrego una firma digital?

Fusionar PDFs y luego firmar inmediatamente el resultado produce un único documento firmado que cubre todo el contenido fuente. Aplique applySignature() después de merge() para adjuntar un certificado digital a la salida combinada.

//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-signature.js
const IronPdf = require('ironpdf');

async function mergeAndSign(inputFiles, outputFile, pfxPath, pfxPassword) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Attach a digital signature using a PFX certificate
  await mergedPdf.applySignature(pfxPath, pfxPassword);
  await mergedPdf.toFile(outputFile);
}

mergeAndSign(
  ['section-a.pdf', 'section-b.pdf'],
  'signed-report.pdf',
  'certificate.pfx',
  'certpass'
);
//:path=/static-assets/pdf/content-code-examples/how-to/nodejs-merge-pdf/merge-with-signature.js
const IronPdf = require('ironpdf');

async function mergeAndSign(inputFiles, outputFile, pfxPath, pfxPassword) {
  const docs = await Promise.all(
    inputFiles.map(f => IronPdf.PdfDocument.fromFile(f))
  );
  const mergedPdf = await IronPdf.PdfDocument.merge(docs);

  // Attach a digital signature using a PFX certificate
  await mergedPdf.applySignature(pfxPath, pfxPassword);
  await mergedPdf.toFile(outputFile);
}

mergeAndSign(
  ['section-a.pdf', 'section-b.pdf'],
  'signed-report.pdf',
  'certificate.pfx',
  'certpass'
);
JAVASCRIPT

El método applySignature() incrusta el certificado en los metadatos del PDF para que los lectores puedan verificar la integridad del documento. Este flujo de trabajo es común en tuberías de ensamblaje de contratos donde se combinan múltiples secciones y luego se co-firman antes de la distribución. Para una guía completa sobre la firma basada en certificados, consulte los ejemplos de firmas digitales.

ConsejosFirme el documento fusionado en lugar de los archivos fuente individuales cuando necesite un único certificado que acredite todo el documento combinado.


¿Cómo soluciono los errores comunes al fusionar PDFs?

La mayoría de los errores durante la fusión pertenecen a cuatro categorías: archivos faltantes, agotamiento de memoria, entradas dañadas y problemas de permiso. La siguiente tabla enumera las causas más frecuentes y cómo abordar cada una.

Errores comunes de fusión de PDF y sus soluciones
ErrorPosible causaSolución
Archivo no encontradoRuta incorrecta o discrepancia del directorio de trabajoUse rutas absolutas o verifique el directorio de trabajo del proceso
JavaScript se queda sin memoria heapCargar muchos PDFs grandes simultáneamenteAumente la memoria de Node.js: node --max-old-space-size=4096 script.js
PDF inválido o corruptoEl archivo fuente está dañado o no es un PDF válidoValide los archivos fuente con un lector de PDF antes de procesar
Permiso denegadoNo hay acceso de lectura en la entrada o no hay acceso de escritura en el directorio de salidaVerifique los permisos de archivos y directorios en el sistema operativo
PDF fuente cifradoPDF de entrada requiere una contraseña para abrirPase la contraseña como el segundo argumento a fromFile()

Para problemas de configuración específicos del entorno, el cambios de IronPDF documentan problemas conocidos y soluciones. Si los problemas persisten después de revisar la tabla anterior, envuelva la llamada de fusión en un bloque try-catch para mostrar el mensaje completo de error de la biblioteca.

PrecauciónSiempre valide que cada ruta de archivo en su conjunto de entrada exista antes de llamar a fromFile(). Un solo archivo faltante provoca el rechazo de toda la llamada Promise.all(), cancelando la fusión.

Node.js en sí proporciona herramientas útiles para la validación de rutas previa al vuelo. El método Node.js fs.promises.access le permite verificar si un archivo es legible antes de pasarlo a IronPDF. Para preguntas sobre cómo manejan escenarios de errores similares otros desarrolladores de la comunidad, el hilo de Stack Overflow sobre la fusión de PDFs en Node.js proporciona contexto adicional.


¿Cuáles son los próximos pasos para fusionar PDFs en Node.js?

Los ejemplos anteriores cubren los escenarios de fusión más comunes: combinación básica de archivos, selección de rango de páginas, inyección de encabezados y pies de página, protección con contraseña y firma digital. IronPDF también admite manejar formularios PDF a través de páginas fusionadas, estampar nuevo contenido en el documento combinado y producir imágenes rasterizadas del resultado final para la generación de vistas previas.

Inicie su prueba gratuita de 30 días para probar la fusión sin una marca de agua, o vea las opciones de licencia si está listo para implementarlo.

¿Listo para ver qué más puede hacer IronPDF? Visite la documentación de IronPDF for Node.js para un recorrido completo por la API y guías adicionales.

Preguntas Frecuentes

¿Cómo fusiono múltiples archivos PDF en uno en Node.js?

Carga cada archivo con PdfDocument.fromFile(), recopila los resultados en un arreglo, pasa el arreglo a PdfDocument.merge(), y guarda el resultado con toFile(). Usa Promise.all() para cargar archivos en paralelo al fusionar tres o más documentos.

¿IronPDF conserva el formato al fusionar PDFs?

Sí. IronPDF conserva fuentes, imágenes, formularios incrustados y geometría de página de cada documento de origen. La salida fusionada mantiene el diseño original de cada página en el orden que aparecen los archivos de origen en el arreglo de entrada.

¿Cómo fusiono solo páginas específicas de cada PDF?

Llama a extractPages(startPage, endPage) en cada documento cargado antes de pasarlo a PdfDocument.merge(). Los índices de página son de base cero, por lo que la primera página es el índice 0. El documento devuelto contiene solo el rango especificado.

¿Puedo agregar encabezados y pies de página a un PDF fusionado?

Sí. Después de fusionar, llama a addHtmlHeader() y addHtmlFooter() en el documento resultante. Ambos métodos aceptan una cadena HTML y un objeto de opciones. Usa los marcadores {page} y {total-pages} para numeración automática de páginas.

¿Cómo protejo con contraseña un PDF fusionado en Node.js?

Llama a saveAs() con un objeto de opciones de seguridad especificando userPassword, ownerPassword, y banderas de permiso como allowUserPrinting. La userPassword es necesaria para abrir el documento; la ownerPassword controla la configuración de permisos.

¿Qué debo hacer si la fusión falla con un error de archivo no encontrado?

Verifica que todas las rutas de archivo de entrada sean correctas en relación con el directorio de trabajo del proceso Node.js, o cambia a rutas absolutas. Usa fs.promises.access() para confirmar que cada archivo es legible antes de llamar a PdfDocument.fromFile().

¿Qué pasa si uno de los PDFs de origen está cifrado?

Intentar cargar un PDF cifrado sin proporcionar su contraseña lanzará un error y rechazará toda la llamada Promise.all(). Proporciona la contraseña del documento como segundo argumento para fromFile() antes de fusionar.

¿Necesito una clave de licencia para fusionar PDFs con IronPDF?

IronPDF funciona sin una clave de licencia durante el desarrollo, pero los documentos de salida incluyen una marca de agua de prueba. Configura una clave de licencia válida antes de desplegar en producción para eliminar la marca de agua y habilitar la funcionalidad completa.

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.6 recién publicada
Still Scrolling Icon

¿Aún desplazándote?

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