js实现合并pdf
使用pdf-lib库合并PDF
pdf-lib是一个纯JavaScript库,可以在浏览器和Node.js环境中使用。它支持创建、修改和合并PDF文件。
安装pdf-lib:
npm install pdf-lib
合并PDF示例代码:
const { PDFDocument } = require('pdf-lib');
const fs = require('fs');
async function mergePdfs(pdfPaths, outputPath) {
const mergedPdf = await PDFDocument.create();
for (const pdfPath of pdfPaths) {
const pdfBytes = fs.readFileSync(pdfPath);
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.js合并PDF
PDF.js是Mozilla开发的PDF处理库,主要用于渲染但也可以用于基本操作。
安装pdfjs-dist:
npm install pdfjs-dist
合并示例:
const pdfjsLib = require('pdfjs-dist/legacy/build/pdf.js');
const fs = require('fs');
async function mergeWithPdfJs(pdfPaths, outputPath) {
const mergedPdf = await pdfjsLib.PDFDocument.create();
for (const path of pdfPaths) {
const data = fs.readFileSync(path);
const pdf = await pdfjsLib.PDFDocument.load(data);
const pages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
pages.forEach(page => mergedPdf.addPage(page));
}
const mergedPdfBytes = await mergedPdf.save();
fs.writeFileSync(outputPath, mergedPdfBytes);
}
浏览器端合并方案
对于纯浏览器环境实现,可以使用pdf-lib的浏览器版本:
<script src="https://unpkg.com/pdf-lib@1.16.0/dist/pdf-lib.min.js"></script>
<script>
async function mergeInBrowser(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' });
}
</script>
使用Node.js原生模块
对于简单的PDF合并,可以使用hummus.js:
npm install hummus
示例代码:
const hummus = require('hummus');
function mergeWithHummus(pdfPaths, outputPath) {
const pdfWriter = hummus.createWriter(outputPath);
pdfPaths.forEach(path => {
pdfWriter.appendPDFPagesFromPDF(path);
});
pdfWriter.end();
}
性能优化建议
处理大型PDF文件时考虑分块处理,避免内存问题。可以设置缓冲区大小或使用流式处理。
对于服务器端应用,建议使用专门的PDF处理服务如PDFtk或Ghostscript,通过子进程调用:

const { exec } = require('child_process');
function mergeWithPdftk(files, output) {
exec(`pdftk ${files.join(' ')} cat output ${output}`, (error) => {
if (error) throw error;
});
}
所有方案中,pdf-lib提供了最全面的功能支持,包括保留表单字段、注释等PDF特性。浏览器环境中注意处理大文件可能导致的内存限制问题。






