Last active
January 24, 2023 06:24
-
-
Save wmakeev/ede27b97b3d227258684c5e80bf7fca3 to your computer and use it in GitHub Desktop.
[Merge PDF] #pdf #merge
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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