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