Description
This node.js library can merge multiple PDF documents, or parts of them, to one new PDF document. It's only dependency is pdf-lib so it can run in any javascript-only environment without any non-javascript dependencies.
Legacy notes
- If you are searching for the legacy version based on pdfjs please install a v3 release. Since v4 we use pdf-lib instead.
- If you are searching for a legacy version using CommonJS modules please install a v4 release. Since v5 we use the modern ESM ("import") instead of the CommonJS ("require) module standard.
This library is inspired by the PHP library PDFMerger and has a very similar API.
Installation
npm install --save pdf-merger-js
or global installation if you just want to use the cli tool:
npm install -g pdf-merger-js
Usage
CLI "pdf-merge"
Usage: pdf-merge [options] <inputFiles...>
merge multiple PDF documents, or parts of them, to a new PDF document
Options:
-V, --version output the version number
-o, --output <outputFile> Merged PDF output file path
-v, --verbose Print verbose output
-s, --silent do not print any output to stdout. Overwrites --verbose
-h, --help display help for command
Example calls
Merge pages 1-2 from the first input with pages 1,2 and 5-7 from the second pdf document:
pdf-merge --output ./merged.pdf ./input1.pdf#1-2 ./input2.pdf#1,2,5-7
Get two pdf files from the an url and merge the first one with pages 2-3 from the second one:
pdf-merge --verbose --output ./sample.pdf Testfile.pdf https://pdfobject.com/pdf/sample.pdf https://upload.wikimedia.org/wikipedia/commons/1/13/Example.pdf#2-3
node.js
The node.js version has the following export functions:
-
saveAsBuffer
exports a merged pdf as an Buffer. -
save
saves the pdf under the given filename. -
setMetadata
set Metadata for producer, author, title or creator. -
reset
resets the internal state of the document, to start again.
async node.js example
import PDFMerger from 'pdf-merger-js';
var merger = new PDFMerger();
(async () => {
await merger.add('pdf1.pdf'); //merge all pages. parameter is the path to file and filename.
await merger.add('pdf2.pdf', 2); // merge only page 2
await merger.add('pdf2.pdf', [1, 3]); // merge the pages 1 and 3
await merger.add('pdf2.pdf', '4, 7, 8'); // merge the pages 4, 7 and 8
await merger.add('pdf3.pdf', '3 to 5'); //merge pages 3 to 5 (3,4,5)
await merger.add('pdf3.pdf', '3-5'); //merge pages 3 to 5 (3,4,5)
// Set metadata
await merger.setMetadata({
producer: "pdf-merger-js based script",
author: "John Doe",
creator: "John Doe",
title: "My live as John Doe"
});
await merger.save('merged.pdf'); //save under given name and reset the internal document
// Export the merged PDF as a nodejs Buffer
// const mergedPdfBuffer = await merger.saveAsBuffer();
// fs.writeSync('merged.pdf', mergedPdfBuffer);
})();
Browser
The Browser version has the following export functions:
-
saveAsBuffer
exports a merged pdf as an Uint8Array. -
saveAsBlob
exports a merged pdf as a Blob. -
save
starts a file-download directly in the browser. -
setMetadata
set Metadata for producer, author, title or creator. -
reset
resets the internal state of the document, to start again.
async react example
import PDFMerger from 'pdf-merger-js/browser';
import React, { useEffect, useState } from 'react';
// files: Array of PDF File or Blob objects
const Merger = (files) => {
const [mergedPdfUrl, setMergedPdfUrl] = useState();
useEffect(() => {
const render = async () => {
const merger = new PDFMerger();
for(const file of files) {
await merger.add(file);
}
await merger.setMetadata({
producer: "pdf-merger-js based script"
});
const mergedPdf = await merger.saveAsBlob();
const url = URL.createObjectURL(mergedPdf);
return setMergedPdfUrl(url);
};
render().catch((err) => {
throw err;
});
() => setMergedPdfUrl({});
}, [files, setMergedPdfUrl]);
return !data ? (
<>Loading</>
) : (
<iframe
height={1000}
src={`${mergedPdfUrl}`}
title='pdf-viewer'
width='100%s'
></iframe>
);
};
Similar libraries
- pdf-merge has a dependency on PDFtk.
- easy-pdf-merge has a dependency on the Apache PDFBox® - A Java PDF Library.
- pdfmerge has a dependency on python and PyPDF2.