mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-28 23:28:16 +02:00
Merge branch 'master' of github.com:andreasgal/pdf.js into streamrewrite2
Conflicts: pdf.js
This commit is contained in:
commit
e70d4a2025
8 changed files with 702 additions and 559 deletions
120
pdf.js
120
pdf.js
|
@ -50,7 +50,7 @@ function shadow(obj, prop, value) {
|
|||
|
||||
var Stream = (function() {
|
||||
function constructor(arrayBuffer, start, length, dict) {
|
||||
this.bytes = new Uint8Array(arrayBuffer);
|
||||
this.bytes = Uint8Array(arrayBuffer);
|
||||
this.start = start || 0;
|
||||
this.pos = this.start;
|
||||
this.end = (start + length) || this.bytes.byteLength;
|
||||
|
@ -115,7 +115,7 @@ var Stream = (function() {
|
|||
var StringStream = (function() {
|
||||
function constructor(str) {
|
||||
var length = str.length;
|
||||
var bytes = new Uint8Array(length);
|
||||
var bytes = Uint8Array(length);
|
||||
for (var n = 0; n < length; ++n)
|
||||
bytes[n] = str.charCodeAt(n);
|
||||
Stream.call(this, bytes);
|
||||
|
@ -127,11 +127,11 @@ var StringStream = (function() {
|
|||
})();
|
||||
|
||||
var FlateStream = (function() {
|
||||
const codeLenCodeMap = new Uint32Array([
|
||||
const codeLenCodeMap = Uint32Array([
|
||||
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
|
||||
]);
|
||||
|
||||
const lengthDecode = new Uint32Array([
|
||||
const lengthDecode = Uint32Array([
|
||||
0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009,
|
||||
0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017,
|
||||
0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043,
|
||||
|
@ -139,7 +139,7 @@ var FlateStream = (function() {
|
|||
0x00102, 0x00102, 0x00102
|
||||
]);
|
||||
|
||||
const distDecode = new Uint32Array([
|
||||
const distDecode = Uint32Array([
|
||||
0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009,
|
||||
0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061,
|
||||
0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401,
|
||||
|
@ -147,7 +147,7 @@ var FlateStream = (function() {
|
|||
0xd4001, 0xd6001
|
||||
]);
|
||||
|
||||
const fixedLitCodeTab = [new Uint32Array([
|
||||
const fixedLitCodeTab = [Uint32Array([
|
||||
0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030,
|
||||
0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080,
|
||||
0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114,
|
||||
|
@ -224,7 +224,7 @@ var FlateStream = (function() {
|
|||
0x900ff
|
||||
]), 9];
|
||||
|
||||
const fixedDistCodeTab = [new Uint32Array([
|
||||
const fixedDistCodeTab = [Uint32Array([
|
||||
0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c,
|
||||
0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016,
|
||||
0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005,
|
||||
|
@ -311,7 +311,7 @@ var FlateStream = (function() {
|
|||
var size = 512;
|
||||
while (size < requested)
|
||||
size <<= 1;
|
||||
var buffer2 = new Uint8Array(size);
|
||||
var buffer2 = Uint8Array(size);
|
||||
for (var i = 0; i < current; ++i)
|
||||
buffer2[i] = buffer[i];
|
||||
return this.buffer = buffer2;
|
||||
|
@ -373,7 +373,7 @@ var FlateStream = (function() {
|
|||
|
||||
// build the table
|
||||
var size = 1 << maxLen;
|
||||
var codes = new Uint32Array(size);
|
||||
var codes = Uint32Array(size);
|
||||
for (var len = 1, code = 0, skip = 2;
|
||||
len <= maxLen;
|
||||
++len, code <<= 1, skip <<= 1) {
|
||||
|
@ -608,7 +608,7 @@ var PredictorStream = (function() {
|
|||
|
||||
var DecryptStream = (function() {
|
||||
function constructor(str, fileKey, encAlgorithm, keyLength) {
|
||||
// TODO
|
||||
TODO("decrypt stream is not implemented");
|
||||
}
|
||||
|
||||
constructor.prototype = Stream.prototype;
|
||||
|
@ -1394,31 +1394,25 @@ var XRef = (function() {
|
|||
var length = streamParameters.get("Length");
|
||||
var byteWidths = streamParameters.get("W");
|
||||
var range = streamParameters.get("Index");
|
||||
if (!range) {
|
||||
if (!range)
|
||||
range = [0, streamParameters.get("Size")];
|
||||
}
|
||||
var i, j;
|
||||
while (range.length > 0) {
|
||||
var first = range[0], n = range[1];
|
||||
if (!IsInt(first) || !IsInt(n)) {
|
||||
if (!IsInt(first) || !IsInt(n))
|
||||
error("Invalid XRef range fields");
|
||||
}
|
||||
var typeFieldWidth = byteWidths[0], offsetFieldWidth = byteWidths[1], generationFieldWidth = byteWidths[2];
|
||||
if (!IsInt(typeFieldWidth) || !IsInt(offsetFieldWidth) || !IsInt(generationFieldWidth)) {
|
||||
if (!IsInt(typeFieldWidth) || !IsInt(offsetFieldWidth) || !IsInt(generationFieldWidth))
|
||||
error("Invalid XRef entry fields length");
|
||||
}
|
||||
for (i = 0; i < n; ++i) {
|
||||
var type = 0, offset = 0, generation = 0;
|
||||
for (j = 0; j < typeFieldWidth; ++j) {
|
||||
for (j = 0; j < typeFieldWidth; ++j)
|
||||
type = (type << 8) | stream.getByte();
|
||||
}
|
||||
for (j = 0; j < offsetFieldWidth; ++j) {
|
||||
for (j = 0; j < offsetFieldWidth; ++j)
|
||||
offset = (offset << 8) | stream.getByte();
|
||||
}
|
||||
for (j = 0; j < generationFieldWidth; ++j) {
|
||||
for (j = 0; j < generationFieldWidth; ++j)
|
||||
generation = (generation << 8) | stream.getByte();
|
||||
}
|
||||
var entry = { offset: offset, gen: generation };
|
||||
var entry = new Ref(offset, generation);
|
||||
if (typeFieldWidth > 0) {
|
||||
switch (type) {
|
||||
case 0:
|
||||
|
@ -1434,16 +1428,14 @@ var XRef = (function() {
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (!this.entries[first + i]) {
|
||||
if (!this.entries[first + i])
|
||||
this.entries[first + i] = entry;
|
||||
}
|
||||
}
|
||||
range.splice(0, 2);
|
||||
}
|
||||
var prev = streamParameters.get("Prev");
|
||||
if (IsInt(prev)) {
|
||||
if (IsInt(prev))
|
||||
this.readXRef(prev);
|
||||
}
|
||||
return streamParameters;
|
||||
},
|
||||
readXRef: function(startXRef) {
|
||||
|
@ -1484,11 +1476,12 @@ var XRef = (function() {
|
|||
|
||||
e = this.getEntry(num);
|
||||
var gen = ref.gen;
|
||||
var stream, parser;
|
||||
if (e.uncompressed) {
|
||||
if (e.gen != gen)
|
||||
throw("inconsistent generation in XRef");
|
||||
var stream = this.stream.makeSubStream(e.offset);
|
||||
var parser = new Parser(new Lexer(stream), true, this);
|
||||
stream = this.stream.makeSubStream(e.offset);
|
||||
parser = new Parser(new Lexer(stream), true, this);
|
||||
var obj1 = parser.getObj();
|
||||
var obj2 = parser.getObj();
|
||||
var obj3 = parser.getObj();
|
||||
|
@ -1512,7 +1505,39 @@ var XRef = (function() {
|
|||
this.cache[num] = e;
|
||||
return e;
|
||||
}
|
||||
error("compressed entry");
|
||||
// compressed entry
|
||||
stream = this.fetch(new Ref(e.offset, 0));
|
||||
if (!IsStream(stream))
|
||||
error("bad ObjStm stream");
|
||||
var first = stream.parameters.get("First");
|
||||
var n = stream.parameters.get("N");
|
||||
if (!IsInt(first) || !IsInt(n)) {
|
||||
error("invalid first and n parameters for ObjStm stream");
|
||||
}
|
||||
parser = new Parser(new Lexer(stream), false);
|
||||
var i, entries = [], nums = [];
|
||||
// read the object numbers to populate cache
|
||||
for (i = 0; i < n; ++i) {
|
||||
var num = parser.getObj();
|
||||
if (!IsInt(num)) {
|
||||
error("invalid object number in the ObjStm stream");
|
||||
}
|
||||
nums.push(num);
|
||||
var offset = parser.getObj();
|
||||
if (!IsInt(offset)) {
|
||||
error("invalid object offset in the ObjStm stream");
|
||||
}
|
||||
}
|
||||
// read stream objects for cache
|
||||
for (i = 0; i < n; ++i) {
|
||||
entries.push(parser.getObj());
|
||||
this.cache[nums[i]] = entries[i];
|
||||
}
|
||||
e = entries[e.gen];
|
||||
if (!e) {
|
||||
error("bad XRef entry for compressed object");
|
||||
}
|
||||
return e;
|
||||
},
|
||||
getCatalogObj: function() {
|
||||
return this.fetch(this.root);
|
||||
|
@ -1543,20 +1568,39 @@ var Page = (function() {
|
|||
: null));
|
||||
},
|
||||
compile: function(gfx, fonts) {
|
||||
if (!this.code) {
|
||||
var xref = this.xref;
|
||||
var content = xref.fetchIfRef(this.content);
|
||||
var resources = xref.fetchIfRef(this.resources);
|
||||
this.code = gfx.compile(content, xref, resources, fonts);
|
||||
if (this.code) {
|
||||
// content was compiled
|
||||
return;
|
||||
}
|
||||
var xref = this.xref;
|
||||
var content;
|
||||
var resources = xref.fetchIfRef(this.resources);
|
||||
if (!IsArray(this.content)) {
|
||||
// content is not an array, shortcut
|
||||
content = xref.fetchIfRef(this.content);
|
||||
this.code = gfx.compile(content, xref, resources, fonts);
|
||||
return;
|
||||
}
|
||||
// the content is an array, compiling all items
|
||||
var i, n = this.content.length, compiledItems = [];
|
||||
for (i = 0; i < n; ++i) {
|
||||
content = xref.fetchIfRef(this.content[i]);
|
||||
compiledItems.push(gfx.compile(content, xref, resources, fonts));
|
||||
}
|
||||
// creating the function that executes all compiled items
|
||||
this.code = function(gfx) {
|
||||
var i, n = compiledItems.length;
|
||||
for (i = 0; i < n; ++i) {
|
||||
compiledItems[i](gfx);
|
||||
}
|
||||
};
|
||||
},
|
||||
display: function(gfx) {
|
||||
assert(this.code instanceof Function, "page content must be compiled first");
|
||||
var xref = this.xref;
|
||||
var content = xref.fetchIfRef(this.content);
|
||||
var resources = xref.fetchIfRef(this.resources);
|
||||
var mediaBox = xref.fetchIfRef(this.mediaBox);
|
||||
assertWellFormed(IsStream(content) && IsDict(resources),
|
||||
"invalid page content or resources");
|
||||
assertWellFormed(IsDict(resources), "invalid page resources");
|
||||
gfx.beginDrawing({ x: mediaBox[0], y: mediaBox[1],
|
||||
width: mediaBox[2] - mediaBox[0],
|
||||
height: mediaBox[3] - mediaBox[1] });
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue