page method

Future<UPdfPage?> page(
  1. int index
)

Implementation

Future<UPdfPage?> page(int index) async {
  if (index < 0 || index >= pageCount) return null;
  final Object? rootObject = await resolve(catalog?["Pages"]);
  UPdfDict? node = rootObject is UPdfDict ? rootObject : null;
  UPdfRef? nodeRef = catalog?["Pages"] is UPdfRef ? catalog!["Pages"]! as UPdfRef : null;
  Object? resources = node?["Resources"];
  Object? mediaBox = node?["MediaBox"];
  Object? cropBox = node?["CropBox"];
  Object? rotate = node?["Rotate"];
  int remaining = index;
  int depth = 0;
  while (node != null && depth < uDocMaxDepth) {
    depth++;
    final Object? kidsObject = await resolve(node["Kids"]);
    if (kidsObject is! List<Object?>) break;
    bool descended = false;
    for (final Object? kid in kidsObject) {
      final Object? resolved = await resolve(kid);
      if (resolved is! UPdfDict) continue;
      final Object? kidType = resolved["Type"];
      final bool isBranch = (kidType is UPdfName && kidType.value == "Pages") || resolved.has("Kids");
      final int count = isBranch ? ((await resolve(resolved["Count"]) as num?)?.toInt() ?? 0) : 1;
      if (remaining >= count) {
        remaining -= count;
        continue;
      }
      resources = resolved["Resources"] ?? resources;
      mediaBox = resolved["MediaBox"] ?? mediaBox;
      cropBox = resolved["CropBox"] ?? cropBox;
      rotate = resolved["Rotate"] ?? rotate;
      node = resolved;
      nodeRef = kid is UPdfRef ? kid : null;
      descended = true;
      if (!isBranch) return _buildPage(index, nodeRef, resolved, resources, mediaBox, cropBox, rotate);
      break;
    }
    if (!descended) break;
  }
  final List<UPdfRef> flat = await _flatPages();
  if (index < flat.length) {
    final Object? resolved = await resolve(flat[index]);
    if (resolved is UPdfDict) return _buildPage(index, flat[index], resolved, resolved["Resources"], resolved["MediaBox"], resolved["CropBox"], resolved["Rotate"]);
  }
  return null;
}