From facf1553ec36c493d1549c5ccbfa9c7c823b58af Mon Sep 17 00:00:00 2001 From: Saud Fatayerji Date: Sun, 19 Nov 2023 01:19:57 +0300 Subject: [PATCH] Added endpoint: scale-pages --- .../src/routes/api/operations-controller.ts | 4 ++- shared-operations/src/functions/scalePage.ts | 32 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/server-node/src/routes/api/operations-controller.ts b/server-node/src/routes/api/operations-controller.ts index 93a1b841c..02c885b54 100644 --- a/server-node/src/routes/api/operations-controller.ts +++ b/server-node/src/routes/api/operations-controller.ts @@ -2,6 +2,7 @@ import Operations from '../../utils/pdf-operations'; import { respondWithPdfFile, respondWithPdfFiles, response_mustHaveExactlyOneFile } from '../../utils/endpoint-utils'; import { PdfFile, PdfFileSchema } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile' +import { ScalePageSchema } from '@stirling-pdf/shared-operations/src/functions/scalePage' import express, { Request, Response, RequestHandler } from 'express'; const router = express.Router(); @@ -84,7 +85,8 @@ registerEndpoint("/impose", "", upload.single("file"), Operations.impose, Joi.ob format: Joi.string().required(), }).required()); -//Adjust page size/scale +registerEndpoint("/scale-pages", "", upload.single("file"), Operations.scalePage, ScalePageSchema.required()); + //Auto Split Pages //Adjust Colours/Contrast //Crop diff --git a/shared-operations/src/functions/scalePage.ts b/shared-operations/src/functions/scalePage.ts index 42e58bd86..3395c874c 100644 --- a/shared-operations/src/functions/scalePage.ts +++ b/shared-operations/src/functions/scalePage.ts @@ -1,6 +1,32 @@ +import Joi from 'joi'; import { PDFPage } from 'pdf-lib'; -import { PdfFile, RepresentationType } from '../wrappers/PdfFile'; +import { PdfFile, RepresentationType, PdfFileSchema } from '../wrappers/PdfFile'; + +const whSchema = Joi.string().custom((value, helpers) => { + console.log("value.pageSize", typeof value) + try { + const obj = JSON.parse(value); + if (!obj.width && !obj.height) { + return helpers.error('any.required', { message: 'At least one of width/height must be present' }); + } + if (typeof obj.width != 'number' && typeof obj.width != 'undefined') { + return helpers.error('any.invalid', { message: 'Width must be a number if present' }); + } + if (typeof obj.height != 'number' && typeof obj.height != 'undefined') { + return helpers.error('any.invalid', { message: 'Height must be a number if present' }); + } + return obj; + } catch (error) { + return helpers.error('any.invalid', { message: 'Value must be a valid JSON' }); + } +}); + +export const ScalePageSchema = Joi.object({ + file: PdfFileSchema.required(), + pageSize: Joi.alternatives().try(whSchema, Joi.array().items(whSchema)).required(), +}); + export type ScalePageParamsType = { file: PdfFile; @@ -29,10 +55,10 @@ export async function scalePage(params: ScalePageParamsType): Promise { function resize(page: PDFPage, newSize: {width?:number,height?:number}) { const calculatedSize = calculateSize(page, newSize); - page.setSize(calculatedSize.width, calculatedSize.height); - const xRatio = calculatedSize.width / page.getWidth(); const yRatio = calculatedSize.height / page.getHeight(); + + page.setSize(calculatedSize.width, calculatedSize.height); page.scaleContent(xRatio, yRatio); }