pageLabel method

Future<String?> pageLabel(
  1. int index
)

Implementation

Future<String?> pageLabel(int index) async {
  final List<String>? cached = _pageLabels;
  if (cached != null) return index < cached.length ? cached[index] : null;
  final Object? labels = await resolve(catalog?["PageLabels"]);
  if (labels is! UPdfDict) {
    _pageLabels = const <String>[];
    return null;
  }
  final List<String> out = List<String>.filled(pageCount, "");
  final Object? numbers = await resolve(labels["Nums"]);
  final List<int> starts = <int>[];
  final List<UPdfDict> specs = <UPdfDict>[];
  if (numbers is List<Object?>) {
    for (int i = 0; i + 1 < numbers.length; i += 2) {
      final Object? key = await resolve(numbers[i]);
      final Object? spec = await resolve(numbers[i + 1]);
      if (key is num && spec is UPdfDict) {
        starts.add(key.toInt());
        specs.add(spec);
      }
    }
  }
  for (int i = 0; i < starts.length; i++) {
    final int from = starts[i];
    final int to = i + 1 < starts.length ? starts[i + 1] : pageCount;
    final UPdfDict spec = specs[i];
    final Object? styleObject = spec["S"];
    final String style = styleObject is UPdfName ? styleObject.value : "";
    final Object? prefixObject = await resolve(spec["P"]);
    final String prefix = prefixObject is UPdfString ? prefixObject.text : "";
    final Object? startObject = await resolve(spec["St"]);
    final int start = startObject is num ? startObject.toInt() : 1;
    for (int p = from; p < to && p < pageCount; p++) {
      if (p < 0) continue;
      final int value = start + (p - from);
      out[p] = "$prefix${_labelNumber(value, style)}";
    }
  }
  _pageLabels = out;
  return index < out.length ? out[index] : null;
}