From 9bca4848f30f956bccf322e2585e1cda691296e2 Mon Sep 17 00:00:00 2001
From: Saud Fatayerji <saudfatayerji@gmail.com>
Date: Sat, 18 Nov 2023 19:56:45 +0300
Subject: [PATCH] Added remove pages

---
 .../src/routes/api/operations-controller.ts   |  5 +++++
 .../src/functions/removePages.ts              | 21 +++++++++++++++++++
 shared-operations/src/index.ts                |  3 +++
 3 files changed, 29 insertions(+)
 create mode 100644 shared-operations/src/functions/removePages.ts

diff --git a/server-node/src/routes/api/operations-controller.ts b/server-node/src/routes/api/operations-controller.ts
index 3d57e4052..5e7484a0e 100644
--- a/server-node/src/routes/api/operations-controller.ts
+++ b/server-node/src/routes/api/operations-controller.ts
@@ -73,6 +73,11 @@ registerEndpoint("/rotate-pdf", "", upload.single("file"), Operations.rotatePage
     rotation: Joi.alternatives().try(Joi.number(), Joi.array().items(Joi.number())).required(),
 }).required());
 
+registerEndpoint("/remove-pages", "", upload.single("file"), Operations.removePages, Joi.object({
+    file: PdfFileSchema.required(),
+    pageSelector: Joi.string().required(),
+}).required());
+
 //Remove Pages
 //impose
 //Adjust page size/scale
diff --git a/shared-operations/src/functions/removePages.ts b/shared-operations/src/functions/removePages.ts
new file mode 100644
index 000000000..6174e12c0
--- /dev/null
+++ b/shared-operations/src/functions/removePages.ts
@@ -0,0 +1,21 @@
+
+import { PdfFile } from '../wrappers/PdfFile.js';
+import { getPages } from './common/getPagesByIndex.js';
+import { invertSelection, parsePageIndexSpecification } from './common/pageIndexesUtils.js';
+
+export type RemovePagesParamsType = {
+    file: PdfFile;
+    pageSelector: string;
+}
+export async function removePages(params: RemovePagesParamsType) {
+    const { file, pageSelector } = params;
+    const pdfDoc = await file.pdfLibDocument;
+    const pageCount = pdfDoc.getPageCount();
+
+    const pageSelection = parsePageIndexSpecification(pageSelector, pageCount);
+    const pagesToKeep = invertSelection(pageSelection, pageCount);
+
+    const newFile = await getPages(file, pagesToKeep);
+    newFile.filename += "_removedPages"
+    return newFile;
+}
\ No newline at end of file
diff --git a/shared-operations/src/index.ts b/shared-operations/src/index.ts
index 13fe808c7..100e590b6 100644
--- a/shared-operations/src/index.ts
+++ b/shared-operations/src/index.ts
@@ -4,6 +4,7 @@ import { extractPages, ExtractPagesParamsType } from "./functions/extractPages";
 import { impose, ImposeParamsType } from "./functions/impose";
 import { mergePDFs, MergeParamsType } from './functions/mergePDFs';
 import { removeBlankPages, RemoveBlankPagesParamsType } from "./functions/removeBlankPages";
+import { removePages, RemovePagesParamsType } from "./functions/removePages";
 import { rotatePages, RotateParamsType } from './functions/rotatePages';
 import { scaleContent, ScaleContentParamsType} from './functions/scaleContent';
 import { scalePage, ScalePageParamsType } from './functions/scalePage';
@@ -22,6 +23,7 @@ const toExport = {
     impose,
     mergePDFs,
     removeBlankPages,
+    removePages,
     rotatePages,
     scaleContent,
     scalePage,
@@ -37,6 +39,7 @@ export type OperationsParametersBaseType = {
     impose: ImposeParamsType;
     mergePDFs: MergeParamsType;
     removeBlankPages: RemoveBlankPagesParamsType;
+    removePages: RemovePagesParamsType;
     rotatePages: RotateParamsType;
     scaleContent: ScaleContentParamsType;
     scalePage: ScalePageParamsType;