diff --git a/src/core/struct_tree.js b/src/core/struct_tree.js index 41587d45c..a07d99b96 100644 --- a/src/core/struct_tree.js +++ b/src/core/struct_tree.js @@ -328,6 +328,10 @@ class StructTreePage { } nodeToSerializable(child, root); } + + if (root.children.length === 0) { + return null; + } return root; } } diff --git a/src/display/api.js b/src/display/api.js index 9b5f70536..b05fd4641 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1522,7 +1522,8 @@ class PDFPageProxy { /** * @returns {Promise} A promise that is resolved with a - * {@link StructTreeNode} object that represents the page's structure tree. + * {@link StructTreeNode} object that represents the page's structure tree, + * or `null` when no structure tree is present for the current page. */ getStructTree() { return (this._structTreePromise ||= this._transport.getStructTree( diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index cc0548335..af9a494bf 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -1702,6 +1702,69 @@ describe("api", function () { .catch(done.fail); }); + it("gets empty structure tree", async function () { + const tree = await page.getStructTree(); + + expect(tree).toEqual(null); + }); + it("gets simple structure tree", async function () { + const loadingTask = getDocument( + buildGetDocumentParams("structure_simple.pdf") + ); + const pdfDoc = await loadingTask.promise; + const pdfPage = await pdfDoc.getPage(1); + const tree = await pdfPage.getStructTree(); + + expect(tree).toEqual({ + role: "Root", + children: [ + { + role: "Document", + children: [ + { + role: "H1", + children: [ + { + role: "NonStruct", + children: [{ type: "content", id: "page2R_mcid0" }], + }, + ], + }, + { + role: "P", + children: [ + { + role: "NonStruct", + children: [{ type: "content", id: "page2R_mcid1" }], + }, + ], + }, + { + role: "H2", + children: [ + { + role: "NonStruct", + children: [{ type: "content", id: "page2R_mcid2" }], + }, + ], + }, + { + role: "P", + children: [ + { + role: "NonStruct", + children: [{ type: "content", id: "page2R_mcid3" }], + }, + ], + }, + ], + }, + ], + }); + + await loadingTask.destroy(); + }); + it("gets operator list", function (done) { const promise = page.getOperatorList(); promise diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index f83b0568d..8d6771129 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -619,6 +619,9 @@ class PDFPageView { this.eventBus._off("textlayerrendered", this._onTextLayerRendered); this._onTextLayerRendered = null; this.pdfPage.getStructTree().then(tree => { + if (!tree) { + return; + } const treeDom = this.structTreeLayer.render(tree); treeDom.classList.add("structTree"); this.canvas.appendChild(treeDom);