Cómo combinar archivos PDF en un único PDF con Node.js
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();Flujo de trabajo mínimo (5 pasos)
- Instale IronPDF:
npm install ironpdf - Importe la biblioteca:
const IronPdf = require('ironpdf') - Cargue cada archivo PDF con
PdfDocument.fromFile() - Fusione los documentos cargados con
PdfDocument.merge() - Guarde el resultado con
toFile()
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);
})();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.
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 objetoPdfDocument. 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 únicoPdfDocument, 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);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.
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.
¿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');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');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.
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'
);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.
¿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.
| Error | Posible causa | Solución |
|---|---|---|
| Archivo no encontrado | Ruta incorrecta o discrepancia del directorio de trabajo | Use rutas absolutas o verifique el directorio de trabajo del proceso |
| JavaScript se queda sin memoria heap | Cargar muchos PDFs grandes simultáneamente | Aumente la memoria de Node.js: node --max-old-space-size=4096 script.js |
| PDF inválido o corrupto | El archivo fuente está dañado o no es un PDF válido | Valide los archivos fuente con un lector de PDF antes de procesar |
| Permiso denegado | No hay acceso de lectura en la entrada o no hay acceso de escritura en el directorio de salida | Verifique los permisos de archivos y directorios en el sistema operativo |
| PDF fuente cifrado | PDF de entrada requiere una contraseña para abrir | Pase 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.
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.





