Merge pull request #12481 from calixteman/issue_12475

Get urls if any in AA::D dictionary for pushbuttons
This commit is contained in:
Tim van der Meij 2020-10-16 22:55:43 +02:00 committed by GitHub
commit ff2631493e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 6 deletions

View File

@ -1905,12 +1905,16 @@ class ButtonWidgetAnnotation extends WidgetAnnotation {
}
_processPushButton(params) {
if (!params.dict.has("A") && !this.data.alternativeText) {
if (
!params.dict.has("A") &&
!params.dict.has("AA") &&
!this.data.alternativeText
) {
warn("Push buttons without action dictionaries are not supported");
return;
}
this.data.isTooltipOnly = !params.dict.has("A");
this.data.isTooltipOnly = !params.dict.has("A") && !params.dict.has("AA");
Catalog.parseDestDictionary({
destDict: params.dict,

View File

@ -1165,10 +1165,23 @@ class Catalog {
let action = destDict.get("A"),
url,
dest;
if (!isDict(action) && destDict.has("Dest")) {
// A /Dest entry should *only* contain a Name or an Array, but some bad
// PDF generators ignore that and treat it as an /A entry.
action = destDict.get("Dest");
if (!isDict(action)) {
if (destDict.has("Dest")) {
// A /Dest entry should *only* contain a Name or an Array, but some bad
// PDF generators ignore that and treat it as an /A entry.
action = destDict.get("Dest");
} else {
action = destDict.get("AA");
if (isDict(action)) {
if (action.has("D")) {
// MouseDown
action = action.get("D");
} else if (action.has("U")) {
// MouseUp
action = action.get("U");
}
}
}
}
if (isDict(action)) {

View File

@ -2658,6 +2658,63 @@ describe("annotation", function () {
done();
}, done.fail);
});
it("should handle URL in A dict in push buttons", function (done) {
const buttonWidgetRef = Ref.get(124, 0);
buttonWidgetDict.set("Ff", AnnotationFieldFlag.PUSHBUTTON);
const actionDict = new Dict();
actionDict.set("S", Name.get("JavaScript"));
actionDict.set(
"JS",
"app.launchURL('https://developer.mozilla.org/en-US/', true)"
);
buttonWidgetDict.set("A", actionDict);
const xref = new XRefMock([
{ ref: buttonWidgetRef, data: buttonWidgetDict },
]);
AnnotationFactory.create(
xref,
buttonWidgetRef,
pdfManagerMock,
idFactoryMock
).then(({ data }) => {
expect(data.url).toEqual("https://developer.mozilla.org/en-US/");
done();
}, done.fail);
});
it("should handle URL in AA dict in push buttons", function (done) {
const buttonWidgetRef = Ref.get(124, 0);
buttonWidgetDict.set("Ff", AnnotationFieldFlag.PUSHBUTTON);
// D stands for MouseDown
const dDict = new Dict();
dDict.set("S", Name.get("JavaScript"));
dDict.set(
"JS",
"app.launchURL('https://developer.mozilla.org/en-US/', true)"
);
const actionDict = new Dict();
actionDict.set("D", dDict);
buttonWidgetDict.set("AA", actionDict);
const xref = new XRefMock([
{ ref: buttonWidgetRef, data: buttonWidgetDict },
]);
AnnotationFactory.create(
xref,
buttonWidgetRef,
pdfManagerMock,
idFactoryMock
).then(({ data }) => {
expect(data.url).toEqual("https://developer.mozilla.org/en-US/");
done();
}, done.fail);
});
});
describe("ChoiceWidgetAnnotation", function () {