readXRefTable rewrite, progress
This commit is contained in:
parent
0ee81516e3
commit
8068ff242d
71
src/obj.js
71
src/obj.js
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user