Skip to content

Commit

Permalink
Allow /XYZ destinations without zoom parameter (issue 18408)
Browse files Browse the repository at this point in the history
According to the PDF specification these destinations should have a zoom parameter, which may however be `null`, but it shouldn't be omitted; please see https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf#G11.2095870

Hence we try to work-around bad PDF generators by making the zoom parameter optional when validating explicit destinations in both the worker and the viewer.
  • Loading branch information
Snuffleupagus committed Jul 18, 2024
1 parent e1f64a5 commit d24a61c
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 8 deletions.
9 changes: 5 additions & 4 deletions src/core/catalog.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
!issue1155r.pdf
!issue2017r.pdf
!bug1727053.pdf
!issue18408_reduced.pdf
!bug1907000_reduced.pdf
!issue11913.pdf
!issue2391-1.pdf
Expand Down
Binary file added test/pdfs/issue18408_reduced.pdf
Binary file not shown.
43 changes: 43 additions & 0 deletions test/unit/api_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
9 changes: 5 additions & 4 deletions web/pdf_link_service.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit d24a61c

Please sign in to comment.