Skip to content

Commit

Permalink
[Annotation] For choice widget, use the I entry instead of the V one …
Browse files Browse the repository at this point in the history
…(bug 1770750)

It isn't really conform to the specifications but Acrobat is working like that...
  • Loading branch information
calixteman committed Feb 9, 2023
1 parent ff3b9cc commit 58e4d92
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 7 deletions.
57 changes: 50 additions & 7 deletions src/core/annotation.js
Original file line number Diff line number Diff line change
Expand Up @@ -1791,6 +1791,8 @@ class WidgetAnnotation extends Annotation {
return mk.size > 0 ? mk : null;
}

amendSavedDict(annotationStorage, dict) {}

async save(evaluator, task, annotationStorage) {
const storageEntry = annotationStorage
? annotationStorage.get(this.data.id)
Expand Down Expand Up @@ -1868,6 +1870,7 @@ class WidgetAnnotation extends Annotation {
: stringToUTF16String(val, /* bigEndian = */ true);
};
dict.set("V", Array.isArray(value) ? value.map(encoder) : encoder(value));
this.amendSavedDict(annotationStorage, dict);

const maybeMK = this._getMKDict(rotation);
if (maybeMK) {
Expand Down Expand Up @@ -3144,6 +3147,10 @@ class ChoiceWidgetAnnotation extends WidgetAnnotation {
super(params);

const { dict, xref } = params;

this.indices = dict.getArray("I");
this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0;

// Determine the options. The options array may consist of strings or
// arrays. If the array consists of arrays, then the first element of
// each array is the export value and the second element of each array is
Expand Down Expand Up @@ -3172,14 +3179,28 @@ class ChoiceWidgetAnnotation extends WidgetAnnotation {
}
}

// The field value can be `null` if no item is selected, a string if one
// item is selected or an array of strings if multiple items are selected.
// For consistency in the API and convenience in the display layer, we
// always make the field value an array with zero, one or multiple items.
if (typeof this.data.fieldValue === "string") {
this.data.fieldValue = [this.data.fieldValue];
} else if (!this.data.fieldValue) {
if (!this.hasIndices) {
// The field value can be `null` if no item is selected, a string if one
// item is selected or an array of strings if multiple items are selected.
// For consistency in the API and convenience in the display layer, we
// always make the field value an array with zero, one or multiple items.
if (typeof this.data.fieldValue === "string") {
this.data.fieldValue = [this.data.fieldValue];
} else if (!this.data.fieldValue) {
this.data.fieldValue = [];
}
} else {
// The specs say that we should have an indices array only with
// multiselectable Choice and the "V" entry should have the
// precedence, but Acrobat itself is using it whatever the
// the "V" entry is (see bug 1770750).
this.data.fieldValue = [];
const ii = this.data.options.length;
for (const i of this.indices) {
if (Number.isInteger(i) && i >= 0 && i < ii) {
this.data.fieldValue.push(this.data.options[i].exportValue);
}
}
}

// Process field flags for the display layer.
Expand Down Expand Up @@ -3212,6 +3233,28 @@ class ChoiceWidgetAnnotation extends WidgetAnnotation {
};
}

amendSavedDict(annotationStorage, dict) {
if (!this.hasIndices) {
return;
}
const storageEntry = annotationStorage
? annotationStorage.get(this.data.id)
: undefined;
let values = storageEntry && storageEntry.value;
if (!Array.isArray(values)) {
values = [values];
}
const indices = [];
const { options } = this.data;
for (let i = 0, j = 0, ii = options.length; i < ii; i++) {
if (options[i].exportValue === values[j]) {
indices.push(i);
j += 1;
}
}
dict.set("I", indices);
}

async _getAppearance(evaluator, task, intent, annotationStorage) {
if (this.data.combo) {
return super._getAppearance(evaluator, task, intent, annotationStorage);
Expand Down
1 change: 1 addition & 0 deletions test/pdfs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -573,3 +573,4 @@
!bug1811510.pdf
!bug1815476.pdf
!issue16021.pdf
!bug1770750.pdf
Binary file added test/pdfs/bug1770750.pdf
Binary file not shown.
8 changes: 8 additions & 0 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7356,5 +7356,13 @@
"md5": "78a12254cac90ba5219a4c5555ea35ed",
"rounds": 1,
"type": "eq"
},
{
"id": "bug1770750-annotations",
"file": "pdfs/bug1770750.pdf",
"md5": "01e6d77eac90b4b08d75240d3db2b826",
"rounds": 1,
"type": "eq",
"annotations": true
}
]

0 comments on commit 58e4d92

Please sign in to comment.