diff --git a/src/core/catalog.js b/src/core/catalog.js index 68db4b847..2c4551d3a 100644 --- a/src/core/catalog.js +++ b/src/core/catalog.js @@ -64,26 +64,27 @@ function isValidExplicitDest(dest) { if (!(zoom instanceof Name)) { return false; } + const argsLen = args.length; let allowNull = true; switch (zoom.name) { case "XYZ": - if (args.length !== 3) { + if (argsLen < 2 || argsLen > 3) { return false; } break; case "Fit": case "FitB": - return args.length === 0; + return argsLen === 0; case "FitH": case "FitBH": case "FitV": case "FitBV": - if (args.length > 1) { + if (argsLen > 1) { return false; } break; case "FitR": - if (args.length !== 4) { + if (argsLen !== 4) { return false; } allowNull = false; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 808cf43a4..dde1c0166 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -13,6 +13,7 @@ !issue1155r.pdf !issue2017r.pdf !bug1727053.pdf +!issue18408_reduced.pdf !bug1907000_reduced.pdf !issue11913.pdf !issue2391-1.pdf diff --git a/test/pdfs/issue18408_reduced.pdf b/test/pdfs/issue18408_reduced.pdf new file mode 100644 index 000000000..a97f2d79d Binary files /dev/null and b/test/pdfs/issue18408_reduced.pdf differ diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 5159c166a..680ec6a9e 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -1901,6 +1901,49 @@ describe("api", function () { await loadingTask.destroy(); }); + it("gets outline, with /XYZ destinations that lack zoom parameter (issue 18408)", async function () { + const loadingTask = getDocument( + buildGetDocumentParams("issue18408_reduced.pdf") + ); + const pdfDoc = await loadingTask.promise; + const outline = await pdfDoc.getOutline(); + + expect(outline).toEqual([ + { + action: null, + attachment: undefined, + dest: [{ num: 14, gen: 0 }, { name: "XYZ" }, 65, 705], + url: null, + unsafeUrl: undefined, + newWindow: undefined, + setOCGState: undefined, + title: "Page 1", + color: new Uint8ClampedArray([0, 0, 0]), + count: undefined, + bold: false, + italic: false, + items: [], + }, + { + action: null, + attachment: undefined, + dest: [{ num: 13, gen: 0 }, { name: "XYZ" }, 60, 710], + url: null, + unsafeUrl: undefined, + newWindow: undefined, + setOCGState: undefined, + title: "Page 2", + color: new Uint8ClampedArray([0, 0, 0]), + count: undefined, + bold: false, + italic: false, + items: [], + }, + ]); + + await loadingTask.destroy(); + }); + it("gets outline, with /FitH destinations that lack coordinate parameter (bug 1907000)", async function () { const loadingTask = getDocument( buildGetDocumentParams("bug1907000_reduced.pdf") diff --git a/web/pdf_link_service.js b/web/pdf_link_service.js index 73a29f64b..14ffb9c10 100644 --- a/web/pdf_link_service.js +++ b/web/pdf_link_service.js @@ -505,26 +505,27 @@ class PDFLinkService { if (!(typeof zoom === "object" && typeof zoom?.name === "string")) { return false; } + const argsLen = args.length; let allowNull = true; switch (zoom.name) { case "XYZ": - if (args.length !== 3) { + if (argsLen < 2 || argsLen > 3) { return false; } break; case "Fit": case "FitB": - return args.length === 0; + return argsLen === 0; case "FitH": case "FitBH": case "FitV": case "FitBV": - if (args.length > 1) { + if (argsLen > 1) { return false; } break; case "FitR": - if (args.length !== 4) { + if (argsLen !== 4) { return false; } allowNull = false;