From 3496a5d6582e9d5a19b7e1492ffeeb247373c9cf Mon Sep 17 00:00:00 2001 From: Saud Fatayerji Date: Fri, 17 Nov 2023 17:13:42 +0300 Subject: [PATCH] added rearrange-pages endpoint --- .../src/routes/api/operations-controller.ts | 5 +++- .../src/functions/arrangePages.ts | 27 +++++++++++++++++++ .../src/functions/sortPagesWithPreset.ts | 25 ----------------- shared-operations/src/index.ts | 6 ++--- .../src/workflow/traverseOperations.ts | 2 +- 5 files changed, 35 insertions(+), 30 deletions(-) create mode 100644 shared-operations/src/functions/arrangePages.ts delete mode 100644 shared-operations/src/functions/sortPagesWithPreset.ts diff --git a/server-node/src/routes/api/operations-controller.ts b/server-node/src/routes/api/operations-controller.ts index 8603cb75..3d57e405 100644 --- a/server-node/src/routes/api/operations-controller.ts +++ b/server-node/src/routes/api/operations-controller.ts @@ -63,7 +63,10 @@ registerEndpoint("/split-pdf", "_split", upload.single("file"), Operations.split pageIndexes: Joi.string().required(), }).required()); -//organise/arrange +registerEndpoint("/rearrange-pages", "", upload.single("file"), Operations.arrangePages, Joi.object({ + file: PdfFileSchema.required(), + arrangementConfig: Joi.string().required(), +}).required()); registerEndpoint("/rotate-pdf", "", upload.single("file"), Operations.rotatePages, Joi.object({ file: PdfFileSchema.required(), diff --git a/shared-operations/src/functions/arrangePages.ts b/shared-operations/src/functions/arrangePages.ts new file mode 100644 index 00000000..15c00260 --- /dev/null +++ b/shared-operations/src/functions/arrangePages.ts @@ -0,0 +1,27 @@ + +import { PdfFile } from '../wrappers/PdfFile.js'; +import { Sorts } from './common/pageIndexesSorting.js'; +import { getPages } from './common/getPagesByIndex.js'; +import { parsePageIndexSpecification } from './common/pageIndexesUtils.js'; + +export type ArrangePagesParamsType = { + file: PdfFile; + arrangementConfig: string; // a member of Sorts, or a page index specification +} +export async function arrangePages(params: ArrangePagesParamsType) { + const { file, arrangementConfig } = params; + const pdfLibDocument = await file.pdfLibDocument; + const pageCount = pdfLibDocument.getPageCount(); + + let sortIndexes: number[]; + if (arrangementConfig in Sorts) { + const sortFunction = Sorts[arrangementConfig]; + sortIndexes = sortFunction(pageCount); + } else { + sortIndexes = parsePageIndexSpecification(arrangementConfig, pageCount); + } + + const newFile = await getPages(file, sortIndexes); + newFile.filename += "arrangedPages" + return newFile; +} diff --git a/shared-operations/src/functions/sortPagesWithPreset.ts b/shared-operations/src/functions/sortPagesWithPreset.ts deleted file mode 100644 index fe3eb4c4..00000000 --- a/shared-operations/src/functions/sortPagesWithPreset.ts +++ /dev/null @@ -1,25 +0,0 @@ - -import { PdfFile } from '../wrappers/PdfFile.js'; -import { Sorts } from './common/pageIndexesSorting.js'; -import { getPages } from './common/getPagesByIndex.js'; - -export type SortPagesWithPresetParamsType = { - file: PdfFile; - sortPreset: string; -} -export async function sortPagesWithPreset(params: SortPagesWithPresetParamsType) { - const { file, sortPreset } = params; - const pdfLibDocument = await file.pdfLibDocument; - - if (!(sortPreset in Sorts)) { - throw new Error("Supplied parameters not supported"); - } - - const sortFunction = Sorts[sortPreset]; - const pageCount = pdfLibDocument.getPageCount(); - const sortIndexes = sortFunction(pageCount); - - const newFile = await getPages(file, sortIndexes); - newFile.filename += "_sortedPages" - return newFile; -} diff --git a/shared-operations/src/index.ts b/shared-operations/src/index.ts index 6d37d9a2..f9a7f45a 100644 --- a/shared-operations/src/index.ts +++ b/shared-operations/src/index.ts @@ -1,4 +1,5 @@ +import { arrangePages, ArrangePagesParamsType } from './functions/arrangePages' import { extractPages, ExtractPagesParamsType } from "./functions/extractPages"; import { impose, ImposeParamsBaseType, ImposeParamsType } from "./functions/impose"; import { mergePDFs, MergeParamsType } from './functions/mergePDFs'; @@ -6,7 +7,6 @@ import { removeBlankPages, RemoveBlankPagesParamsType } from "./functions/remove import { rotatePages, RotateParamsType } from './functions/rotatePages'; import { scaleContent, ScaleContentParamsType} from './functions/scaleContent'; import { scalePage, ScalePageParamsType } from './functions/scalePage'; -import { sortPagesWithPreset, SortPagesWithPresetParamsType } from './functions/sortPagesWithPreset' import { splitPagesByPreset, SplitPageByPresetParamsType } from './functions/splitPagesByPreset'; import { splitPdfByIndex, SplitPdfByIndexParamsType } from './functions/splitPdfByIndex'; import { updateMetadata, UpdateMetadataParams } from "./functions/updateMetadata"; @@ -17,6 +17,7 @@ import { Override } from '../declarations/TypeScriptUtils' // Import injected libraries here! const toExport = { + arrangePages, extractPages, impose, mergePDFs, @@ -24,7 +25,6 @@ const toExport = { rotatePages, scaleContent, scalePage, - sortPagesWithPreset, splitPagesByPreset, splitPdfByIndex, updateMetadata, @@ -32,6 +32,7 @@ const toExport = { export default toExport; export type OperationsParametersBaseType = { + arrangePages: ArrangePagesParamsType extractPages: ExtractPagesParamsType; impose: ImposeParamsBaseType; mergePDFs: MergeParamsType; @@ -39,7 +40,6 @@ export type OperationsParametersBaseType = { rotatePages: RotateParamsType; scaleContent: ScaleContentParamsType; scalePage: ScalePageParamsType; - sortPagesWithPreset: SortPagesWithPresetParamsType; splitPagesByPreset: SplitPageByPresetParamsType; splitPdfByIndex: SplitPdfByIndexParamsType; updateMetadata: UpdateMetadataParams; diff --git a/shared-operations/src/workflow/traverseOperations.ts b/shared-operations/src/workflow/traverseOperations.ts index c3580412..5e7f579a 100644 --- a/shared-operations/src/workflow/traverseOperations.ts +++ b/shared-operations/src/workflow/traverseOperations.ts @@ -84,7 +84,7 @@ export async function * traverseOperations(operations: Action[], input: PdfFile[ break; case "sortPagesWithPreset": yield* nToN(input, action, async (input) => { - const newPdf = await Operations.sortPagesWithPreset({file: input, sortPreset: action.values["sortPreset"]}); + const newPdf = await Operations.arrangePages({file: input, arrangementConfig: action.values["arrangementConfig"]}); return newPdf; }); break;