js实现pdf合并
使用PDF-Lib库合并PDF
安装PDF-Lib库:
npm install pdf-lib
代码示例:
const { PDFDocument } = require('pdf-lib');
const fs = require('fs');
async function mergePDFs(filePaths, outputPath) {
const mergedPdf = await PDFDocument.create();
for (const filePath of filePaths) {
const pdfBytes = fs.readFileSync(filePath);
const pdfDoc = await PDFDocument.load(pdfBytes);
const pages = await mergedPdf.copyPages(pdfDoc, pdfDoc.getPageIndices());
pages.forEach(page => mergedPdf.addPage(page));
}
const mergedPdfBytes = await mergedPdf.save();
fs.writeFileSync(outputPath, mergedPdfBytes);
}
// 使用示例
mergePDFs(['file1.pdf', 'file2.pdf'], 'merged.pdf');
使用pdf-merger-js库
安装库:
npm install pdf-merger-js
实现代码:
const PDFMerger = require('pdf-merger-js');
const merger = new PDFMerger();
const merge = async (pdfs, output) => {
for (const pdf of pdfs) {
await merger.add(pdf);
}
await merger.save(output);
};
merge(['1.pdf', '2.pdf'], 'merged.pdf');
浏览器端实现方案
使用pdf.js和File API:
const mergePdfsInBrowser = async (pdfFiles) => {
const { PDFDocument } = PDFLib;
const mergedPdf = await PDFDocument.create();
for (const file of pdfFiles) {
const arrayBuffer = await file.arrayBuffer();
const pdfDoc = await PDFDocument.load(arrayBuffer);
const pages = await mergedPdf.copyPages(pdfDoc, pdfDoc.getPageIndices());
pages.forEach(page => mergedPdf.addPage(page));
}
const mergedPdfBytes = await mergedPdf.save();
return new Blob([mergedPdfBytes], { type: 'application/pdf' });
};
使用Node.js原生模块
对于简单场景可尝试以下方法:
const fs = require('fs');
const { exec } = require('child_process');
function mergeWithPDFtk(inputs, output) {
exec(`pdftk ${inputs.join(' ')} cat output ${output}`, (err) => {
if (err) throw err;
});
}
注意事项
- 确保处理大文件时有足够内存
- 浏览器端方案需要考虑文件大小限制
- 所有异步操作需要适当处理错误
- 生产环境建议添加进度指示
以上方案中,PDF-Lib提供了最全面的功能支持,包括修改现有PDF内容的能力。pdf-merger-js则提供了更简单的API接口。浏览器端方案需要用户主动选择文件,无法直接访问本地文件系统。







