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