Skip to content

Always fallback to checking all destinations, when lookup fails (issue 19835) #19836

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/core/catalog.js
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,7 @@ class Catalog {
const dest = fetchDest(value);
if (dest) {
// Always let the NameTree take precedence.
dests[key] ||= dest;
dests[stringToPDFString(key)] ||= dest;
}
}
}
Expand All @@ -701,12 +701,12 @@ class Catalog {
}
}

if (rawDests[0] instanceof NameTree) {
// Fallback to checking the *entire* NameTree, in an attempt to handle
// corrupt PDF documents with out-of-order NameTrees (fixes issue 10272).
// Always fallback to checking all destinations, in order to support:
// - PDF documents with out-of-order NameTrees (fixes issue 10272).
// - Destination keys that use PDFDocEncoding (fixes issue 19835).
if (rawDests.length) {
const dest = this.destinations[id];
if (dest) {
warn(`Found "${id}" at an incorrect position in the NameTree.`);
return dest;
}
}
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/issue19835.pdf.link
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://github.com/user-attachments/files/19825124/AAPL-2024-09-28-10-K-d71aeb7ff955e2fc4770624610676221.pdf
8 changes: 8 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@
"link": true,
"type": "other"
},
{
"id": "issue19835",
"file": "pdfs/issue19835.pdf",
"md5": "2940a2f8a41fae299b9a599b8364d05c",
"rounds": 1,
"link": true,
"type": "other"
},
{
"id": "filled-background-range",
"file": "pdfs/filled-background.pdf",
Expand Down
22 changes: 22 additions & 0 deletions test/unit/api_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1399,6 +1399,28 @@ describe("api", function () {
await loadingTask.destroy();
});

it("gets a destination, from /Dests dictionary with keys using PDFDocEncoding", async function () {
if (isNodeJS) {
pending("Linked test-cases are not supported in Node.js.");
}
const loadingTask = getDocument(buildGetDocumentParams("issue19835.pdf"));
const pdfDoc = await loadingTask.promise;

const page3 = await pdfDoc.getPage(3);
const annots = await page3.getAnnotations();

const annot = annots.find(x => x.id === "22R");
// Sanity check to make sure that we found the "correct" annotation.
expect(annot.dest).toEqual(
"\u00f2\u00ab\u00d9\u0025\u006f\u2030\u0062\u2122\u0030\u00ab\u00f4\u0047\u0016\u0142\u00e8\u00bd\u2014\u0063\u00a1\u00db"
);

const dest = await pdfDoc.getDestination(annot.dest);
expect(dest).toEqual([2, { name: "XYZ" }, 34.0799999, 315.439999, 0]);

await loadingTask.destroy();
});

it("gets non-string destination", async function () {
let numberPromise = pdfDocument.getDestination(4.3);
let booleanPromise = pdfDocument.getDestination(true);
Expand Down