parseCrossRefTable function

PdfCrossRefTable parseCrossRefTable(
  1. Uint8List data,
  2. int startOffset
)

Parse a traditional cross-reference table from bytes.

Implementation

PdfCrossRefTable parseCrossRefTable(Uint8List data, int startOffset) {
  final table = PdfCrossRefTable();
  int pos = startOffset;

  // Skip 'xref' keyword and whitespace
  while (pos < data.length &&
      (data[pos] == 0x20 || data[pos] == 0x0A || data[pos] == 0x0D)) {
    pos++;
  }

  // Read subsections
  while (pos < data.length) {
    // Check if we hit 'trailer'
    if (_matchesAt(data, pos, 'trailer')) break;

    // Read subsection header: startObj count
    final headerEnd = _findLineEnd(data, pos);
    final headerStr = String.fromCharCodes(data.sublist(pos, headerEnd)).trim();
    if (headerStr.isEmpty || headerStr.startsWith('trailer')) break;

    final parts = headerStr.split(RegExp(r'\s+'));
    if (parts.length < 2) break;

    final startObj = int.tryParse(parts[0]);
    final count = int.tryParse(parts[1]);
    if (startObj == null || count == null) break;

    pos = _skipLineEnd(data, headerEnd);

    // Read entries: each is exactly 20 bytes
    for (int i = 0; i < count && pos + 19 < data.length; i++) {
      final entryStr = String.fromCharCodes(data.sublist(pos, pos + 20)).trim();
      final entryParts = entryStr.split(RegExp(r'\s+'));
      if (entryParts.length >= 3) {
        final offset = int.tryParse(entryParts[0]) ?? 0;
        final gen = int.tryParse(entryParts[1]) ?? 0;
        final inUse = entryParts[2] == 'n';
        table.addEntry(
          startObj + i,
          CrossRefEntry(offset: offset, generation: gen, inUse: inUse),
        );
      }
      pos += 20;
    }
  }

  return table;
}