diff --git a/src/core/catalog.js b/src/core/catalog.js index 229d3c0d0..8c07a2f3f 100644 --- a/src/core/catalog.js +++ b/src/core/catalog.js @@ -262,7 +262,7 @@ class Catalog { get structTreeRoot() { let structTree = null; try { - structTree = this._readStructTreeRoot(); + structTree = this.#readStructTreeRoot(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -272,17 +272,14 @@ class Catalog { return shadow(this, "structTreeRoot", structTree); } - /** - * @private - */ - _readStructTreeRoot() { + #readStructTreeRoot() { const rawObj = this._catDict.getRaw("StructTreeRoot"); const obj = this.xref.fetchIfRef(rawObj); if (!(obj instanceof Dict)) { return null; } - const root = new StructTreeRoot(obj, rawObj); + const root = new StructTreeRoot(this.xref, obj, rawObj); root.init(); return root; } diff --git a/src/core/struct_tree.js b/src/core/struct_tree.js index 2b8bcc181..a8766e92e 100644 --- a/src/core/struct_tree.js +++ b/src/core/struct_tree.js @@ -29,7 +29,8 @@ const StructElementType = { }; class StructTreeRoot { - constructor(rootDict, rootRef) { + constructor(xref, rootDict, rootRef) { + this.xref = xref; this.dict = rootDict; this.ref = rootRef instanceof Ref ? rootRef : null; this.roleMap = new Map(); @@ -158,7 +159,7 @@ class StructTreeRoot { } } - async canUpdateStructTree({ pdfManager, xref, newAnnotationsByPage }) { + async canUpdateStructTree({ pdfManager, newAnnotationsByPage }) { if (!this.ref) { warn("Cannot update the struct tree: no root reference."); return false; @@ -180,7 +181,7 @@ class StructTreeRoot { warn("Cannot update the struct tree: nums isn't an array."); return false; } - const numberTree = new NumberTree(parentTree, xref); + const numberTree = new NumberTree(parentTree, this.xref); for (const pageIndex of newAnnotationsByPage.keys()) { const { pageDict } = await pdfManager.getPage(pageIndex); @@ -201,7 +202,7 @@ class StructTreeRoot { const { pageDict } = await pdfManager.getPage(pageIndex); StructTreeRoot.#collectParents({ elements, - xref: this.dict.xref, + xref: this.xref, pageDict, numberTree, }); @@ -233,9 +234,8 @@ class StructTreeRoot { } async updateStructureTree({ newAnnotationsByPage, pdfManager, changes }) { - const xref = this.dict.xref; + const { ref: structTreeRootRef, xref } = this; const structTreeRoot = this.dict.clone(); - const structTreeRootRef = this.ref; const cache = new RefSetCache(); cache.put(structTreeRootRef, structTreeRoot); @@ -541,6 +541,7 @@ class StructTreeRoot { class StructElementNode { constructor(tree, dict) { this.tree = tree; + this.xref = tree.xref; this.dict = dict; this.kids = []; this.parseKids(); @@ -550,10 +551,7 @@ class StructElementNode { const nameObj = this.dict.get("S"); const name = nameObj instanceof Name ? nameObj.name : ""; const { root } = this.tree; - if (root.roleMap.has(name)) { - return root.roleMap.get(name); - } - return name; + return root.roleMap.get(name) ?? name; } parseKids() { @@ -565,10 +563,7 @@ class StructElementNode { const kids = this.dict.get("K"); if (Array.isArray(kids)) { for (const kid of kids) { - const element = this.parseKid( - pageObjId, - this.dict.xref.fetchIfRef(kid) - ); + const element = this.parseKid(pageObjId, this.xref.fetchIfRef(kid)); if (element) { this.kids.push(element); } @@ -657,7 +652,8 @@ class StructElement { class StructTreePage { constructor(structTreeRoot, pageDict) { this.root = structTreeRoot; - this.rootDict = structTreeRoot ? structTreeRoot.dict : null; + this.xref = structTreeRoot?.xref ?? null; + this.rootDict = structTreeRoot?.dict ?? null; this.pageDict = pageDict; this.nodes = []; } @@ -683,7 +679,7 @@ class StructTreePage { } const map = new Map(); - const numberTree = new NumberTree(parentTree, this.rootDict.xref); + const numberTree = new NumberTree(parentTree, this.xref); for (const [elemId] of ids) { const obj = numberTree.getRaw(elemId); @@ -710,14 +706,14 @@ class StructTreePage { } const map = new Map(); - const numberTree = new NumberTree(parentTree, this.rootDict.xref); + const numberTree = new NumberTree(parentTree, this.xref); if (Number.isInteger(id)) { const parentArray = numberTree.get(id); if (Array.isArray(parentArray)) { for (const ref of parentArray) { if (ref instanceof Ref) { - this.addNode(this.rootDict.xref.fetch(ref), map); + this.addNode(this.xref.fetch(ref), map); } } } @@ -729,7 +725,7 @@ class StructTreePage { for (const [elemId, type] of ids) { const obj = numberTree.get(elemId); if (obj) { - const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map); + const elem = this.addNode(this.xref.fetchIfRef(obj), map); if ( elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT diff --git a/src/core/worker.js b/src/core/worker.js index 3015e4d4d..63261bb00 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -558,7 +558,6 @@ class WorkerMessageHandler { } else if ( await _structTreeRoot.canUpdateStructTree({ pdfManager, - xref, newAnnotationsByPage, }) ) {