Skip to content

Commit 410225a

Browse files
Add error handling to structure tree parsing
1 parent fc6eb61 commit 410225a

File tree

1 file changed

+93
-79
lines changed

1 file changed

+93
-79
lines changed

src/core/catalog.js

Lines changed: 93 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)