addTextWatermark method

Future<void> addTextWatermark(
  1. String text, {
  2. double fontSize = 48,
  3. Color color = const Color(0x33000000),
  4. double rotation = 45,
  5. List<int>? pages,
})

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