addTextWatermark method
Implementation
Future<void> addTextWatermark(String text, {double fontSize = 48, Color color = const Color(0x33000000), double rotation = 45, List<int>? pages}) async {
final List<int> targets = pages ?? List<int>.generate(document.pageCount, (int index) => index);
for (final int index in targets) {
final UPdfPage? page = await document.page(index);
if (page == null) continue;
final double centerX = page.box.width / 2 + page.box.left;
final double centerY = page.box.height / 2 + page.box.top;
final double radians = rotation * pi / 180;
final double cosine = cos(radians);
final double sine = sin(radians);
final String escaped = String.fromCharCodes(UPdfSerializer.literalString(Uint8List.fromList(text.codeUnits)));
final StringBuffer buffer = StringBuffer()
..writeln("/GSW gs")
..writeln("BT ${_colorOperator(color, stroke: false)} /Helv ${UPdfSerializer.number(fontSize)} Tf")
..writeln(
"${UPdfSerializer.number(cosine)} ${UPdfSerializer.number(sine)} ${UPdfSerializer.number(-sine)} ${UPdfSerializer.number(cosine)} "
"${UPdfSerializer.number(centerX - text.length * fontSize * 0.25)} ${UPdfSerializer.number(centerY)} Tm",
)
..writeln("$escaped Tj")
..writeln("ET");
await appendContent(
index,
buffer.toString(),
extraResources: <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"),
}),
}),
"ExtGState": UPdfDict(<String, Object?>{
"GSW": UPdfDict(<String, Object?>{"Type": const UPdfName("ExtGState"), "ca": color.a, "CA": color.a}),
}),
},
);
}
}