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