From f0a18685262564b474154603c124b1deb6435213 Mon Sep 17 00:00:00 2001 From: alam00000 Date: Sun, 8 Nov 2026 22:52:12 +0530 Subject: [PATCH] fix(workflow): pass wasmUrl to pdf.js so JPEG2000 pages stop rendering blank, and fix Remove Blank Pages node failing on every PDF --- src/js/logic/add-watermark-page.ts | 3 ++- src/js/logic/merge-pdf-page.ts | 4 ++-- src/js/logic/remove-blank-pages-page.ts | 4 ++-- src/js/workflow/nodes/adjust-colors-node.ts | 5 ++--- src/js/workflow/nodes/combine-single-page-node.ts | 6 ++---- src/js/workflow/nodes/greyscale-node.ts | 5 ++--- src/js/workflow/nodes/invert-colors-node.ts | 5 ++--- src/js/workflow/nodes/pdf-to-images-node.ts | 5 ++--- src/js/workflow/nodes/posterize-node.ts | 5 ++--- src/js/workflow/nodes/remove-blank-pages-node.ts | 3 ++- src/js/workflow/nodes/scanner-effect-node.ts | 5 ++--- src/js/workflow/nodes/watermark-node.ts | 5 ++--- 12 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/js/logic/add-watermark-page.ts b/src/js/logic/add-watermark-page.ts index 6da571a5..db8363d0 100644 --- a/src/js/logic/add-watermark-page.ts +++ b/src/js/logic/add-watermark-page.ts @@ -2,6 +2,7 @@ import { createIcons, icons } from 'lucide'; import { showAlert, showLoader, hideLoader } from '../ui.js'; import { downloadFile, + getPDFDocument, hexToRgb, formatBytes, readFileAsArrayBuffer, @@ -1223,7 +1224,7 @@ async function applyWatermark() { 'flatten-watermark' ) as HTMLInputElement; if (flattenCheckbox?.checked) { - const watermarkedPdf = await pdfjsLib.getDocument({ + const watermarkedPdf = await getPDFDocument({ data: resultBytes.slice(), }).promise; const flattenedDoc = await PDFLibDocument.create(); diff --git a/src/js/logic/merge-pdf-page.ts b/src/js/logic/merge-pdf-page.ts index 73331392..c057f9d6 100644 --- a/src/js/logic/merge-pdf-page.ts +++ b/src/js/logic/merge-pdf-page.ts @@ -1,5 +1,5 @@ import { showLoader, hideLoader, showAlert } from '../ui.js'; -import { downloadFile } from '../utils/helpers.js'; +import { downloadFile, getPDFDocument } from '../utils/helpers.js'; import { state } from '../state.js'; import { batchDecryptIfNeeded } from '../utils/password-prompt.js'; import { @@ -464,7 +464,7 @@ export async function refreshMergeUI() { const fileKey = `${i}_${file.name}`; const bytes = await file.arrayBuffer(); - const pdf = await pdfjsLib.getDocument({ data: bytes.slice(0) }).promise; + const pdf = await getPDFDocument({ data: bytes.slice(0) }).promise; mergeState.pdfBytes[fileKey] = bytes; mergeState.pdfDocs[fileKey] = pdf; } diff --git a/src/js/logic/remove-blank-pages-page.ts b/src/js/logic/remove-blank-pages-page.ts index d20dbeb7..44323981 100644 --- a/src/js/logic/remove-blank-pages-page.ts +++ b/src/js/logic/remove-blank-pages-page.ts @@ -4,7 +4,7 @@ import { createIcons, icons } from 'lucide'; import { initPagePreview } from '../utils/page-preview.js'; import { loadPdfWithPasswordPrompt } from '../utils/password-prompt.js'; import { loadPdfDocument } from '../utils/load-pdf-document.js'; -import { escapeHtml } from '../utils/helpers.js'; +import { escapeHtml, getPDFDocument } from '../utils/helpers.js'; import '../utils/setup-pdf-worker.js'; import { trText, trHtml, onPageReady } from '../i18n/i18n.js'; @@ -190,7 +190,7 @@ async function detectBlankPages() { showLoader('Detecting blank pages...'); try { const pdfData = await pageState.file.arrayBuffer(); - const pdfDoc = await pdfjsLib.getDocument({ data: pdfData }).promise; + const pdfDoc = await getPDFDocument({ data: pdfData }).promise; const totalPages = pdfDoc.numPages; pageState.detectedBlankPages = []; diff --git a/src/js/workflow/nodes/adjust-colors-node.ts b/src/js/workflow/nodes/adjust-colors-node.ts index a84c52f4..6e8a7be4 100644 --- a/src/js/workflow/nodes/adjust-colors-node.ts +++ b/src/js/workflow/nodes/adjust-colors-node.ts @@ -5,7 +5,7 @@ import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { applyColorAdjustments } from '../../utils/image-effects'; import { PDFDocument } from 'pdf-lib'; -import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument } from '../../utils/helpers.js'; import type { AdjustColorsSettings } from '../../types/adjust-colors-type'; import { wfError } from '../errors'; @@ -78,8 +78,7 @@ export class AdjustColorsNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { const newPdfDoc = await PDFDocument.create(); - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) - .promise; + const pdfjsDoc = await getPDFDocument({ data: input.bytes }).promise; for (let i = 1; i <= pdfjsDoc.numPages; i++) { const page = await pdfjsDoc.getPage(i); diff --git a/src/js/workflow/nodes/combine-single-page-node.ts b/src/js/workflow/nodes/combine-single-page-node.ts index 6931e50f..8b832403 100644 --- a/src/js/workflow/nodes/combine-single-page-node.ts +++ b/src/js/workflow/nodes/combine-single-page-node.ts @@ -4,8 +4,7 @@ import { pdfSocket } from '../sockets'; import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { PDFDocument, rgb } from 'pdf-lib'; -import * as pdfjsLib from 'pdfjs-dist'; -import { hexToRgb } from '../../utils/helpers.js'; +import { getPDFDocument, hexToRgb } from '../../utils/helpers.js'; import { wfError } from '../errors'; export class CombineSinglePageNode extends BaseWorkflowNode { @@ -72,8 +71,7 @@ export class CombineSinglePageNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) - .promise; + const pdfjsDoc = await getPDFDocument({ data: input.bytes }).promise; const newDoc = await PDFDocument.create(); const pageDims: { width: number; height: number }[] = []; diff --git a/src/js/workflow/nodes/greyscale-node.ts b/src/js/workflow/nodes/greyscale-node.ts index 71e393c0..f11d0759 100644 --- a/src/js/workflow/nodes/greyscale-node.ts +++ b/src/js/workflow/nodes/greyscale-node.ts @@ -5,7 +5,7 @@ import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { applyGreyscale } from '../../utils/image-effects'; import { PDFDocument } from 'pdf-lib'; -import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument } from '../../utils/helpers.js'; import { wfError } from '../errors'; export class GreyscaleNode extends BaseWorkflowNode { @@ -27,8 +27,7 @@ export class GreyscaleNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { const newPdfDoc = await PDFDocument.create(); - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) - .promise; + const pdfjsDoc = await getPDFDocument({ data: input.bytes }).promise; for (let i = 1; i <= pdfjsDoc.numPages; i++) { const page = await pdfjsDoc.getPage(i); diff --git a/src/js/workflow/nodes/invert-colors-node.ts b/src/js/workflow/nodes/invert-colors-node.ts index a3ca580e..bf0e7642 100644 --- a/src/js/workflow/nodes/invert-colors-node.ts +++ b/src/js/workflow/nodes/invert-colors-node.ts @@ -5,7 +5,7 @@ import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { applyInvertColors } from '../../utils/image-effects'; import { PDFDocument } from 'pdf-lib'; -import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument } from '../../utils/helpers.js'; import { wfError } from '../errors'; export class InvertColorsNode extends BaseWorkflowNode { @@ -27,8 +27,7 @@ export class InvertColorsNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { const newPdfDoc = await PDFDocument.create(); - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) - .promise; + const pdfjsDoc = await getPDFDocument({ data: input.bytes }).promise; for (let i = 1; i <= pdfjsDoc.numPages; i++) { const page = await pdfjsDoc.getPage(i); diff --git a/src/js/workflow/nodes/pdf-to-images-node.ts b/src/js/workflow/nodes/pdf-to-images-node.ts index f531aa8b..51712a6d 100644 --- a/src/js/workflow/nodes/pdf-to-images-node.ts +++ b/src/js/workflow/nodes/pdf-to-images-node.ts @@ -3,8 +3,7 @@ import { BaseWorkflowNode } from './base-node'; import { pdfSocket } from '../sockets'; import type { SocketData, PDFData } from '../types'; import { requirePdfInput, extractAllPdfs } from '../types'; -import { downloadFile } from '../../utils/helpers.js'; -import * as pdfjsLib from 'pdfjs-dist'; +import { downloadFile, getPDFDocument } from '../../utils/helpers.js'; import type JSZip from 'jszip'; import { loadPyMuPDF } from '../../utils/pymupdf-loader.js'; @@ -39,7 +38,7 @@ export class PdfToImagesNode extends BaseWorkflowNode { scale: number, prefix: string ): Promise { - const pdfjsDoc = await pdfjsLib.getDocument({ data: pdf.bytes }).promise; + const pdfjsDoc = await getPDFDocument({ data: pdf.bytes }).promise; for (let i = 1; i <= pdfjsDoc.numPages; i++) { const page = await pdfjsDoc.getPage(i); const viewport = page.getViewport({ scale }); diff --git a/src/js/workflow/nodes/posterize-node.ts b/src/js/workflow/nodes/posterize-node.ts index 4b905dff..18514fa6 100644 --- a/src/js/workflow/nodes/posterize-node.ts +++ b/src/js/workflow/nodes/posterize-node.ts @@ -4,7 +4,7 @@ import { pdfSocket } from '../sockets'; import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { PDFDocument } from 'pdf-lib'; -import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument } from '../../utils/helpers.js'; import { wfError } from '../errors'; export class PosterizeNode extends BaseWorkflowNode { @@ -45,8 +45,7 @@ export class PosterizeNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) - .promise; + const pdfjsDoc = await getPDFDocument({ data: input.bytes }).promise; const newDoc = await PDFDocument.create(); for (let i = 1; i <= pdfjsDoc.numPages; i++) { diff --git a/src/js/workflow/nodes/remove-blank-pages-node.ts b/src/js/workflow/nodes/remove-blank-pages-node.ts index c7fd74cc..bd05f8b5 100644 --- a/src/js/workflow/nodes/remove-blank-pages-node.ts +++ b/src/js/workflow/nodes/remove-blank-pages-node.ts @@ -5,6 +5,7 @@ import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { PDFDocument } from 'pdf-lib'; import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument } from '../../utils/helpers.js'; import { loadPdfDocument } from '../../utils/load-pdf-document.js'; import { wfError } from '../errors'; @@ -61,7 +62,7 @@ export class RemoveBlankPagesNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) + const pdfjsDoc = await getPDFDocument({ data: input.bytes.slice() }) .promise; const srcDoc = await loadPdfDocument(input.bytes); const nonBlankIndices: number[] = []; diff --git a/src/js/workflow/nodes/scanner-effect-node.ts b/src/js/workflow/nodes/scanner-effect-node.ts index 28db5f10..ded94a5a 100644 --- a/src/js/workflow/nodes/scanner-effect-node.ts +++ b/src/js/workflow/nodes/scanner-effect-node.ts @@ -5,7 +5,7 @@ import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { applyScannerEffect } from '../../utils/image-effects'; import { PDFDocument } from 'pdf-lib'; -import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument } from '../../utils/helpers.js'; import type { ScanSettings } from '../../types/scanner-effect-type'; import { wfError } from '../errors'; @@ -95,8 +95,7 @@ export class ScannerEffectNode extends BaseWorkflowNode { return { pdf: await processBatch(pdfInputs, async (input) => { const newPdfDoc = await PDFDocument.create(); - const pdfjsDoc = await pdfjsLib.getDocument({ data: input.bytes }) - .promise; + const pdfjsDoc = await getPDFDocument({ data: input.bytes }).promise; const dpiScale = settings.resolution / 72; for (let i = 1; i <= pdfjsDoc.numPages; i++) { diff --git a/src/js/workflow/nodes/watermark-node.ts b/src/js/workflow/nodes/watermark-node.ts index d470f8d8..f820e23a 100644 --- a/src/js/workflow/nodes/watermark-node.ts +++ b/src/js/workflow/nodes/watermark-node.ts @@ -5,8 +5,7 @@ import type { SocketData } from '../types'; import { requirePdfInput, processBatch } from '../types'; import { addTextWatermark, parsePageRange } from '../../utils/pdf-operations'; import { PDFDocument } from 'pdf-lib'; -import { hexToRgb } from '../../utils/helpers.js'; -import * as pdfjsLib from 'pdfjs-dist'; +import { getPDFDocument, hexToRgb } from '../../utils/helpers.js'; import { loadPdfDocument } from '../../utils/load-pdf-document.js'; import { wfError } from '../errors'; @@ -139,7 +138,7 @@ export class WatermarkNode extends BaseWorkflowNode { }); if (shouldFlatten) { - const watermarkedPdf = await pdfjsLib.getDocument({ + const watermarkedPdf = await getPDFDocument({ data: resultBytes.slice(), }).promise; const flattenedDoc = await PDFDocument.create();