From c31ddf7edc52e05646324b4bd2c768b92de3b6bc Mon Sep 17 00:00:00 2001 From: bion Date: Fri, 6 Jul 2018 17:51:10 -0700 Subject: [PATCH] [api-minor] Include export value for checkboxes --- src/core/annotation.js | 26 ++++++++++++++++++++++---- test/unit/annotation_spec.js | 29 ++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/core/annotation.js b/src/core/annotation.js index 5e0dac35b3d38..31672a44a254b 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -742,7 +742,7 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); if (this.data.checkBox) { - this._processCheckBox(); + this._processCheckBox(params); } else if (this.data.radioButton) { this._processRadioButton(params); } else if (this.data.pushButton) { @@ -752,11 +752,29 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { } } - _processCheckBox() { - if (!isName(this.data.fieldValue)) { + _processCheckBox(params) { + if (isName(this.data.fieldValue)) { + this.data.fieldValue = this.data.fieldValue.name; + } + + const customAppearance = params.dict.get('AP'); + if (!isDict(customAppearance)) { + return; + } + + const exportValueOptionsDict = customAppearance.get('D'); + if (!isDict(exportValueOptionsDict)) { return; } - this.data.fieldValue = this.data.fieldValue.name; + + const exportValues = exportValueOptionsDict.getKeys(); + const hasCorrectOptionCount = exportValues.length === 2; + if (!hasCorrectOptionCount) { + return; + } + + this.data.exportValue = exportValues[0] === 'Off' ? + exportValues[1] : exportValues[0]; } _processRadioButton(params) { diff --git a/test/unit/annotation_spec.js b/test/unit/annotation_spec.js index 67e935aefa358..e05b632a3b2d7 100644 --- a/test/unit/annotation_spec.js +++ b/test/unit/annotation_spec.js @@ -979,7 +979,34 @@ describe('annotation', function() { buttonWidgetDict = null; }); - it('should handle checkboxes', function() { + it('should handle checkboxes with export value', function() { + buttonWidgetDict.set('V', Name.get('1')); + + var appearanceStatesDict = new Dict(); + var exportValueOptionsDict = new Dict(); + + exportValueOptionsDict.set('Off', 0); + exportValueOptionsDict.set('Checked', 1); + appearanceStatesDict.set('D', exportValueOptionsDict); + buttonWidgetDict.set('AP', appearanceStatesDict); + + var buttonWidgetRef = new Ref(124, 0); + var xref = new XRefMock([ + { ref: buttonWidgetRef, data: buttonWidgetDict, } + ]); + + var annotation = AnnotationFactory.create(xref, buttonWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.checkBox).toEqual(true); + expect(data.fieldValue).toEqual('1'); + expect(data.radioButton).toEqual(false); + expect(data.exportValue).toEqual('Checked'); + }); + + it('should handle checkboxes without export value', function() { buttonWidgetDict.set('V', Name.get('1')); var buttonWidgetRef = new Ref(124, 0);