Update Catalog.getAllPageDicts
to always propagate the actual Errors (PR 14335 follow-up)
Rather than "swallowing" the actual Errors, when data fetching fails, ensure that they're always being propagated as intended to the call-site instead. Note that we purposely handle `XRefEntryException` specially, to make it possible to fallback to indexing all XRef objects.
This commit is contained in:
parent
47f9eef584
commit
70ac6b1694
@ -1224,7 +1224,7 @@ class Catalog {
|
||||
* Eagerly fetches the entire /Pages-tree; should ONLY be used as a fallback.
|
||||
* @returns {Map}
|
||||
*/
|
||||
getAllPageDicts() {
|
||||
getAllPageDicts(recoveryMode = false) {
|
||||
const queue = [{ currentNode: this.toplevelPagesDict, posInKids: 0 }];
|
||||
const visitedNodes = new RefSet();
|
||||
const map = new Map();
|
||||
@ -1233,8 +1233,8 @@ class Catalog {
|
||||
function addPageDict(pageDict, pageRef) {
|
||||
map.set(pageIndex++, [pageDict, pageRef]);
|
||||
}
|
||||
function addPageError(msg) {
|
||||
map.set(pageIndex++, [new FormatError(msg), null]);
|
||||
function addPageError(error) {
|
||||
map.set(pageIndex++, [error, null]);
|
||||
}
|
||||
|
||||
while (queue.length > 0) {
|
||||
@ -1248,12 +1248,16 @@ class Catalog {
|
||||
if (ex instanceof MissingDataException) {
|
||||
throw ex;
|
||||
}
|
||||
if (ex instanceof XRefEntryException) {
|
||||
if (ex instanceof XRefEntryException && !recoveryMode) {
|
||||
throw ex;
|
||||
}
|
||||
addPageError(ex);
|
||||
break;
|
||||
}
|
||||
if (!Array.isArray(kids)) {
|
||||
addPageError("Page dictionary kids object is not an array.");
|
||||
addPageError(
|
||||
new FormatError("Page dictionary kids object is not an array.")
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1271,13 +1275,17 @@ class Catalog {
|
||||
if (ex instanceof MissingDataException) {
|
||||
throw ex;
|
||||
}
|
||||
if (ex instanceof XRefEntryException) {
|
||||
if (ex instanceof XRefEntryException && !recoveryMode) {
|
||||
throw ex;
|
||||
}
|
||||
addPageError(ex);
|
||||
break;
|
||||
}
|
||||
// Prevent circular references in the /Pages tree.
|
||||
if (visitedNodes.has(kidObj)) {
|
||||
addPageError("Pages tree contains circular reference.");
|
||||
addPageError(
|
||||
new FormatError("Pages tree contains circular reference.")
|
||||
);
|
||||
break;
|
||||
}
|
||||
visitedNodes.put(kidObj);
|
||||
@ -1289,7 +1297,9 @@ class Catalog {
|
||||
}
|
||||
if (!(obj instanceof Dict)) {
|
||||
addPageError(
|
||||
"Page dictionary kid reference points to wrong type of object."
|
||||
new FormatError(
|
||||
"Page dictionary kid reference points to wrong type of object."
|
||||
)
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
@ -1393,7 +1393,9 @@ class PDFDocument {
|
||||
|
||||
let pagesTree;
|
||||
try {
|
||||
pagesTree = await pdfManager.ensureCatalog("getAllPageDicts");
|
||||
pagesTree = await pdfManager.ensureCatalog("getAllPageDicts", [
|
||||
recoveryMode,
|
||||
]);
|
||||
} catch (reasonAll) {
|
||||
if (reasonAll instanceof XRefEntryException && !recoveryMode) {
|
||||
throw new XRefParseException();
|
||||
|
Loading…
x
Reference in New Issue
Block a user