@@ -1788,95 +1788,109 @@ class ExtendedCatalog extends Catalog {
17881788 }
17891789
17901790 getTreeElement ( el , page , ref ) {
1791- // update page for current element
1792- if ( el instanceof Dict && el . has ( "Pg" ) ) {
1793- const pageRef = el . getRaw ( "Pg" ) ;
1794- let newPage = this . pages . findIndex (
1795- pageEl => pageEl . num === pageRef . num && pageEl . gen === pageRef . gen
1796- ) ;
1797- newPage = newPage !== - 1 ? newPage : null ;
1798- if ( newPage !== page ) {
1799- page = newPage ;
1791+ try {
1792+ // update page for current element
1793+ if ( el instanceof Dict && el . has ( "Pg" ) ) {
1794+ const pageRef = el . getRaw ( "Pg" ) ;
1795+ let newPage = this . pages . findIndex (
1796+ pageEl => pageEl . num === pageRef . num && pageEl . gen === pageRef . gen
1797+ ) ;
1798+ newPage = newPage !== - 1 ? newPage : null ;
1799+ if ( newPage !== page ) {
1800+ page = newPage ;
1801+ }
18001802 }
1801- }
18021803
1803- if ( el instanceof Dict && el . has ( "K" ) ) {
1804- const name = el . has ( "S" ) ? el . get ( "S" ) . name : null ;
1805- const roleName = this . getRoleName ( el , name ) ;
1804+ if ( el instanceof Dict && el . has ( "K" ) ) {
1805+ const name = el . has ( "S" ) ? el . get ( "S" ) . name : null ;
1806+ const roleName = this . getRoleName ( el , name ) ;
18061807
1807- return {
1808- name : name ? stringToUTF8String ( name ) : null ,
1809- roleName : roleName ? stringToUTF8String ( roleName ) : null ,
1810- children : this . getTreeElement ( el . get ( "K" ) , page , el . getRaw ( "K" ) ) ,
1811- pageIndex : page ,
1812- ref : ref instanceof Ref ? ref : null ,
1813- } ;
1814- }
1815-
1816- if ( el instanceof Dict && el . has ( "Obj" ) ) {
1817- const obj = el . get ( "Obj" ) ;
1818- let type = null ;
1819- if ( obj . has ( "Type" ) ) {
1820- type = obj . get ( "Type" ) . name ;
1821- }
1822- if ( obj . has ( "Subtype" ) ) {
1823- type = obj . get ( "Subtype" ) . name ;
1824- }
1825- switch ( type ) {
1826- case "Link" :
1827- case "Annot" :
1828- const rect = obj . get ( "Rect" ) ;
1829- const pageRef =
1830- Array . isArray ( this . pages ) && Number . isInteger ( page ) && page >= 0
1831- ? this . pages [ page ]
1832- : null ;
1833- const pageObj = pageRef ? this . xref . fetch ( pageRef ) : null ;
1834-
1835- return {
1836- annotIndex : this . getAnnotIndex ( el , pageObj ) ,
1837- pageIndex : page ,
1838- rect : [ rect [ 0 ] , rect [ 1 ] , rect [ 2 ] , rect [ 3 ] ] ,
1839- } ;
1840- default :
1841- break ;
1808+ return {
1809+ name : name ? stringToUTF8String ( name ) : null ,
1810+ roleName : roleName ? stringToUTF8String ( roleName ) : null ,
1811+ children : this . getTreeElement ( el . get ( "K" ) , page , el . getRaw ( "K" ) ) ,
1812+ pageIndex : page ,
1813+ ref : ref instanceof Ref ? ref : null ,
1814+ } ;
18421815 }
1843- }
18441816
1845- if ( Array . isArray ( el ) ) {
1846- return el . map ( subel => {
1847- if ( Number . isInteger ( subel ) ) {
1848- return { mcid : subel , pageIndex : page } ;
1849- } else if (
1850- ! ( subel . hasOwnProperty ( "num" ) && subel . hasOwnProperty ( "gen" ) ) &&
1851- subel . get ( "Type" ) !== "OBJR"
1852- ) {
1853- return this . getTreeElement ( subel , page ) ;
1854- } else if ( subel . hasOwnProperty ( "num" ) && subel . hasOwnProperty ( "gen" ) ) {
1855- return this . getTreeElement ( this . xref . fetch ( subel ) , page , subel ) ;
1817+ if ( el instanceof Dict && el . has ( "Obj" ) ) {
1818+ const obj = el . get ( "Obj" ) ;
1819+ if ( ! ( obj instanceof Dict ) ) {
1820+ return null ;
18561821 }
1857- return null ;
1858- } ) ;
1859- }
1822+ let type = null ;
1823+ if ( obj . has ( "Type" ) ) {
1824+ type = obj . get ( "Type" ) . name ;
1825+ }
1826+ if ( obj . has ( "Subtype" ) ) {
1827+ type = obj . get ( "Subtype" ) . name ;
1828+ }
1829+ switch ( type ) {
1830+ case "Link" :
1831+ case "Annot" :
1832+ const rect = obj . get ( "Rect" ) ;
1833+ const pageRef =
1834+ Array . isArray ( this . pages ) && Number . isInteger ( page ) && page >= 0
1835+ ? this . pages [ page ]
1836+ : null ;
1837+ const pageObj = pageRef ? this . xref . fetch ( pageRef ) : null ;
1838+
1839+ return {
1840+ annotIndex : this . getAnnotIndex ( el , pageObj ) ,
1841+ pageIndex : page ,
1842+ rect : [ rect [ 0 ] , rect [ 1 ] , rect [ 2 ] , rect [ 3 ] ] ,
1843+ } ;
1844+ default :
1845+ break ;
1846+ }
1847+ }
18601848
1861- if ( Number . isInteger ( el ) ) {
1862- return { mcid : el , pageIndex : page } ;
1863- }
1849+ if ( Array . isArray ( el ) ) {
1850+ return el . map ( subel => {
1851+ if ( Number . isInteger ( subel ) ) {
1852+ return { mcid : subel , pageIndex : page } ;
1853+ } else if (
1854+ ! ( subel . hasOwnProperty ( "num" ) && subel . hasOwnProperty ( "gen" ) ) &&
1855+ subel . get ( "Type" ) !== "OBJR"
1856+ ) {
1857+ return this . getTreeElement ( subel , page ) ;
1858+ } else if (
1859+ subel . hasOwnProperty ( "num" ) &&
1860+ subel . hasOwnProperty ( "gen" )
1861+ ) {
1862+ return this . getTreeElement ( this . xref . fetch ( subel ) , page , subel ) ;
1863+ }
1864+ return null ;
1865+ } ) ;
1866+ }
18641867
1865- if ( el instanceof Dict && el . has ( "Type" ) && el . get ( "Type" ) . name === "MCR" ) {
1866- return { mcid : el . get ( "MCID" ) , pageIndex : page , stm : el . getRaw ( "Stm" ) } ;
1867- }
1868+ if ( Number . isInteger ( el ) ) {
1869+ return { mcid : el , pageIndex : page } ;
1870+ }
18681871
1869- if ( el instanceof Dict && el . has ( "S" ) ) {
1870- const name = el . get ( "S" ) . name ;
1871- const roleName = this . getRoleName ( el , name ) ;
1872+ if (
1873+ el instanceof Dict &&
1874+ el . has ( "Type" ) &&
1875+ el . get ( "Type" ) . name === "MCR"
1876+ ) {
1877+ return { mcid : el . get ( "MCID" ) , pageIndex : page , stm : el . getRaw ( "Stm" ) } ;
1878+ }
18721879
1873- return {
1874- name : name ? stringToUTF8String ( name ) : null ,
1875- roleName : roleName ? stringToUTF8String ( roleName ) : null ,
1876- children : [ ] ,
1877- pageIndex : page ,
1878- ref : ref instanceof Ref ? ref : null ,
1879- } ;
1880+ if ( el instanceof Dict && el . has ( "S" ) ) {
1881+ const name = el . get ( "S" ) . name ;
1882+ const roleName = this . getRoleName ( el , name ) ;
1883+
1884+ return {
1885+ name : name ? stringToUTF8String ( name ) : null ,
1886+ roleName : roleName ? stringToUTF8String ( roleName ) : null ,
1887+ children : [ ] ,
1888+ pageIndex : page ,
1889+ ref : ref instanceof Ref ? ref : null ,
1890+ } ;
1891+ }
1892+ } catch ( e ) {
1893+ console . error ( `Failed to parse structure tree element: ${ e . message } ` ) ;
18801894 }
18811895
18821896 return null ;
0 commit comments