updateAnnotation method

Future<bool> updateAnnotation(
  1. int pageIndex,
  2. int objectNumber, {
  3. Rect? rect,
  4. Color? color,
  5. double? opacity,
  6. String? contents,
  7. double? borderWidth,
  8. double? fontSize,
})

Implementation

Future<bool> updateAnnotation(
  int pageIndex,
  int objectNumber, {
  Rect? rect,
  Color? color,
  double? opacity,
  String? contents,
  double? borderWidth,
  double? fontSize,
}) async {
  final Object? existing = await current(UPdfRef(objectNumber, 0));
  if (existing is! UPdfDict) return false;
  final UPdfAnnotationSpec? previous = await specOf(pageIndex, objectNumber);
  if (previous == null) return false;
  final Rect target = rect ?? previous.rect;
  final Offset shift = Offset(target.left - previous.rect.left, target.top - previous.rect.top);
  final double scaleX = previous.rect.width <= 0 ? 1 : target.width / previous.rect.width;
  final double scaleY = previous.rect.height <= 0 ? 1 : target.height / previous.rect.height;
  final UPdfAnnotationSpec next = UPdfAnnotationSpec(
    style: previous.style,
    rect: target,
    quads: previous.quads
        .map(
          (Rect quad) => Rect.fromLTRB(
            target.left + (quad.left - previous.rect.left) * scaleX,
            target.top + (quad.top - previous.rect.top) * scaleY,
            target.left + (quad.right - previous.rect.left) * scaleX,
            target.top + (quad.bottom - previous.rect.top) * scaleY,
          ),
        )
        .toList(),
    inkPaths: previous.inkPaths
        .map((List<Offset> path) => path.map((Offset point) => Offset(target.left + (point.dx - previous.rect.left) * scaleX, target.top + (point.dy - previous.rect.top) * scaleY)).toList())
        .toList(),
    color: color ?? previous.color,
    borderColor: color ?? previous.borderColor,
    opacity: opacity ?? previous.opacity,
    borderWidth: borderWidth ?? previous.borderWidth,
    contents: contents ?? previous.contents,
    author: previous.author,
    fontSize: fontSize ?? previous.fontSize,
    rtl: UDocText.isRtl(contents ?? previous.contents),
  );
  final UPdfDict updated = existing.copy();
  updated["Rect"] = <Object?>[next.rect.left, next.rect.top, next.rect.right, next.rect.bottom];
  updated["M"] = UPdfEdit.dateString(DateTime.now());
  updated["C"] = <Object?>[next.color.r, next.color.g, next.color.b];
  updated["CA"] = next.opacity;
  if (contents != null) updated["Contents"] = UPdfEdit.textString(contents);
  if (next.quads.isNotEmpty) {
    final List<Object?> quadPoints = <Object?>[];
    for (final Rect quad in next.quads) {
      quadPoints.addAll(<Object?>[quad.left, quad.bottom, quad.right, quad.bottom, quad.left, quad.top, quad.right, quad.top]);
    }
    updated["QuadPoints"] = quadPoints;
  }
  if (next.inkPaths.isNotEmpty) {
    final List<Object?> inkList = <Object?>[];
    for (final List<Offset> path in next.inkPaths) {
      final List<Object?> points = <Object?>[];
      for (final Offset point in path) {
        points.addAll(<Object?>[point.dx, point.dy]);
      }
      inkList.add(points);
    }
    updated["InkList"] = inkList;
  }
  final UPdfStream? appearance = await rebuildAppearance(next);
  if (appearance != null) {
    final int number = allocate();
    this.put(number, appearance);
    updated["AP"] = UPdfDict(<String, Object?>{"N": UPdfRef(number, 0)});
  }
  this.put(objectNumber, updated);
  if (shift != Offset.zero || scaleX != 1 || scaleY != 1) return true;
  return true;
}