DocumentStructure Object

Summary

Manages the structure of the document.

Syntax
TypeScript
JavaScript
function lt.Document.DocumentStructure 
class lt.Document.DocumentStructure() 
Remarks

DocumentStructure manages the structure of the document. This includes the bookmarks that represents the table of content. It can be accessed through the Structure property of LEADDocument.

Not all document types contain support for document structure. For these types of documents (such as TIFF files or Text documents), the value of IsStructureSupported of Document will be false and the Structure is null and should not be used. The rest of the discussion of this section is related to when IsStructureSupported is true.

When the structure is supported (for example, in PDF documents), the value of IsStructureSupported is true and Structure is a valid object that can be used.

Loading the document structure can take some time. Therefore, it is not read automatically when a new LEADDocument is created from a disk or URL document. This is done so that the document is loaded as quickly as possible and to not make the user wait in case the bookmarks or table of contents is not needed in your application.

To parse the document for bookmarks and table of contents, use the Parse method while the value of ParseBookmarks is true (the default value). Usually you can call this method once after the LEADDocument is loaded. The IsParsed property can be used to check if the structure has been parsed.

If Parse is not called, or the value of ParseBookmarks is false, then Bookmarks is an empty list.

When Parse is called and ParseBookmarks is true (the default value), the Bookmarks list will be updated with all the bookmarks and table of contents items found in the original document. You can then read and modify these bookmarks if needed. If the value of ParseBookmarks is set to false, then Parse will not try to parse the bookmarks in the document.

Parse will also parse the document for any links found in the pages if the value of ParsePageLinks is true (the default value). These links can be obtained through the DocumentPage.GetLinks method. If the value of ParsePageLinks is set to false, then Parse will not try to parse the links found in the pages.

Setting ParseBookmarks or ParsePageLinks to false can help increase the speed of the Parse method if the user is not interested in one or the other.

Example

This example shows how to parse the structure (bookmarks) of a PDF document.

Start with the example in LEADDocument and replace the example function call to the function below.

Structure.ts
DocumentHelper.ts
Structure.js
DocumentHelper.js
Structure.html
import { DocumentHelper } from "../../utilities/DocumentHelper"; 
 
export class LEADDocument_StructureExample { 
   private el: HTMLElement; 
 
   public constructor() { 
      lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/js/LEADTOOLSEVAL.txt", "EVAL", null); 
      DocumentHelper.initFactory(); 
   } 
 
   public run(buttonID: string) { 
      this.el = document.getElementById(buttonID); 
      this.el.onclick = this.loadDocument; 
   } 
 
   loadDocument = () => { 
      const url = "https://demo.leadtools.com/images/pdf/leadtools.pdf"; 
      DocumentHelper.log("Loading document..."); 
 
      lt.Document.DocumentFactory.loadFromUri(url, null) 
         .done((doc: lt.Document.LEADDocument) => { 
            DocumentHelper.log("Done. Showing the structure..."); 
 
            if (!doc.isStructureSupported) { 
               // This document does not support table of content or links 
               DocumentHelper.log("Structure not supported"); 
               return; 
            } 
 
            if (doc.structure.isParsed) { 
               // Show them 
               this.showBookmarks(doc.structure.bookmarks); 
            } 
            else { 
               // We support it, but we don't have it parsed yet 
               doc.structure.parse() 
                  .done((doc) => { 
                     DocumentHelper.log("Document structure was parsed successfully"); 
                     this.showBookmarks(doc.structure.bookmarks); 
                  }) 
                  .fail(DocumentHelper.showServiceError); 
            } 
 
         }) 
         .fail(DocumentHelper.showServiceError); 
   } 
 
   showBookmarks = (bookmarks: lt.Document.DocumentBookmark[]) => { 
      const ul = this.makeBookmarkList(bookmarks); 
      this.el.parentNode.appendChild(ul); 
   } 
 
   makeBookmarkList = (bookmarks: lt.Document.DocumentBookmark[]) => { 
      if (bookmarks && bookmarks.length) { 
         const ul = document.createElement("ul"); 
         for (let i = 0; i < bookmarks.length; i++) { 
            const bookmark = bookmarks[i]; 
            const li = document.createElement("li"); 
            const span = document.createElement("span"); 
            span.innerHTML = bookmark.title + " (Page " + bookmark.target.pageNumber + ")"; 
            li.appendChild(span); 
            if (bookmark.children.length) 
               li.appendChild(this.makeBookmarkList(bookmark.children)); 
            ul.appendChild(li); 
         } 
         return ul; 
      } 
      return null; 
   } 
} 
export class DocumentHelper { 
   static showServiceError = (jqXHR, statusText, errorThrown) => { 
      alert("Error returned from service. See the console for details."); 
      const serviceError = lt.Document.ServiceError.parseError(jqXHR, statusText, errorThrown); 
      console.error(serviceError); 
   } 
 
   static log = (message: string, data?: any) => { 
      const outputElement = document.getElementById("output"); 
      if (outputElement) { 
         const time = (new Date()).toLocaleTimeString(); 
         const textElement = document.createElement("p"); 
         textElement.innerHTML = (outputElement.childElementCount + 1) + " [" + time + "]: " + message; 
         outputElement.insertBefore(textElement, outputElement.firstChild); 
      } 
 
      if (!data) 
         console.log(message); 
      else 
         console.log(message, data); 
   } 
 
   static initFactory = () => { 
      // To communicate with the DocumentsService, it must be running! 
      // Change these parameters to match the path to the service. 
      lt.Document.DocumentFactory.serviceHost = "http://localhost:40000"; 
      lt.Document.DocumentFactory.servicePath = ""; 
      lt.Document.DocumentFactory.serviceApiPath = "api"; 
   } 
} 
import { DocumentHelper } from "../../utilities/DocumentHelper"; 
 
export class LEADDocument_StructureExample { 
   el; 
 
   constructor() { 
      lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/js/LEADTOOLSEVAL.txt", "EVAL", null); 
      DocumentHelper.initFactory(); 
   } 
 
   run(buttonID) { 
      this.el = document.getElementById(buttonID); 
      this.el.onclick = this.loadDocument; 
   } 
 
   loadDocument = () => { 
      const url = "https://demo.leadtools.com/images/pdf/leadtools.pdf"; 
      DocumentHelper.log("Loading document..."); 
 
      lt.Document.DocumentFactory.loadFromUri(url, null) 
         .done((doc) => { 
            DocumentHelper.log("Done. Showing the structure..."); 
 
            if (!doc.isStructureSupported) { 
               // This document does not support table of content or links 
               DocumentHelper.log("Structure not supported"); 
               return; 
            } 
 
            if (doc.structure.isParsed) { 
               // Show them 
               this.showBookmarks(doc.structure.bookmarks); 
            } 
            else { 
               // We support it, but we don't have it parsed yet 
               doc.structure.parse() 
                  .done((doc) => { 
                     DocumentHelper.log("Document structure was parsed successfully"); 
                     this.showBookmarks(doc.structure.bookmarks); 
                  }) 
                  .fail(DocumentHelper.showServiceError); 
            } 
 
         }) 
         .fail(DocumentHelper.showServiceError); 
   } 
 
   showBookmarks = (bookmarks) => { 
      const ul = this.makeBookmarkList(bookmarks); 
      this.el.parentNode.appendChild(ul); 
   } 
 
   makeBookmarkList = (bookmarks) => { 
      if (bookmarks && bookmarks.length) { 
         const ul = document.createElement("ul"); 
         for (let i = 0; i < bookmarks.length; i++) { 
            const bookmark = bookmarks[i]; 
            const li = document.createElement("li"); 
            const span = document.createElement("span"); 
            span.innerHTML = bookmark.title + " (Page " + bookmark.target.pageNumber + ")"; 
            li.appendChild(span); 
            if (bookmark.children.length) 
               li.appendChild(this.makeBookmarkList(bookmark.children)); 
            ul.appendChild(li); 
         } 
         return ul; 
      } 
      return null; 
   } 
} 
export class DocumentHelper { 
   static showServiceError = (jqXHR, statusText, errorThrown) => { 
      alert("Error returned from service. See the console for details."); 
      const serviceError = lt.Document.ServiceError.parseError(jqXHR, statusText, errorThrown); 
      console.error(serviceError); 
   } 
 
   static log = (message, data) => { 
      const outputElement = document.getElementById("output"); 
      if (outputElement) { 
         const time = (new Date()).toLocaleTimeString(); 
         const textElement = document.createElement("p"); 
         textElement.innerHTML = (outputElement.childElementCount + 1) + " [" + time + "]: " + message; 
         outputElement.insertBefore(textElement, outputElement.firstChild); 
      } 
 
      if (!data) 
         console.log(message); 
      else 
         console.log(message, data); 
   } 
 
   static initFactory = () => { 
      // To communicate with the DocumentsService, it must be running! 
      // Change these parameters to match the path to the service. 
      lt.Document.DocumentFactory.serviceHost = "http://localhost:40000"; 
      lt.Document.DocumentFactory.servicePath = ""; 
      lt.Document.DocumentFactory.serviceApiPath = "api"; 
   } 
} 
<!doctype html> 
<html lang="en"> 
<title>Document Example | Structure</title> 
 
<head> 
   <script src="https://code.jquery.com/jquery-2.2.4.min.js" 
      integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script> 
 
   <script src="../../LT/Leadtools.js"></script> 
   <script src="../../LT/Leadtools.Controls.js"></script> 
   <script src="../../LT/Leadtools.Annotations.Engine.js"></script> 
   <script src="../../LT/Leadtools.Annotations.Designers.js"></script> 
   <script src="../../LT/Leadtools.Annotations.Rendering.Javascript.js"></script> 
   <script src="../../LT/Leadtools.Annotations.Automation.js"></script> 
   <script src="../../LT/Leadtools.ImageProcessing.Main.js"></script> 
   <script src="../../LT/Leadtools.ImageProcessing.Color.js"></script> 
   <script src="../../LT/Leadtools.ImageProcessing.Core.js"></script> 
   <script src="../../LT/Leadtools.ImageProcessing.Effects.js"></script> 
   <script src="../../LT/Leadtools.Document.js"></script> 
   <script src="../../LT/Leadtools.Document.Viewer.js"></script> 
   <link rel="stylesheet" type="text/css" href="../../css/examples.css"> 
 
   <!-- All demo files are bundled and appended to the window --> 
   <script src="../../bundle.js" type="text/javascript"></script> 
</head> 
 
<body> 
   <div> 
      <button type="button" id="exampleButton">Run Example</button> 
   </div> 
   <div id="output"></div> 
   <div> 
      <img id="img" /> 
   </div> 
</body> 
 
<script> 
   window.onload = () => { 
      const example = new window.examples.LEADDocument.Structure(); 
      example.run("exampleButton"); 
   }; 
</script> 
</html> 
Requirements

Target Platforms

Help Version 22.0.2023.2.1
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Document Assembly
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.