protected internal void RebuildXref() {
hybridXref = false;
newXrefType = false;
tokens.Seek(0);
int[][] xr = new int[1024][];
int top = 0;
trailer = null;
byte[] line = new byte[64];
for (;;) {
int pos = tokens.FilePointer;
if (!tokens.ReadLineSegment(line))
break;
if (line[0] == 't') {
if (!PdfEncodings.ConvertToString(line, null).StartsWith("trailer"))
continue;
tokens.Seek(pos);
tokens.NextToken();
pos = tokens.FilePointer;
try {
PdfDictionary dic = (PdfDictionary)ReadPRObject();
if (dic.Get(PdfName.ROOT) != null)
trailer = dic;
else
tokens.Seek(pos);
}
catch {
tokens.Seek(pos);
}
}
else if (line[0] >= '0' && line[0] <= '9') {
int[] obj = PRTokeniser.CheckObjectStart(line);
if (obj == null)
continue;
int num = obj[0];
int gen = obj[1];
if (num >= xr.Length) {
int newLength = num * 2;
int[][] xr2 = new int[newLength][];
Array.Copy(xr, 0, xr2, 0, top);
xr = xr2;
}
if (num >= top)
top = num + 1;
if (xr[num] == null || gen >= xr[num][1]) {
obj[0] = pos;
xr[num] = obj;
}
}
}
if (trailer == null)
throw new InvalidPdfException("trailer not found.");
xref = new int[top * 2];
for (int k = 0; k < top; ++k) {
int[] obj = xr[k];
if (obj != null)
xref[k * 2] = obj[0];
}
}