Skip to content

Instantly share code, notes, and snippets.

@wmakeev
Last active January 24, 2023 06:24
Show Gist options
  • Save wmakeev/ede27b97b3d227258684c5e80bf7fca3 to your computer and use it in GitHub Desktop.
Save wmakeev/ede27b97b3d227258684c5e80bf7fca3 to your computer and use it in GitHub Desktop.
[Merge PDF] #pdf #merge
// gist: https://gist.github.com/wmakeev/ede27b97b3d227258684c5e80bf7fca3
import { PDFDocument } from "pdf-lib";
/**
* Merges pdf files in one (with pdf-lib)
*
* @see https://stackoverflow.com/a/68482188
*
* @param {ArrayBuffer[]} pdfsToMerge
* @returns {Promise<ArrayBufferLike>}
*/
export async function mergePdfs(pdfsToMerge) {
const mergedPdf = await PDFDocument.create();
/** @param {ArrayBuffer} arrayBuffer */
const createInnerPromise = async (arrayBuffer) => {
const pdf = await PDFDocument.load(arrayBuffer);
return await mergedPdf.copyPages(pdf, pdf.getPageIndices());
};
const outerPromise = pdfsToMerge.map((arrayBuffer) => {
const innerPromise = createInnerPromise(arrayBuffer);
return innerPromise;
});
const resultOuterPromise = await Promise.all(outerPromise);
resultOuterPromise.forEach((pageArray) => {
pageArray.forEach((page) => {
mergedPdf.addPage(page);
});
});
return (await mergedPdf.save()).buffer;
}
// gist: https://gist.github.com/wmakeev/ede27b97b3d227258684c5e80bf7fca3
import { PDFDocument } from 'pdf-lib'
import _H from 'highland'
import { promiseToStream } from '@wmakeev/highland-tools'
/**
* Merges pdf files stream in one (with pdf-lib)
*
* @see https://stackoverflow.com/a/68482188
*
* @param {Highland.Stream<ArrayBuffer>} pdfsToMerge$
* @returns {Highland.Stream<ArrayBufferLike>}
*/
export function mergePdfsStream(pdfsToMerge$) {
/** @type {PDFDocument} */
let mergedPdf
return pdfsToMerge$
.map(async arrayBuffer => {
if (mergedPdf === undefined) mergedPdf = await PDFDocument.create()
const pdf = await PDFDocument.load(arrayBuffer)
const pages = await mergedPdf.copyPages(pdf, pdf.getPageIndices())
return pages
})
.map(promiseToStream)
.flatten()
.collect()
.map(pages => {
pages.forEach(p => mergedPdf.addPage(p))
})
.last()
.map(async () => (await mergedPdf.save()).buffer)
.map(promiseToStream)
.sequence()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment