mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-07-30 19:07:22 +02:00
Compare commits
8 Commits
d8d3e0abf5
...
63e6566597
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63e6566597 | ||
|
|
213d51d7e9 | ||
|
|
c8ed291cf9 | ||
|
|
c63c51e016 | ||
|
|
b4626a77a2 | ||
|
|
adc9eb5a5a | ||
|
|
8e7060158e | ||
|
|
97fe7d6a19 |
@ -682,7 +682,7 @@ class Catalog {
|
|||||||
const dest = fetchDest(value);
|
const dest = fetchDest(value);
|
||||||
if (dest) {
|
if (dest) {
|
||||||
// Always let the NameTree take precedence.
|
// Always let the NameTree take precedence.
|
||||||
dests[key] ||= dest;
|
dests[stringToPDFString(key)] ||= dest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -701,12 +701,12 @@ class Catalog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rawDests[0] instanceof NameTree) {
|
// Always fallback to checking all destinations, in order to support:
|
||||||
// Fallback to checking the *entire* NameTree, in an attempt to handle
|
// - PDF documents with out-of-order NameTrees (fixes issue 10272).
|
||||||
// corrupt 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];
|
const dest = this.destinations[id];
|
||||||
if (dest) {
|
if (dest) {
|
||||||
warn(`Found "${id}" at an incorrect position in the NameTree.`);
|
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
test/pdfs/issue19835.pdf.link
Normal file
1
test/pdfs/issue19835.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://github.com/user-attachments/files/19825124/AAPL-2024-09-28-10-K-d71aeb7ff955e2fc4770624610676221.pdf
|
||||||
@ -23,6 +23,14 @@
|
|||||||
"link": true,
|
"link": true,
|
||||||
"type": "other"
|
"type": "other"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "issue19835",
|
||||||
|
"file": "pdfs/issue19835.pdf",
|
||||||
|
"md5": "2940a2f8a41fae299b9a599b8364d05c",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"type": "other"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "filled-background-range",
|
"id": "filled-background-range",
|
||||||
"file": "pdfs/filled-background.pdf",
|
"file": "pdfs/filled-background.pdf",
|
||||||
|
|||||||
@ -1399,6 +1399,28 @@ describe("api", function () {
|
|||||||
await loadingTask.destroy();
|
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 () {
|
it("gets non-string destination", async function () {
|
||||||
let numberPromise = pdfDocument.getDestination(4.3);
|
let numberPromise = pdfDocument.getDestination(4.3);
|
||||||
let booleanPromise = pdfDocument.getDestination(true);
|
let booleanPromise = pdfDocument.getDestination(true);
|
||||||
|
|||||||
@ -875,7 +875,12 @@ const PDFViewerApplication = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
get supportsPrinting() {
|
get supportsPrinting() {
|
||||||
return PDFPrintServiceFactory.supportsPrinting;
|
return shadow(
|
||||||
|
this,
|
||||||
|
"supportsPrinting",
|
||||||
|
AppOptions.get("supportsPrinting") &&
|
||||||
|
PDFPrintServiceFactory.supportsPrinting
|
||||||
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
get supportsFullscreen() {
|
get supportsFullscreen() {
|
||||||
|
|||||||
@ -136,6 +136,11 @@ const defaultOptions = {
|
|||||||
value: true,
|
value: true,
|
||||||
kind: OptionKind.BROWSER,
|
kind: OptionKind.BROWSER,
|
||||||
},
|
},
|
||||||
|
supportsPrinting: {
|
||||||
|
/** @type {boolean} */
|
||||||
|
value: true,
|
||||||
|
kind: OptionKind.BROWSER,
|
||||||
|
},
|
||||||
toolbarDensity: {
|
toolbarDensity: {
|
||||||
/** @type {number} */
|
/** @type {number} */
|
||||||
value: 0, // 0 = "normal", 1 = "compact", 2 = "touch"
|
value: 0, // 0 = "normal", 1 = "compact", 2 = "touch"
|
||||||
|
|||||||
@ -35,7 +35,7 @@ function getXfaHtmlForPrinting(printContainer, pdfDocument) {
|
|||||||
});
|
});
|
||||||
const viewport = getXfaPageViewport(xfaPage, { scale });
|
const viewport = getXfaPageViewport(xfaPage, { scale });
|
||||||
|
|
||||||
builder.render(viewport, "print");
|
builder.render({ viewport, intent: "print" });
|
||||||
page.append(builder.div);
|
page.append(builder.div);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -549,10 +549,6 @@ body {
|
|||||||
mask-image: var(--toolbarButton-zoomIn-icon);
|
mask-image: var(--toolbarButton-zoomIn-icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
#presentationMode::before {
|
|
||||||
mask-image: var(--toolbarButton-presentationMode-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#editorFreeTextButton::before {
|
#editorFreeTextButton::before {
|
||||||
mask-image: var(--toolbarButton-editorFreeText-icon);
|
mask-image: var(--toolbarButton-editorFreeText-icon);
|
||||||
}
|
}
|
||||||
@ -577,20 +573,10 @@ body {
|
|||||||
mask-image: var(--toolbarButton-print-icon);
|
mask-image: var(--toolbarButton-print-icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*#if GENERIC*/
|
|
||||||
#secondaryOpenFile::before {
|
|
||||||
mask-image: var(--toolbarButton-openFile-icon);
|
|
||||||
}
|
|
||||||
/*#endif*/
|
|
||||||
|
|
||||||
#downloadButton::before {
|
#downloadButton::before {
|
||||||
mask-image: var(--toolbarButton-download-icon);
|
mask-image: var(--toolbarButton-download-icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
#viewBookmark::before {
|
|
||||||
mask-image: var(--toolbarButton-bookmark-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#currentOutlineItem::before {
|
#currentOutlineItem::before {
|
||||||
mask-image: var(--toolbarButton-currentOutlineItem-icon);
|
mask-image: var(--toolbarButton-currentOutlineItem-icon);
|
||||||
transform: scaleX(var(--dir-factor));
|
transform: scaleX(var(--dir-factor));
|
||||||
@ -1665,64 +1651,6 @@ dialog :link {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#secondaryToolbar {
|
|
||||||
#firstPage::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-firstPage-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#lastPage::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-lastPage-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#pageRotateCcw::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-rotateCcw-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#pageRotateCw::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-rotateCw-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#cursorSelectTool::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-selectTool-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#cursorHandTool::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-handTool-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#scrollPage::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-scrollPage-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#scrollVertical::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-scrollVertical-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#scrollHorizontal::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-scrollHorizontal-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#scrollWrapped::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-scrollWrapped-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#spreadNone::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-spreadNone-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#spreadOdd::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-spreadOdd-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#spreadEven::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-spreadEven-icon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#documentProperties::before {
|
|
||||||
mask-image: var(--secondaryToolbarButton-documentProperties-icon);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media all and (max-width: 840px) {
|
@media all and (max-width: 840px) {
|
||||||
#sidebarContainer {
|
#sidebarContainer {
|
||||||
background-color: var(--sidebar-narrow-bg-color);
|
background-color: var(--sidebar-narrow-bg-color);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user