setFieldValue method
Implementation
Future<bool> setFieldValue(UPdfFormField field, Object? value) async {
if (field.objectNumber < 0) return false;
final Object? existing = await current(UPdfRef(field.objectNumber, 0));
if (existing is! UPdfDict) return false;
final UPdfDict widget = existing.copy();
switch (field.kind) {
case UDocFieldKind.checkBox:
case UDocFieldKind.radioButton:
final bool on = value == true || value == "Yes" || value == "On";
widget["V"] = UPdfName(on ? "Yes" : "Off");
widget["AS"] = UPdfName(on ? "Yes" : "Off");
break;
case UDocFieldKind.comboBox:
case UDocFieldKind.listBox:
case UDocFieldKind.text:
widget["V"] = _text("${value ?? ""}");
widget.entries.remove("AP");
final double height = field.rect.height <= 0 ? 14 : field.rect.height;
final double fontSize = height * 0.62;
final int appearance = allocate();
final String escaped = String.fromCharCodes(UPdfSerializer.literalString(Uint8List.fromList("${value ?? ""}".codeUnits)));
put(
appearance,
buildStream(
Uint8List.fromList(utf8.encode("/Tx BMC q BT 0 g /Helv ${UPdfSerializer.number(fontSize)} Tf 1 0 0 1 2 ${UPdfSerializer.number((height - fontSize) / 2)} Tm $escaped Tj ET Q EMC")),
extra: <String, Object?>{
"Type": const UPdfName("XObject"),
"Subtype": const UPdfName("Form"),
"FormType": 1,
"BBox": <Object?>[0, 0, field.rect.width, height],
"Resources": UPdfDict(<String, Object?>{
"Font": UPdfDict(<String, Object?>{
"Helv": UPdfDict(<String, Object?>{
"Type": const UPdfName("Font"),
"Subtype": const UPdfName("Type1"),
"BaseFont": const UPdfName("Helvetica"),
"Encoding": const UPdfName("WinAnsiEncoding"),
}),
}),
}),
},
),
);
widget["AP"] = UPdfDict(<String, Object?>{"N": UPdfRef(appearance, 0)});
break;
case UDocFieldKind.pushButton:
case UDocFieldKind.signature:
case UDocFieldKind.unknown:
return false;
}
put(field.objectNumber, widget);
await _setNeedAppearances(false);
return true;
}