Merge pull request #7775 from timvandermeij/widget-annotation-name
Widget annotation: implement field name according to the specification
This commit is contained in:
commit
9f8d67475e
@ -91,7 +91,7 @@ function setupForm(div, content, viewport) {
|
|||||||
// select box is not supported
|
// select box is not supported
|
||||||
}
|
}
|
||||||
input.className = 'inputControl';
|
input.className = 'inputControl';
|
||||||
input.name = item.fullName;
|
input.name = item.fieldName;
|
||||||
input.title = item.alternativeText;
|
input.title = item.alternativeText;
|
||||||
assignFontStyle(input, item);
|
assignFontStyle(input, item);
|
||||||
bindInputItem(input, item);
|
bindInputItem(input, item);
|
||||||
|
@ -621,6 +621,7 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() {
|
|||||||
var data = this.data;
|
var data = this.data;
|
||||||
|
|
||||||
data.annotationType = AnnotationType.WIDGET;
|
data.annotationType = AnnotationType.WIDGET;
|
||||||
|
data.fieldName = this._constructFieldName(dict);
|
||||||
data.fieldValue = Util.getInheritableProperty(dict, 'V',
|
data.fieldValue = Util.getInheritableProperty(dict, 'V',
|
||||||
/* getArray = */ true);
|
/* getArray = */ true);
|
||||||
data.alternativeText = stringToPDFString(dict.get('TU') || '');
|
data.alternativeText = stringToPDFString(dict.get('TU') || '');
|
||||||
@ -640,41 +641,49 @@ var WidgetAnnotation = (function WidgetAnnotationClosure() {
|
|||||||
if (data.fieldType === 'Sig') {
|
if (data.fieldType === 'Sig') {
|
||||||
this.setFlags(AnnotationFlag.HIDDEN);
|
this.setFlags(AnnotationFlag.HIDDEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Building the full field name by collecting the field and
|
|
||||||
// its ancestors 'T' data and joining them using '.'.
|
|
||||||
var fieldName = [];
|
|
||||||
var namedItem = dict;
|
|
||||||
var ref = params.ref;
|
|
||||||
while (namedItem) {
|
|
||||||
var parent = namedItem.get('Parent');
|
|
||||||
var parentRef = namedItem.getRaw('Parent');
|
|
||||||
var name = namedItem.get('T');
|
|
||||||
if (name) {
|
|
||||||
fieldName.unshift(stringToPDFString(name));
|
|
||||||
} else if (parent && ref) {
|
|
||||||
// The field name is absent, that means more than one field
|
|
||||||
// with the same name may exist. Replacing the empty name
|
|
||||||
// with the '`' plus index in the parent's 'Kids' array.
|
|
||||||
// This is not in the PDF spec but necessary to id the
|
|
||||||
// the input controls.
|
|
||||||
var kids = parent.get('Kids');
|
|
||||||
var j, jj;
|
|
||||||
for (j = 0, jj = kids.length; j < jj; j++) {
|
|
||||||
var kidRef = kids[j];
|
|
||||||
if (kidRef.num === ref.num && kidRef.gen === ref.gen) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldName.unshift('`' + j);
|
|
||||||
}
|
|
||||||
namedItem = parent;
|
|
||||||
ref = parentRef;
|
|
||||||
}
|
|
||||||
data.fullName = fieldName.join('.');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Util.inherit(WidgetAnnotation, Annotation, {
|
Util.inherit(WidgetAnnotation, Annotation, {
|
||||||
|
/**
|
||||||
|
* Construct the (fully qualified) field name from the (partial) field
|
||||||
|
* names of the field and its ancestors.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @memberof WidgetAnnotation
|
||||||
|
* @param {Dict} dict - Complete widget annotation dictionary
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
_constructFieldName: function WidgetAnnotation_constructFieldName(dict) {
|
||||||
|
// Both the `Parent` and `T` fields are optional. While at least one of
|
||||||
|
// them should be provided, bad PDF generators may fail to do so.
|
||||||
|
if (!dict.has('T') && !dict.has('Parent')) {
|
||||||
|
warn('Unknown field name, falling back to empty field name.');
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no parent exists, the partial and fully qualified names are equal.
|
||||||
|
if (!dict.has('Parent')) {
|
||||||
|
return stringToPDFString(dict.get('T'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Form the fully qualified field name by appending the partial name to
|
||||||
|
// the parent's fully qualified name, separated by a period.
|
||||||
|
var fieldName = [];
|
||||||
|
if (dict.has('T')) {
|
||||||
|
fieldName.unshift(stringToPDFString(dict.get('T')));
|
||||||
|
}
|
||||||
|
|
||||||
|
var loopDict = dict;
|
||||||
|
while (loopDict.has('Parent')) {
|
||||||
|
loopDict = loopDict.get('Parent');
|
||||||
|
|
||||||
|
if (loopDict.has('T')) {
|
||||||
|
fieldName.unshift(stringToPDFString(loopDict.get('T')));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fieldName.join('.');
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a provided field flag is set.
|
* Check if a provided field flag is set.
|
||||||
*
|
*
|
||||||
|
@ -616,6 +616,74 @@ describe('Annotation layer', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('WidgetAnnotation', function() {
|
||||||
|
var widgetDict;
|
||||||
|
|
||||||
|
beforeEach(function (done) {
|
||||||
|
widgetDict = new Dict();
|
||||||
|
widgetDict.set('Type', Name.get('Annot'));
|
||||||
|
widgetDict.set('Subtype', Name.get('Widget'));
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
widgetDict = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle unknown field names', function() {
|
||||||
|
var widgetRef = new Ref(20, 0);
|
||||||
|
var xref = new XRefMock([
|
||||||
|
{ ref: widgetRef, data: widgetDict, }
|
||||||
|
]);
|
||||||
|
|
||||||
|
var widgetAnnotation = annotationFactory.create(xref, widgetRef,
|
||||||
|
pdfManagerMock);
|
||||||
|
var data = widgetAnnotation.data;
|
||||||
|
expect(data.annotationType).toEqual(AnnotationType.WIDGET);
|
||||||
|
expect(data.fieldName).toEqual('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should construct the field name when there are no ancestors',
|
||||||
|
function() {
|
||||||
|
widgetDict.set('T', 'foo');
|
||||||
|
|
||||||
|
var widgetRef = new Ref(21, 0);
|
||||||
|
var xref = new XRefMock([
|
||||||
|
{ ref: widgetRef, data: widgetDict, }
|
||||||
|
]);
|
||||||
|
|
||||||
|
var widgetAnnotation = annotationFactory.create(xref, widgetRef,
|
||||||
|
pdfManagerMock);
|
||||||
|
var data = widgetAnnotation.data;
|
||||||
|
expect(data.annotationType).toEqual(AnnotationType.WIDGET);
|
||||||
|
expect(data.fieldName).toEqual('foo');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should construct the field name when there are ancestors', function() {
|
||||||
|
var firstParent = new Dict();
|
||||||
|
firstParent.set('T', 'foo');
|
||||||
|
|
||||||
|
var secondParent = new Dict();
|
||||||
|
secondParent.set('Parent', firstParent);
|
||||||
|
secondParent.set('T', 'bar');
|
||||||
|
|
||||||
|
widgetDict.set('Parent', secondParent);
|
||||||
|
widgetDict.set('T', 'baz');
|
||||||
|
|
||||||
|
var widgetRef = new Ref(22, 0);
|
||||||
|
var xref = new XRefMock([
|
||||||
|
{ ref: widgetRef, data: widgetDict, }
|
||||||
|
]);
|
||||||
|
|
||||||
|
var widgetAnnotation = annotationFactory.create(xref, widgetRef,
|
||||||
|
pdfManagerMock);
|
||||||
|
var data = widgetAnnotation.data;
|
||||||
|
expect(data.annotationType).toEqual(AnnotationType.WIDGET);
|
||||||
|
expect(data.fieldName).toEqual('foo.bar.baz');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('TextWidgetAnnotation', function() {
|
describe('TextWidgetAnnotation', function() {
|
||||||
var textWidgetDict;
|
var textWidgetDict;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user