setFieldValue method

Future<bool> setFieldValue(
  1. UPdfFormField field,
  2. Object? value
)

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;
}