From 2673e1521c8718ee51ce4ffe0ad2f478c6cbccec Mon Sep 17 00:00:00 2001 From: meenulekha-premakumar Date: Wed, 26 Nov 2025 11:46:50 +0100 Subject: [PATCH 1/2] feat: add new action to remove passwords from pdf files --- packages/pieces/community/pdf/package.json | 2 +- packages/pieces/community/pdf/src/index.ts | 2 + .../pdf/src/lib/actions/remove-password.ts | 67 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 packages/pieces/community/pdf/src/lib/actions/remove-password.ts diff --git a/packages/pieces/community/pdf/package.json b/packages/pieces/community/pdf/package.json index ee1b1040515..9239dcc1dc1 100644 --- a/packages/pieces/community/pdf/package.json +++ b/packages/pieces/community/pdf/package.json @@ -1,6 +1,6 @@ { "name": "@activepieces/piece-pdf", - "version": "0.2.17", + "version": "0.3.0", "dependencies": { "jimp": "^0.22.12", "pdf-parse": "1.1.1", diff --git a/packages/pieces/community/pdf/src/index.ts b/packages/pieces/community/pdf/src/index.ts index a3ee71de882..0444493a6eb 100644 --- a/packages/pieces/community/pdf/src/index.ts +++ b/packages/pieces/community/pdf/src/index.ts @@ -6,6 +6,7 @@ import { imageToPdf } from './lib/actions/image-to-pdf'; import { pdfPageCount } from './lib/actions/pdf-page-count'; import { extractPdfPages } from './lib/actions/extract-pdf-pages'; import { mergePdfs } from './lib/actions/merge-pdfs'; +import { removePassword } from './lib/actions/remove-password'; export const PDF = createPiece({ displayName: 'PDF', @@ -27,6 +28,7 @@ export const PDF = createPiece({ pdfPageCount, extractPdfPages, mergePdfs, + removePassword, ], triggers: [], }); diff --git a/packages/pieces/community/pdf/src/lib/actions/remove-password.ts b/packages/pieces/community/pdf/src/lib/actions/remove-password.ts new file mode 100644 index 00000000000..fca02d8937b --- /dev/null +++ b/packages/pieces/community/pdf/src/lib/actions/remove-password.ts @@ -0,0 +1,67 @@ +import { createAction, Property } from '@activepieces/pieces-framework'; +import { PDFDocument } from 'pdf-lib'; + +export const removePassword = createAction({ + name: 'removePassword', + displayName: 'Remove Password', + description: 'Remove password protection from a PDF file to enable content manipulation', + props: { + file: Property.File({ + displayName: 'PDF File', + description: 'Password-protected PDF file', + required: true, + }), + password: Property.ShortText({ + displayName: 'Password', + description: 'Password to unlock the PDF', + required: true, + }), + outputFileName: Property.ShortText({ + displayName: 'Output File Name', + description: 'Name for the unprotected PDF file (without extension)', + required: false, + defaultValue: 'unlocked-document', + }), + }, + errorHandlingOptions: { + continueOnFailure: { + defaultValue: false, + }, + retryOnFailure: { + hide: true, + }, + }, + async run(context) { + const { file, password, outputFileName } = context.propsValue; + + try { + const pdfBytes = new Uint8Array(Buffer.isBuffer(file.data) ? file.data : Buffer.from(file.data)); + + const pdfDoc = await PDFDocument.load(pdfBytes, { + password, + ignoreEncryption: true, + updateMetadata: false, + } as any); + + const decryptedBytes = await pdfDoc.save(); + + return context.files.write({ + data: Buffer.from(decryptedBytes), + fileName: `${outputFileName}.pdf`, + }); + + } catch (error) { + const errorMessage = (error as Error).message || 'Unknown error'; + + if (errorMessage.includes('password')) { + throw new Error('Invalid password or PDF is not password-protected'); + } + if (errorMessage.includes('encrypted') || errorMessage.includes('encryption')) { + throw new Error('Unsupported encryption type.'); + } + + throw new Error(`Failed to remove password from PDF: ${errorMessage}`); + } + }, +}); + From 971f80424e8ffc41fd268d46e2e7026cb6a35ad0 Mon Sep 17 00:00:00 2001 From: meenulekha-premakumar Date: Thu, 27 Nov 2025 14:20:05 +0100 Subject: [PATCH 2/2] fix: update version number --- packages/pieces/community/pdf/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pieces/community/pdf/package.json b/packages/pieces/community/pdf/package.json index 9239dcc1dc1..d4b107d6cd0 100644 --- a/packages/pieces/community/pdf/package.json +++ b/packages/pieces/community/pdf/package.json @@ -1,6 +1,6 @@ { "name": "@activepieces/piece-pdf", - "version": "0.3.0", + "version": "0.2.18", "dependencies": { "jimp": "^0.22.12", "pdf-parse": "1.1.1",