mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-22 16:18:08 +02:00
For text widgets, get the text from the AP stream instead of from the format callback (bug 1825002)
When fixing bug 1766987, I thought the field formatted value came from the result of the format callback: I was wrong. The format callback is ran but the value is unused (maybe it's useful to set some global vars... or it's just a bug in Acrobat). Anyway the value to display is the one rendered in the AP stream. The field value setter has been simplified and that fixes issue #16409.
This commit is contained in:
parent
5ae353cf4d
commit
177036e6ae
7 changed files with 93 additions and 35 deletions
|
@ -2461,6 +2461,10 @@ class TextWidgetAnnotation extends WidgetAnnotation {
|
|||
this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL);
|
||||
}
|
||||
|
||||
get hasTextContent() {
|
||||
return !!this.appearance;
|
||||
}
|
||||
|
||||
_getCombAppearance(
|
||||
defaultAppearance,
|
||||
font,
|
||||
|
|
|
@ -1049,7 +1049,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||
const storedData = storage.getValue(id, {
|
||||
value: this.data.fieldValue,
|
||||
});
|
||||
let textContent = storedData.formattedValue || storedData.value || "";
|
||||
let textContent = storedData.value || "";
|
||||
const maxLen = storage.getValue(id, {
|
||||
charLimit: this.data.maxLen,
|
||||
}).charLimit;
|
||||
|
@ -1057,23 +1057,29 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement {
|
|||
textContent = textContent.slice(0, maxLen);
|
||||
}
|
||||
|
||||
let fieldFormattedValues =
|
||||
storedData.formattedValue || this.data.textContent?.join("\n") || null;
|
||||
if (fieldFormattedValues && this.data.comb) {
|
||||
fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, "");
|
||||
}
|
||||
|
||||
const elementData = {
|
||||
userValue: textContent,
|
||||
formattedValue: null,
|
||||
formattedValue: fieldFormattedValues,
|
||||
lastCommittedValue: null,
|
||||
commitKey: 1,
|
||||
};
|
||||
|
||||
if (this.data.multiLine) {
|
||||
element = document.createElement("textarea");
|
||||
element.textContent = textContent;
|
||||
element.textContent = fieldFormattedValues ?? textContent;
|
||||
if (this.data.doNotScroll) {
|
||||
element.style.overflowY = "hidden";
|
||||
}
|
||||
} else {
|
||||
element = document.createElement("input");
|
||||
element.type = "text";
|
||||
element.setAttribute("value", textContent);
|
||||
element.setAttribute("value", fieldFormattedValues ?? textContent);
|
||||
if (this.data.doNotScroll) {
|
||||
element.style.overflowX = "hidden";
|
||||
}
|
||||
|
|
|
@ -98,8 +98,9 @@ class EventDispatcher {
|
|||
// errors in the case where a formatter is using one of those named
|
||||
// actions (see #15818).
|
||||
this._document.obj._initActions();
|
||||
// Before running the Open event, we format all the fields
|
||||
// (see bug 1766987).
|
||||
// Before running the Open event, we run the format callbacks but
|
||||
// without changing the value of the fields.
|
||||
// Acrobat does the same thing.
|
||||
this.formatAll();
|
||||
}
|
||||
if (
|
||||
|
@ -232,13 +233,7 @@ class EventDispatcher {
|
|||
const event = (globalThis.event = new Event({}));
|
||||
for (const source of Object.values(this._objects)) {
|
||||
event.value = source.obj.value;
|
||||
if (this.runActions(source, source, event, "Format")) {
|
||||
source.obj._send({
|
||||
id: source.obj._id,
|
||||
siblings: source.obj._siblings,
|
||||
formattedValue: event.value?.toString?.(),
|
||||
});
|
||||
}
|
||||
this.runActions(source, source, event, "Format");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { createActionsMap, FieldType, getFieldType } from "./common.js";
|
||||
import { createActionsMap, getFieldType } from "./common.js";
|
||||
import { Color } from "./color.js";
|
||||
import { PDFObject } from "./pdf_object.js";
|
||||
|
||||
|
@ -247,29 +247,15 @@ class Field extends PDFObject {
|
|||
return;
|
||||
}
|
||||
|
||||
if (value === "") {
|
||||
this._value = "";
|
||||
} else if (typeof value === "string") {
|
||||
switch (this._fieldType) {
|
||||
case FieldType.none: {
|
||||
this._originalValue = value;
|
||||
const _value = value.trim().replace(",", ".");
|
||||
this._value = !isNaN(_value) ? parseFloat(_value) : value;
|
||||
break;
|
||||
}
|
||||
case FieldType.number:
|
||||
case FieldType.percent: {
|
||||
const _value = value.trim().replace(",", ".");
|
||||
const number = parseFloat(_value);
|
||||
this._value = !isNaN(number) ? number : 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
this._value = value;
|
||||
}
|
||||
} else {
|
||||
if (value === "" || typeof value !== "string") {
|
||||
this._originalValue = undefined;
|
||||
this._value = value;
|
||||
return;
|
||||
}
|
||||
|
||||
this._originalValue = value;
|
||||
const _value = value.trim().replace(",", ".");
|
||||
this._value = !isNaN(_value) ? parseFloat(_value) : value;
|
||||
}
|
||||
|
||||
_getValue() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue