feat: fix form calculation fields, related to #20214
This commit is contained in:
parent
1c0e5dab9f
commit
dec2becf9f
@ -1892,12 +1892,9 @@ class WidgetAnnotation extends Annotation {
|
|||||||
decodedValue = decodedValue.name;
|
decodedValue = decodedValue.name;
|
||||||
}
|
}
|
||||||
if (Array.isArray(decodedValue)) {
|
if (Array.isArray(decodedValue)) {
|
||||||
decodedValue = decodedValue[0]; // just pick first if multiple
|
decodedValue = decodedValue[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: src/core/annotation.js
|
|
||||||
// LOCATION: In the WidgetAnnotation class constructor, around line 2800-2900
|
|
||||||
|
|
||||||
class WidgetAnnotation extends Annotation {
|
class WidgetAnnotation extends Annotation {
|
||||||
constructor(params) {
|
constructor(params) {
|
||||||
super(params);
|
super(params);
|
||||||
@ -1923,34 +1920,19 @@ class WidgetAnnotation extends Annotation {
|
|||||||
|
|
||||||
let decodedValue = this._decodeFormValue(fieldValue);
|
let decodedValue = this._decodeFormValue(fieldValue);
|
||||||
|
|
||||||
// Handle Name objects, Arrays, and force numeric conversion
|
|
||||||
if (decodedValue instanceof Name) {
|
if (decodedValue instanceof Name) {
|
||||||
decodedValue = decodedValue.name;
|
decodedValue = decodedValue.name;
|
||||||
}
|
}
|
||||||
if (Array.isArray(decodedValue)) {
|
if (Array.isArray(decodedValue)) {
|
||||||
decodedValue = decodedValue[0]; // just pick first if multiple
|
decodedValue = decodedValue[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
// REPLACE THIS SECTION:
|
|
||||||
// OLD CODE:
|
|
||||||
/*
|
|
||||||
if (typeof decodedValue === "string") {
|
|
||||||
// Remove commas from numbers like "37,037.03"
|
|
||||||
let numericStr = decodedValue.replace(/,/g, "");
|
|
||||||
if (!isNaN(numericStr)) {
|
|
||||||
decodedValue = Number(numericStr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// NEW CODE - REPLACE THE ABOVE SECTION WITH THIS:
|
|
||||||
if (typeof decodedValue === "string" && decodedValue.length > 0) {
|
if (typeof decodedValue === "string" && decodedValue.length > 0) {
|
||||||
// Handle potential calculation errors that result in repeating patterns
|
// Handle potential calculation errors that result in repeating patterns
|
||||||
const fixedValue = this._fixRepeatingCalculationValue(decodedValue);
|
const fixedValue = this._fixRepeatingCalculationValue(decodedValue);
|
||||||
if (fixedValue !== null) {
|
if (fixedValue !== null) {
|
||||||
decodedValue = fixedValue;
|
decodedValue = fixedValue;
|
||||||
} else {
|
} else {
|
||||||
// Fall back to original numeric conversion logic
|
|
||||||
let numericStr = decodedValue.replace(/,/g, "");
|
let numericStr = decodedValue.replace(/,/g, "");
|
||||||
if (!isNaN(numericStr) && numericStr !== "") {
|
if (!isNaN(numericStr) && numericStr !== "") {
|
||||||
decodedValue = Number(numericStr);
|
decodedValue = Number(numericStr);
|
||||||
@ -1959,14 +1941,7 @@ class WidgetAnnotation extends Annotation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
data.fieldValue = decodedValue;
|
data.fieldValue = decodedValue;
|
||||||
|
|
||||||
// ... rest of constructor remains unchanged
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ADD THIS NEW METHOD to the WidgetAnnotation class
|
|
||||||
// LOCATION: Add this method anywhere within the WidgetAnnotation class,
|
|
||||||
// preferably near other private methods like _decodeFormValue
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fix calculation values that show repeating patterns due to JavaScript execution errors
|
* Fix calculation values that show repeating patterns due to JavaScript execution errors
|
||||||
* @private
|
* @private
|
||||||
@ -1974,12 +1949,10 @@ class WidgetAnnotation extends Annotation {
|
|||||||
* @returns {number|null} - Fixed numeric value or null if no fix needed
|
* @returns {number|null} - Fixed numeric value or null if no fix needed
|
||||||
*/
|
*/
|
||||||
_fixRepeatingCalculationValue(value) {
|
_fixRepeatingCalculationValue(value) {
|
||||||
// Only process strings that look like malformed numbers
|
|
||||||
if (!/^[\d.,]+$/.test(value)) {
|
if (!/^[\d.,]+$/.test(value)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pattern 1: Pure repeating digits (e.g., "37037037" -> "37")
|
|
||||||
let match = value.match(/^(\d{1,4})\1{2,}$/);
|
let match = value.match(/^(\d{1,4})\1{2,}$/);
|
||||||
if (match) {
|
if (match) {
|
||||||
const basePattern = match[1];
|
const basePattern = match[1];
|
||||||
@ -1992,15 +1965,12 @@ class WidgetAnnotation extends Annotation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pattern 2: Repeating decimal patterns (e.g., "37.037.03" -> "37.0")
|
|
||||||
if (value.includes(".")) {
|
if (value.includes(".")) {
|
||||||
const parts = value.split(".");
|
const parts = value.split(".");
|
||||||
if (parts.length > 2) {
|
if (parts.length > 2) {
|
||||||
// Multiple decimal points indicate a calculation error
|
|
||||||
const firstPart = parts[0];
|
const firstPart = parts[0];
|
||||||
const secondPart = parts[1];
|
const secondPart = parts[1];
|
||||||
|
|
||||||
// Check if the pattern before first decimal repeats
|
|
||||||
if (
|
if (
|
||||||
firstPart.length > 0 &&
|
firstPart.length > 0 &&
|
||||||
value.startsWith(firstPart + "." + firstPart)
|
value.startsWith(firstPart + "." + firstPart)
|
||||||
@ -2015,7 +1985,6 @@ class WidgetAnnotation extends Annotation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback: use first valid decimal number found
|
|
||||||
const firstDecimal = parts[0] + "." + parts[1];
|
const firstDecimal = parts[0] + "." + parts[1];
|
||||||
const numericValue = Number(firstDecimal);
|
const numericValue = Number(firstDecimal);
|
||||||
if (!isNaN(numericValue)) {
|
if (!isNaN(numericValue)) {
|
||||||
@ -2027,7 +1996,6 @@ class WidgetAnnotation extends Annotation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pattern 3: Simple repeating short patterns for longer strings
|
|
||||||
if (value.length >= 6) {
|
if (value.length >= 6) {
|
||||||
for (
|
for (
|
||||||
let patternLen = 1;
|
let patternLen = 1;
|
||||||
@ -2054,10 +2022,8 @@ class WidgetAnnotation extends Annotation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null; // No fix needed
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ... rest of the class methods remain unchanged
|
|
||||||
}
|
}
|
||||||
data.fieldValue = decodedValue;
|
data.fieldValue = decodedValue;
|
||||||
|
|
||||||
|
|||||||
@ -81,8 +81,6 @@ describe("annotation", function () {
|
|||||||
return this.ensure(this.pdfDocument, prop, args);
|
return this.ensure(this.pdfDocument, prop, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// FILE: test/unit/annotation_spec.js
|
|
||||||
// LOCATION: Add this test section at the end of the file, before the closing });
|
|
||||||
|
|
||||||
describe("WidgetAnnotation repeating calculation value fix", function () {
|
describe("WidgetAnnotation repeating calculation value fix", function () {
|
||||||
let dict, xref, annotationGlobals;
|
let dict, xref, annotationGlobals;
|
||||||
@ -96,7 +94,6 @@ describe("annotation", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should fix pure repeating digit patterns", function () {
|
it("should fix pure repeating digit patterns", function () {
|
||||||
// Test case for "37037037" -> 37
|
|
||||||
dict.set("Subtype", Name.get("Widget"));
|
dict.set("Subtype", Name.get("Widget"));
|
||||||
dict.set("V", "37037037");
|
dict.set("V", "37037037");
|
||||||
|
|
||||||
@ -110,7 +107,6 @@ describe("annotation", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should fix repeating decimal patterns", function () {
|
it("should fix repeating decimal patterns", function () {
|
||||||
// Test case for "37.037.03" -> 37
|
|
||||||
dict.set("Subtype", Name.get("Widget"));
|
dict.set("Subtype", Name.get("Widget"));
|
||||||
dict.set("V", "37.037.03");
|
dict.set("V", "37.037.03");
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user