diff --git a/src/core/document.js b/src/core/document.js index 55df5bf66..b51ddad40 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -1237,7 +1237,7 @@ class PDFDocument { return this.xfaFactory ? this.xfaFactory.getPages() : null; } - async loadXfaImages() { + async #loadXfaImages() { const xfaImages = await this.pdfManager.ensureCatalog("xfaImages"); if (!xfaImages) { return; @@ -1245,7 +1245,7 @@ class PDFDocument { this.xfaFactory.setImages(xfaImages); } - async loadXfaFonts(handler, task) { + async #loadXfaFonts(handler, task) { const acroForm = await this.pdfManager.ensureCatalog("acroForm"); if (!acroForm) { return; @@ -1264,18 +1264,19 @@ class PDFDocument { const options = Object.assign( Object.create(null), - this.pdfManager.evaluatorOptions + this.pdfManager.evaluatorOptions, + { useSystemFonts: false } ); - options.useSystemFonts = false; + const { builtInCMapCache, fontCache, standardFontDataCache } = this.catalog; const partialEvaluator = new PartialEvaluator({ xref: this.xref, handler, pageIndex: -1, idFactory: this._globalIdFactory, - fontCache: this.catalog.fontCache, - builtInCMapCache: this.catalog.builtInCMapCache, - standardFontDataCache: this.catalog.standardFontDataCache, + fontCache, + builtInCMapCache, + standardFontDataCache, options, }); const operatorList = new OperatorList(); @@ -1292,6 +1293,23 @@ class PDFDocument { }, }; + const parseFont = (fontName, fallbackFontDict, cssFontInfo) => + partialEvaluator + .handleSetFont( + resources, + [Name.get(fontName), 1], + /* fontRef = */ null, + operatorList, + task, + initialState, + fallbackFontDict, + cssFontInfo + ) + .catch(reason => { + warn(`loadXfaFonts: "${reason}".`); + return null; + }); + const promises = []; for (const [fontName, font] of fontRes) { const descriptor = font.get("FontDescriptor"); @@ -1313,21 +1331,7 @@ class PDFDocument { continue; } promises.push( - partialEvaluator - .handleSetFont( - resources, - [Name.get(fontName), 1], - /* fontRef = */ null, - operatorList, - task, - initialState, - /* fallbackFontDict = */ null, - /* cssFontInfo = */ cssFontInfo - ) - .catch(function (reason) { - warn(`loadXfaFonts: "${reason}".`); - return null; - }) + parseFont(fontName, /* fallbackFontDict = */ null, cssFontInfo) ); } @@ -1365,28 +1369,13 @@ class PDFDocument { { name: "BoldItalic", fontWeight: 700, italicAngle: 12 }, ]) { const name = `${missing}-${fontInfo.name}`; - const dict = getXfaFontDict(name); promises.push( - partialEvaluator - .handleSetFont( - resources, - [Name.get(name), 1], - /* fontRef = */ null, - operatorList, - task, - initialState, - /* fallbackFontDict = */ dict, - /* cssFontInfo = */ { - fontFamily: missing, - fontWeight: fontInfo.fontWeight, - italicAngle: fontInfo.italicAngle, - } - ) - .catch(function (reason) { - warn(`loadXfaFonts: "${reason}".`); - return null; - }) + parseFont(name, getXfaFontDict(name), { + fontFamily: missing, + fontWeight: fontInfo.fontWeight, + italicAngle: fontInfo.italicAngle, + }) ); } } @@ -1395,6 +1384,15 @@ class PDFDocument { this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); } + loadXfaResources(handler, task) { + return Promise.all([ + this.#loadXfaFonts(handler, task).catch(() => { + // Ignore errors, to allow the document to load. + }), + this.#loadXfaImages(), + ]); + } + serializeXfaData(annotationStorage) { return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) diff --git a/src/core/pdf_manager.js b/src/core/pdf_manager.js index cac6c3c5e..9ee866cdb 100644 --- a/src/core/pdf_manager.js +++ b/src/core/pdf_manager.js @@ -115,14 +115,6 @@ class BasePdfManager { return this.pdfDocument.fontFallback(id, handler); } - loadXfaFonts(handler, task) { - return this.pdfDocument.loadXfaFonts(handler, task); - } - - loadXfaImages() { - return this.pdfDocument.loadXfaImages(); - } - cleanup(manuallyTriggered = false) { return this.pdfDocument.cleanup(manuallyTriggered); } diff --git a/src/core/worker.js b/src/core/worker.js index 66fa9ae15..3d1abbaf1 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -170,18 +170,11 @@ class WorkerMessageHandler { const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); if (isPureXfa) { - const task = new WorkerTask("loadXfaFonts"); + const task = new WorkerTask("loadXfaResources"); startWorkerTask(task); - await Promise.all([ - pdfManager - .loadXfaFonts(handler, task) - .catch(reason => { - // Ignore errors, to allow the document to load. - }) - .then(() => finishWorkerTask(task)), - pdfManager.loadXfaImages(), - ]); + await pdfManager.ensureDoc("loadXfaResources", [handler, task]); + finishWorkerTask(task); } const [numPages, fingerprints] = await Promise.all([ diff --git a/src/core/xfa/factory.js b/src/core/xfa/factory.js index 7f9f4f28d..5dacfbb10 100644 --- a/src/core/xfa/factory.js +++ b/src/core/xfa/factory.js @@ -43,7 +43,7 @@ class XFAFactory { } isValid() { - return this.root && this.form; + return !!(this.root && this.form); } /**