Set parent of radio annotation even if there is no 'V' field
This commit is contained in:
parent
b0c7a74a0c
commit
16dd5403c7
@ -1741,10 +1741,10 @@ class ButtonWidgetAnnotation extends WidgetAnnotation {
|
|||||||
// The parent field's `V` entry holds a `Name` object with the appearance
|
// The parent field's `V` entry holds a `Name` object with the appearance
|
||||||
// state of whichever child field is currently in the "on" state.
|
// state of whichever child field is currently in the "on" state.
|
||||||
const fieldParent = params.dict.get("Parent");
|
const fieldParent = params.dict.get("Parent");
|
||||||
if (isDict(fieldParent) && fieldParent.has("V")) {
|
if (isDict(fieldParent)) {
|
||||||
|
this.parent = params.dict.getRaw("Parent");
|
||||||
const fieldParentValue = fieldParent.get("V");
|
const fieldParentValue = fieldParent.get("V");
|
||||||
if (isName(fieldParentValue)) {
|
if (isName(fieldParentValue)) {
|
||||||
this.parent = params.dict.getRaw("Parent");
|
|
||||||
this.data.fieldValue = this._decodeFormValue(fieldParentValue);
|
this.data.fieldValue = this._decodeFormValue(fieldParentValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2318,6 +2318,68 @@ describe("annotation", function () {
|
|||||||
}, done.fail);
|
}, done.fail);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should save radio buttons without a field value", function (done) {
|
||||||
|
const appearanceStatesDict = new Dict();
|
||||||
|
const normalAppearanceDict = new Dict();
|
||||||
|
|
||||||
|
normalAppearanceDict.set("Checked", Ref.get(314, 0));
|
||||||
|
normalAppearanceDict.set("Off", Ref.get(271, 0));
|
||||||
|
appearanceStatesDict.set("N", normalAppearanceDict);
|
||||||
|
|
||||||
|
buttonWidgetDict.set("Ff", AnnotationFieldFlag.RADIO);
|
||||||
|
buttonWidgetDict.set("AP", appearanceStatesDict);
|
||||||
|
|
||||||
|
const buttonWidgetRef = Ref.get(123, 0);
|
||||||
|
const parentRef = Ref.get(456, 0);
|
||||||
|
|
||||||
|
const parentDict = new Dict();
|
||||||
|
parentDict.set("Kids", [buttonWidgetRef]);
|
||||||
|
buttonWidgetDict.set("Parent", parentRef);
|
||||||
|
|
||||||
|
const xref = new XRefMock([
|
||||||
|
{ ref: buttonWidgetRef, data: buttonWidgetDict },
|
||||||
|
{ ref: parentRef, data: parentDict },
|
||||||
|
]);
|
||||||
|
|
||||||
|
parentDict.xref = xref;
|
||||||
|
buttonWidgetDict.xref = xref;
|
||||||
|
partialEvaluator.xref = xref;
|
||||||
|
const task = new WorkerTask("test save");
|
||||||
|
|
||||||
|
AnnotationFactory.create(
|
||||||
|
xref,
|
||||||
|
buttonWidgetRef,
|
||||||
|
pdfManagerMock,
|
||||||
|
idFactoryMock
|
||||||
|
)
|
||||||
|
.then(annotation => {
|
||||||
|
const annotationStorage = {};
|
||||||
|
annotationStorage[annotation.data.id] = true;
|
||||||
|
return Promise.all([
|
||||||
|
annotation,
|
||||||
|
annotation.save(partialEvaluator, task, annotationStorage),
|
||||||
|
]);
|
||||||
|
})
|
||||||
|
.then(([annotation, data]) => {
|
||||||
|
expect(data.length).toEqual(2);
|
||||||
|
const [radioData, parentData] = data;
|
||||||
|
radioData.data = radioData.data.replace(/\(D:[0-9]+\)/, "(date)");
|
||||||
|
expect(radioData.ref).toEqual(Ref.get(123, 0));
|
||||||
|
expect(radioData.data).toEqual(
|
||||||
|
"123 0 obj\n" +
|
||||||
|
"<< /Type /Annot /Subtype /Widget /FT /Btn /Ff 32768 " +
|
||||||
|
"/AP << /N << /Checked 314 0 R /Off 271 0 R>>>> " +
|
||||||
|
"/Parent 456 0 R /AS /Checked /M (date)>>\nendobj\n"
|
||||||
|
);
|
||||||
|
expect(parentData.ref).toEqual(Ref.get(456, 0));
|
||||||
|
expect(parentData.data).toEqual(
|
||||||
|
"456 0 obj\n<< /Kids [123 0 R] /V /Checked>>\nendobj\n"
|
||||||
|
);
|
||||||
|
done();
|
||||||
|
})
|
||||||
|
.catch(done.fail);
|
||||||
|
});
|
||||||
|
|
||||||
it("should save nothing", function (done) {
|
it("should save nothing", function (done) {
|
||||||
const buttonWidgetRef = Ref.get(124, 0);
|
const buttonWidgetRef = Ref.get(124, 0);
|
||||||
const xref = new XRefMock([
|
const xref = new XRefMock([
|
||||||
|
Loading…
x
Reference in New Issue
Block a user