parseCrossRefTable function
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;
}