readXRefTable rewrite, progress

This commit is contained in:
Artur Adib 2012-01-31 09:01:04 -05:00
parent 0ee81516e3
commit 8068ff242d

View File

@ -287,44 +287,49 @@ var XRef = (function XRefClosure() {
XRef.prototype = { XRef.prototype = {
readXRefTable: function readXRefTable(parser) { readXRefTable: function readXRefTable(parser) {
var obj; // Example of cross-reference table:
while (true) { // xref
if (isCmd(obj = parser.getObj(), 'trailer')) // 0 1 <-- subsection header (first obj #, obj count)
break; // 0000000000 65535 f <-- actual object (offset, generation #, f/n)
if (!isInt(obj)) // 23 2 <-- subsection header ... and so on ...
// 0000025518 00002 n
// 0000025635 00000 n
// trailer
// ...
// Outer loop is over subsection headers
var first;
while (!isCmd(first = parser.getObj(), 'trailer')) {
var count = parser.getObj();
if (!isInt(first) || !isInt(count))
error('Invalid XRef table'); error('Invalid XRef table');
var first = obj;
if (!isInt(obj = parser.getObj())) // Inner loop is over objects themselves
error('Invalid XRef table'); for (var i = first; i < first + count; ++i) {
var n = obj; var entry = {};
if (first < 0 || n < 0 || (first + n) != ((first + n) | 0)) entry.offset = parser.getObj();
error('Invalid XRef table: ' + first + ', ' + n); entry.gen = parser.getObj();
for (var i = first; i < first + n; ++i) { var type = parser.getObj();
var entry = {};
if (!isInt(obj = parser.getObj())) if (type === 'f')
error('Invalid XRef table: ' + first + ', ' + n);
entry.offset = obj;
if (!isInt(obj = parser.getObj()))
error('Invalid XRef table: ' + first + ', ' + n);
entry.gen = obj;
obj = parser.getObj();
if (isCmd(obj, 'n')) {
entry.uncompressed = true;
} else if (isCmd(obj, 'f')) {
entry.free = true; entry.free = true;
} else { else if (type === 'n')
error('Invalid XRef table: ' + first + ', ' + n); entry.uncompressed = true;
// Validate entry obj
if ( !isInt(entry.offset) || !isInt(entry.gen) ||
!(('free' in entry) || ('uncompressed' in entry)) ) {
error('Invalid XRef table: ' + first + ', ' + count);
} }
if (!this.entries[i]) {
// In some buggy PDF files the xref table claims to start at 1 if (!this.entries[i])
// instead of 0.
if (i == 1 && first == 1 &&
entry.offset == 0 && entry.gen == 65535 && entry.free) {
i = first = 0;
}
this.entries[i] = entry; this.entries[i] = entry;
}
} }
// No objects added?
if (i - first <= 0)
error('Invalid XRef table: ' + first + ', ' + count);
} }
// read the trailer dictionary // read the trailer dictionary