From 49486ef263f4a7729a156426d5277d34baf2224e Mon Sep 17 00:00:00 2001 From: Modesty Zhang Date: Fri, 3 Jan 2025 14:56:06 -0800 Subject: [PATCH] fix: #369: read value from xRef if rectangle coordinate is ref obj after dict.get('Rect') call (#380) --- base/shared/annotation.js | 21 +++++++++++++++++---- package.json | 2 +- test/pdf/misc/i369_3fields.pdf | Bin 0 -> 5521 bytes 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 test/pdf/misc/i369_3fields.pdf diff --git a/base/shared/annotation.js b/base/shared/annotation.js index 978a352a..9a1cd7ec 100755 --- a/base/shared/annotation.js +++ b/base/shared/annotation.js @@ -77,7 +77,7 @@ var Annotation = (function AnnotationClosure() { data.subtype = dict.get('Subtype').name; data.annotationFlags = dict.get('F'); - this.setRectangle(dict.get('Rect')); + this.getAndSetRectangle(dict); data.rect = this.rectangle; var color = dict.get('C'); @@ -117,7 +117,20 @@ var Annotation = (function AnnotationClosure() { } else { this.rectangle = [0, 0, 0, 0]; } - }, + }, + + getAndSetRectangle: function Annotation_getAndSetRectangle(dict) { + var rect = dict.get('Rect'); + var xref = dict.xref; + if (isArray(rect) && rect.length === 4) { + for (var i = 0; i < 4; i++) { + rect[i] = (typeof rect[i] === "object") ? xref.fetchIfRef(rect[i]) : rect[i]; + } + this.setRectangle(rect); + } else { + this.rectangle = [0, 0, 0, 0]; + } + }, getData: function Annotation_getData() { return this.data; @@ -330,9 +343,9 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() { var rawValue = Util.getInheritableProperty(dict, 'V') || ''; var value = (rawValue.name ? rawValue.name : rawValue) || ''; data.fieldValue = stringToPDFString(value); - + data.alternativeText = stringToPDFString(dict.get('TU') || ''); - + data.alternativeID = stringToPDFString(dict.get('TM') || ''); data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || ''; diff --git a/package.json b/package.json index c4a4b38f..74e01dd6 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "test:jest": "jest --config ./jest.config.json", "test": "jest --config ./jest.config.json && npm run parse-r && npm run parse-fd", "test:forms": "cd ./test && sh p2j.forms.sh", - "test:misc": "cd ./test && sh p2j.one.sh misc . \"Expected: 13 success, 6 exceptions with stack trace\" ", + "test:misc": "cd ./test && sh p2j.one.sh misc . \"Expected: 14 success, 5 fail exception with stack trace\" ", "parse": "./bin/pdf2json.js -f ./test/pdf/fd/form/F1040.pdf -o ./test/target/fd/form", "parse-s": "./bin/pdf2json.js -f ./test/pdf/fd/form/F1040.pdf -o ./test/target/fd/form -s", "parse-t": "./bin/pdf2json.js -f ./test/pdf/fd/form/F1040.pdf -o ./test/target/fd/form -s -t", diff --git a/test/pdf/misc/i369_3fields.pdf b/test/pdf/misc/i369_3fields.pdf new file mode 100644 index 0000000000000000000000000000000000000000..decc884696ffd9616eb4504abb419170f9803460 GIT binary patch literal 5521 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 ST%p2o49s66&B<}$ivIzGgUYi2 literal 0 HcmV?d00001