From edd4e0c39ab0905a072f740af7e53f96e6db2b4e Mon Sep 17 00:00:00 2001 From: Felix Kaspar Date: Sat, 18 May 2024 22:01:19 +0200 Subject: [PATCH] splitPdfByIndex --- .../src/functions/splitPdfByIndex.ts | 65 +++++++++++++------ 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/shared-operations/src/functions/splitPdfByIndex.ts b/shared-operations/src/functions/splitPdfByIndex.ts index 4e136e852..3874d0bd8 100644 --- a/shared-operations/src/functions/splitPdfByIndex.ts +++ b/shared-operations/src/functions/splitPdfByIndex.ts @@ -1,25 +1,52 @@ +import { PdfFile, RepresentationType } from "../wrappers/PdfFile"; +import { Operator, Progress, oneToN } from "."; + +import Joi from "@stirling-tools/joi"; +import { JoiPDFFileSchema } from "../wrappers/PdfFileJoi"; + +import i18next from "i18next"; + +import CommaArrayJoiExt from "../wrappers/CommaArrayJoiExt"; -import { PdfFile } from "../wrappers/PdfFile"; -import { parsePageIndexSpecification } from "./common/pageIndexesUtils"; import { splitPagesByIndex } from "./common/splitPagesByIndex"; -export interface SplitPdfByIndexParamsType { - file: PdfFile; - pageIndexes: string | number[]; -} -export async function splitPdfByIndex(params: SplitPdfByIndexParamsType): Promise { - const { file, pageIndexes } = params; - const pdfLibDocument = await file.pdfLibDocument; +export class SplitPdfByIndex extends Operator { + static type = "splitPdfByIndex"; - let indexes = pageIndexes; + /** + * Validation & Localisation + */ - if (!Array.isArray(indexes)) { - indexes = parsePageIndexSpecification(indexes, pdfLibDocument.getPageCount()); + protected static inputSchema = JoiPDFFileSchema.label(i18next.t("inputs.pdffile.name")).description(i18next.t("inputs.pdffile.description")); + protected static valueSchema = Joi.object({ + pageIndexes: CommaArrayJoiExt.comma_array().items(Joi.number().integer()).required() + .label(i18next.t("values.pageIndexes.friendlyName", { ns: "splitPdfByIndex" })).description(i18next.t("values.pageIndexes.description", { ns: "splitPdfByIndex" })) + .example("1").example("1, 2, 3, 4").example("4, 2, 4, 3").required() + }); + protected static outputSchema = JoiPDFFileSchema.label(i18next.t("outputs.pdffile.name")).description(i18next.t("outputs.pdffile.description")); + + static schema = Joi.object({ + input: SplitPdfByIndex.inputSchema, + values: SplitPdfByIndex.valueSchema.required(), + output: SplitPdfByIndex.outputSchema + }).label(i18next.t("friendlyName", { ns: "splitPdfByIndex" })).description(i18next.t("description", { ns: "splitPdfByIndex" })); + + + /** + * Logic + */ + + /** PDF extraction, specify pages from one pdf and output them to a new pdf */ + async run(input: PdfFile[], progressCallback: (state: Progress) => void): Promise { + return oneToN(input, async (input, index, max) => { + + const newFiles = await splitPagesByIndex(input, this.actionValues.pageIndexes); + for (let i = 0; i < newFiles.length; i++) { + newFiles[i].filename += "_split-" + i; + } + progressCallback({ curFileProgress: 1, operationProgress: index/max }); + + return newFiles; + }); } - - const newFiles = await splitPagesByIndex(file, indexes); - for (let i = 0; i < newFiles.length; i++) { - newFiles[i].filename += "_split-"+i; - } - return newFiles; -} +} \ No newline at end of file