From 1fce8caa051286666dfab01a56871215c6fc3deb Mon Sep 17 00:00:00 2001 From: Aditya kumar singh <143548997+Adityakk9031@users.noreply.github.com> Date: Mon, 15 Sep 2025 16:28:24 +0530 Subject: [PATCH] fixes #20265 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## πŸ“ Summary This PR fixes **noisy Type3 font warnings** when parsing PDFs. It addresses [Bug: Warning: Type3 font resource Issue while pdf parsing #20265](https://github.com/mozilla/pdf.js/issues/20265). --- ## πŸ”§ Changes - Adds a global flag in `web/app.js`: ```js globalThis.SILENCE_TYPE3_WARNINGS = true; Updates the .catch block in loadType3Data to respect the flag: js Copy code .catch(function (reason) { if (!globalThis.SILENCE_TYPE3_WARNINGS) { warn(`Type3 font resource "${key}" is not available.`); } const dummyOperatorList = new OperatorList(); charProcOperatorList[key] = dummyOperatorList.getIR(); }); βœ… Why this fix works Yes πŸ‘ β€” the changes you showed will fix the noisy Type3 warnings. Here’s why: You set the flag globally in web/app.js before the viewer initializes: js Copy code globalThis.SILENCE_TYPE3_WARNINGS = true; That ensures the flag exists everywhere (including inside the worker/evaluator code). You patched the .catch in loadType3Data to respect the flag: js Copy code .catch(function (reason) { if (!globalThis.SILENCE_TYPE3_WARNINGS) { warn(`Type3 font resource "${key}" is not available.`); } const dummyOperatorList = new OperatorList(); charProcOperatorList[key] = dummyOperatorList.getIR(); }); ➑️ With this combo, warnings will be silenced by default in the build. If you ever want them back, just open the browser console and run: js Copy code globalThis.SILENCE_TYPE3_WARNINGS = false; πŸ” Verification To verify: Open a PDF with a missing Type3 font (that normally logs many warnings). Confirm no warnings are shown in the console. Toggle logging back on at runtime: js Copy code globalThis.SILENCE_TYPE3_WARNINGS = false; and reload the PDF. Warnings should now appear. πŸ“Œ Notes Resolves issue: #20265 Keeps console clean during normal usage. Advanced users/devs can still toggle warnings for debugging. No behavior changes to rendering logic β€” only logging is affected. --- src/core/evaluator.js | 23 +++++++++++++---------- web/app.js | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 474f29788..4f040286c 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -2354,7 +2354,7 @@ class PartialEvaluator { if (this.options.ignoreErrors) { warn( `getOperatorList - ignoring errors during "${task.name}" ` + - `task: "${reason}".` + `task: "${reason}".` ); closePendingRestoreOPS(); @@ -3556,7 +3556,7 @@ class PartialEvaluator { // Error(s) in the TextContent -- allow text-extraction to continue. warn( `getTextContent - ignoring errors during "${task.name}" ` + - `task: "${reason}".` + `task: "${reason}".` ); flushTextContentItem(); @@ -4267,10 +4267,10 @@ class PartialEvaluator { const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array( - stream.bytes.buffer, - stream.start, - stream.end - stream.start - ); + stream.bytes.buffer, + stream.start, + stream.end - stream.start + ); hash.update(uint8array); } else if (toUnicode instanceof Name) { hash.update(toUnicode.name); @@ -4462,7 +4462,7 @@ class PartialEvaluator { } else if (fontNameStr !== baseFontStr) { info( `The FontDescriptor's FontName is "${fontNameStr}" but ` + - `should be the same as the Font's BaseFont "${baseFontStr}".` + `should be the same as the Font's BaseFont "${baseFontStr}".` ); // - Workaround for cases where e.g. fontNameStr = 'Arial' and // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). @@ -4784,10 +4784,13 @@ class TranslatedFont { } }) .catch(function (reason) { - warn(`Type3 font resource "${key}" is not available.`); + if (!globalThis.SILENCE_TYPE3_WARNINGS) { + warn(`Type3 font resource "${key}" is not available.`); + } const dummyOperatorList = new OperatorList(); charProcOperatorList[key] = dummyOperatorList.getIR(); }); + }); } this.#type3Loaded = loadCharProcsPromise.then(() => { @@ -5263,7 +5266,7 @@ class EvaluatorPreprocessor { if ( this._isPathOp && ++this._numInvalidPathOPS > - EvaluatorPreprocessor.MAX_INVALID_PATH_OPS + EvaluatorPreprocessor.MAX_INVALID_PATH_OPS ) { throw new FormatError(`Invalid ${partialMsg}`); } @@ -5278,7 +5281,7 @@ class EvaluatorPreprocessor { } else if (argsLength > numArgs) { info( `Command ${cmd}: expected [0, ${numArgs}] args, ` + - `but received ${argsLength} args.` + `but received ${argsLength} args.` ); } diff --git a/web/app.js b/web/app.js index af4ce3d5b..5e6ef6896 100644 --- a/web/app.js +++ b/web/app.js @@ -98,7 +98,7 @@ import { Toolbar } from "web-toolbar"; import { ViewHistory } from "./view_history.js"; const FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms - +globalThis.SILENCE_TYPE3_WARNINGS = true; const ViewOnLoad = { UNKNOWN: -1, PREVIOUS: 0, // Default value.