Como mesclar arquivos PDF em um único PDF usando Node.js
O IronPDF permite mesclar vários arquivos PDF em um único documento no Node.js com apenas algumas linhas de código. Carregue cada arquivo com PdfDocument.fromFile(), passe o array para PdfDocument.merge() e salve o resultado com toFile().
Início Rápido: Mesclar Arquivos 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();
Fluxo de trabalho mínimo (5 etapas)
- Instale o IronPDF:
npm install ironpdf - Importe a biblioteca:
const IronPdf = require('ironpdf') - Carregue cada arquivo PDF com
PdfDocument.fromFile() - Mescle os documentos carregados com
PdfDocument.merge() - Salve o resultado com
toFile()
IronPDF é uma biblioteca de manipulação de PDF for Node.js que realiza conversão de HTML para PDF , montagem de documentos e modificação de PDFs sem exigir nenhuma ferramenta de PDF em nível de sistema. Ao mesclar documentos, o programa preserva as fontes, imagens, formulários incorporados e geometria da página de cada arquivo de origem.
Antes de implementar em produção, configure sua chave de licença do IronPDF para remover a marca d'água da versão de avaliação e habilitar a saída completa. Para configurar o mecanismo de renderização para o seu sistema operacional, siga o guia de configuração do IronPdfEngine .
Como faço para mesclar vários arquivos PDF em Node.js?
PdfDocument.merge() aceita um array de objetos PdfDocument e retorna um novo documento contendo todas as páginas na ordem em que os documentos de origem aparecem no array. A operação não é destrutiva; os objetos de arquivo originais não são modificados.
//: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() carrega os arquivos de origem em paralelo, em vez de um de cada vez, o que é importante ao processar coleções maiores. A chamada merge() concatena os documentos na ordem do array, portanto, coloque os arquivos no array na sequência em que você deseja que eles apareçam na saída.
fromFile() não resolve caminhos relativos ao próprio arquivo de script.O que cada parte do código faz?
PdfDocument.fromFile(): Lê um PDF do disco e retorna um objetoPdfDocument. Para obter as assinaturas completas dos métodos, consulte a Referência da API do IronPDF for Node.jsPromise.all(): Despacha todas as operações de carga de arquivo simultaneamente, reduzindo o tempo total de carga para fusões de multidocumentos. Esse padrão também é adequado para cenários de geração de PDFs multithread e concorrentes .PdfDocument.merge(): Concatena o array de documentos carregados em um únicoPdfDocument, preservando toda a formatação, imagens e conteúdo embutido de cada origem.toFile(): Escreve o documento mesclado no caminho especificado. Combine isso com a compressão de PDF para reduzir o tamanho do arquivo de saída quando necessário.
Como faço para mesclar páginas específicas de cada PDF?
Nem sempre o objetivo é copiar todas as páginas de todos os documentos de origem. Para mesclar intervalos de páginas seletivas de cada arquivo de entrada, extraia as páginas desejadas antes de passar os documentos para 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) aceita índices de página baseados em zero. Passar 0, 0 extrai apenas a primeira página, enquanto 0, 2 extrai as três primeiras páginas. O loop constrói um array de documentos de intervalo de página na ordem em que aparecem em ranges, então merge() os concatena na saída final.
Este padrão é útil ao montar contratos a partir de uma página de assinatura, um apêndice e uma folha de rosto armazenados em arquivos separados. Você pode coletar exatamente as páginas que importam de cada fonte sem duplicar arquivos no disco.
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 adiciono cabeçalhos e rodapés a um PDF mesclado?
Após a fusão, chame addHtmlHeader() e addHtmlFooter() no documento resultante para aplicar cabeçalhos e rodapés consistentes em todas as páginas. Esses métodos aceitam uma string HTML e um objeto de opções.
//: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');
Os espaços reservados {page} e {total-pages} são resolvidos no momento da renderização contra a contagem de páginas do documento mesclado. Use drawDividerLine: true para separar visualmente o cabeçalho ou rodapé do conteúdo da página.
Aplicar cabeçalhos e rodapés após a mesclagem significa que cada página no documento combinado recebe o mesmo tratamento, independentemente de qual arquivo fonte veio. Para opções completas de configuração de cabeçalho e rodapé, veja os exemplos de cabeçalhos e rodapés HTML.
Como protejo um PDF mesclado com senha?
Aplique proteção por senha e restrições de permissão após a fusão, chamando saveAs() com um objeto de opções de segurança. Isso impede o acesso não autorizado ao 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');
O userPassword é necessário para abrir o documento; o ownerPassword controla as próprias configurações de permissão. Definir allowUserPrinting: true enquanto desativa outros sinais de permissão permite que os destinatários imprimam o documento, mas impede a edição, cópia e anotação. Para uma lista completa de sinalizadores de permissão disponíveis, consulte a Referência API IronPDF Node.js.
fromFile(). Tentar mesclar um documento criptografado sem fornecer sua senha resultará em um erro.Como mesclo PDFs e adiciono uma assinatura digital?
Mesclar PDFs e, em seguida, assinando imediatamente o resultado, produz um único documento assinado que cobre todo o conteúdo de origem. Aplique applySignature() após merge() para anexar um certificado digital à saída 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'
);
O método applySignature() insere o certificado nos metadados do PDF para que os leitores possam verificar a integridade do documento. Este fluxo de trabalho é comum em pipelines de montagem de contratos, onde várias seções são combinadas e depois co-assinadas antes da distribuição. Para um tutorial completo sobre assinatura baseada em certificado, consulte os exemplos de assinaturas digitais.
Como solucionar erros comuns de mesclagem de PDFs?
A maioria dos erros durante a mesclagem se enquadra em quatro categorias: arquivos ausentes, esgotamento de memória, entradas corrompidas e problemas de permissão. A tabela abaixo lista as causas mais frequentes e como resolver cada uma.
| Erro | Causa Provável | Solução |
|---|---|---|
| Arquivo não encontrado | Caminho incorreto ou incompatibilidade de diretório de trabalho | Use caminhos absolutos ou verifique o diretório de trabalho do processo |
| Esgotamento da memória heap do JavaScript | Carregando muitos PDFs grandes simultaneamente | Aumente a memória do Node.js: node --max-old-space-size=4096 script.js |
| PDF inválido ou corrompido | Arquivo de origem está danificado ou não é um PDF válido | Valide arquivos de origem com um leitor de PDF antes de processar |
| Permissão negada | Sem acesso de leitura na entrada ou sem acesso de gravação no diretório de saída | Verifique as permissões de arquivos e diretórios no sistema operacional |
| PDF de origem criptografado | PDF de entrada requer uma senha para abrir | Passe a senha como o segundo argumento para fromFile() |
Para problemas de configuração específicos do ambiente, o changelog do IronPDF documenta problemas conhecidos e correções. Se os problemas persistirem após verificar a tabela acima, envolva a chamada de mesclagem em um bloco try-catch para exibir a mensagem completa de erro da biblioteca.
fromFile(). Um único arquivo ausente faz com que toda chamada Promise.all() seja rejeitada, cancelando a fusão.O próprio Node.js fornece ferramentas úteis para validação de caminho antes do voo. O método Node.js fs.promises.access permite que você verifique se um arquivo é legível antes de passá-lo para o IronPDF. Para perguntas sobre como os desenvolvedores da comunidade lidam com cenários semelhantes de erro de mesclagem, o tópico Stack Overflow sobre mesclagem de PDFs no Node.js fornece contexto adicional.
Quais são os próximos passos para mesclar PDFs no Node.js?
Os exemplos acima cobrem os cenários de mesclagem mais comuns: combinação básica de arquivo, seleção de intervalo de páginas, injeção de cabeçalho e rodapé, proteção por senha e assinatura digital. IronPDF também suporta gerenciar formulários PDF em páginas mescladas, carimbar novo conteúdo no documento combinado e produzir imagens rasterizadas do resultado final para geração de visualizações.
Inicie seu teste gratuito de 30 dias para testar a mesclagem sem uma marca d'água, ou veja as opções de licenciamento se estiver pronto para implantar.
Pronto para ver o que mais o IronPDF pode fazer? Visite a documentação do IronPDF for Node.js para o tutorial completo da API e guias adicionais de como fazer.
Perguntas frequentes
Como posso mesclar vários arquivos PDF em um no Node.js?
Carregue cada arquivo com PdfDocument.fromFile(), colete os resultados em uma matriz, passe a matriz para PdfDocument.merge() e salve o resultado com toFile(). Use Promise.all() para carregar arquivos em paralelo ao mesclar três ou mais documentos.
O IronPDF preserva a formatação ao mesclar PDFs?
Sim. O IronPDF preserva fontes, imagens, formulários incorporados e geometria de página de cada documento de origem. A saída mesclada mantém o layout original de cada página, na ordem em que os arquivos de origem aparecem na matriz de entrada.
Como posso mesclar apenas páginas específicas de cada PDF?
Chame extractPages(startPage, endPage) em cada documento carregado antes de passá-lo para PdfDocument.merge(). Os índices de página são baseados em zero, então a primeira página é o índice 0. O documento retornado contém apenas o intervalo especificado.
Posso adicionar cabeçalhos e rodapés a um PDF mesclado?
Sim. Após a mesclagem, chame addHtmlHeader() e addHtmlFooter() no documento resultante. Ambos os métodos aceitam uma string HTML e um objeto de opções. Use os marcadores {page} e {total-pages} para numeração de páginas automática.
Como posso proteger por senha um PDF mesclado no Node.js?
Chame saveAs() com um objeto de opções de segurança especificando userPassword, ownerPassword e flags de permissão, como allowUserPrinting. A userPassword é necessária para abrir o documento; a ownerPassword controla as configurações de permissão.
O que devo fazer se a mesclagem falhar com um erro de arquivo não encontrado?
Verifique se todos os caminhos dos arquivos de entrada estão corretos em relação ao diretório de trabalho do processo Node.js ou mude para caminhos absolutos. Use fs.promises.access() para confirmar se cada arquivo é legível antes de chamar PdfDocument.fromFile().
O que acontece se um dos PDFs de origem estiver criptografado?
Tentar carregar um PDF criptografado sem fornecer sua senha lançará um erro e rejeitará toda a chamada Promise.all(). Forneça a senha do documento como segundo argumento para fromFile() antes de mesclar.
Preciso de uma chave de licença para mesclar PDFs com IronPDF?
O IronPDF funciona sem uma chave de licença durante o desenvolvimento, mas os documentos de saída incluem uma marca d'água de avaliação. Configure uma chave valida para implantação em produção para remover a marca d'água e habilitar a funcionalidade completa.

