From f587797ddb3a0ad03af87d0138d7f50901816e6e Mon Sep 17 00:00:00 2001 From: Felix Kaspar Date: Sun, 12 May 2024 21:40:28 +0200 Subject: [PATCH] merge --- .../public/locales/merge/en.json | 4 ++ shared-operations/src/functions/merge.ts | 57 +++++++++++++++++++ shared-operations/src/functions/mergePDFs.ts | 20 ------- 3 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 shared-operations/public/locales/merge/en.json create mode 100644 shared-operations/src/functions/merge.ts delete mode 100644 shared-operations/src/functions/mergePDFs.ts diff --git a/shared-operations/public/locales/merge/en.json b/shared-operations/public/locales/merge/en.json new file mode 100644 index 000000000..cb07f5e8e --- /dev/null +++ b/shared-operations/public/locales/merge/en.json @@ -0,0 +1,4 @@ +{ + "friendlyName": "Merge", + "description": "Merge multiple input documents into a single output document." +} \ No newline at end of file diff --git a/shared-operations/src/functions/merge.ts b/shared-operations/src/functions/merge.ts new file mode 100644 index 000000000..0bce193d7 --- /dev/null +++ b/shared-operations/src/functions/merge.ts @@ -0,0 +1,57 @@ + +import { PdfFile, RepresentationType } from "../wrappers/PdfFile"; +import { Operator, Progress, nToOne } from "."; + +import Joi from "@stirling-tools/joi"; +import { JoiPDFFileSchema } from "../wrappers/PdfFileJoi"; + +import i18next from "i18next"; + +import { PDFDocument } from "pdf-lib"; + +export class Merge extends Operator { + static type = "merge"; + + /** + * Validation & Localisation + */ + + protected static inputSchema = JoiPDFFileSchema.label(i18next.t("inputs.pdffile.name")).description(i18next.t("inputs.pdffile.description")); + protected static valueSchema = Joi.object({}); + protected static outputSchema = JoiPDFFileSchema.label(i18next.t("outputs.pdffile.name")).description(i18next.t("outputs.pdffile.description")); + + static schema = Joi.object({ + input: Merge.inputSchema, + values: Merge.valueSchema.required(), + output: Merge.outputSchema + }).label(i18next.t("friendlyName", { ns: "merge" })).description(i18next.t("description", { ns: "merge" })); + + + /** + * Logic + */ + + /** Merging pages from multiple pdfs into a singe output document. */ + async run(input: PdfFile[], progressCallback: (state: Progress) => void): Promise { + return nToOne(input, async (input) => { + const mergedPdf = await PDFDocument.create(); + + for (let i = 0; i < input.length; i++) { + progressCallback({ curFileProgress: 0, operationProgress: i/input.length }); + const pdfToMerge = await input[i].pdfLibDocument; + const copiedPages = await mergedPdf.copyPages(pdfToMerge, pdfToMerge.getPageIndices()); + copiedPages.forEach((page, index, array) => { + progressCallback({ curFileProgress: index/array.length, operationProgress: i/input.length }); + mergedPdf.addPage(page); + }); + progressCallback({ curFileProgress: 1, operationProgress: i/input.length }); + } + progressCallback({ curFileProgress: 1, operationProgress: 1 }); + + + const newName = "merged_" + input.map(input => input.filename).join("_and_"); + return new PdfFile("mergedPDF", mergedPdf, RepresentationType.PDFLibDocument, newName); + + }); + } +} \ No newline at end of file diff --git a/shared-operations/src/functions/mergePDFs.ts b/shared-operations/src/functions/mergePDFs.ts deleted file mode 100644 index d46511e99..000000000 --- a/shared-operations/src/functions/mergePDFs.ts +++ /dev/null @@ -1,20 +0,0 @@ - -import { PDFDocument } from "pdf-lib"; -import { PdfFile, RepresentationType } from "../wrappers/PdfFile"; - -export interface MergeParamsType { - files: PdfFile[]; -} - -export async function mergePDFs(params: MergeParamsType): Promise { - const mergedPdf = await PDFDocument.create(); - - for (let i = 0; i < params.files.length; i++) { - const pdfToMerge = await params.files[i].pdfLibDocument; - const copiedPages = await mergedPdf.copyPages(pdfToMerge, pdfToMerge.getPageIndices()); - copiedPages.forEach((page) => mergedPdf.addPage(page)); - } - - const newName = "("+params.files.map(input => input.filename).join("_and_") + ")_merged"; - return new PdfFile("mergedPDF", mergedPdf, RepresentationType.PDFLibDocument, newName); -} \ No newline at end of file