Merge branch 'master' of https://github.com/andreasgal/pdf.js.git into invalidpdf-1
Conflicts: test/test_manifest.json
This commit is contained in:
commit
39ba5324a7
41
crypto.js
41
crypto.js
@ -3,7 +3,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
var ARCFourCipher = (function() {
|
||||
var ARCFourCipher = (function aRCFourCipher() {
|
||||
function constructor(key) {
|
||||
this.a = 0;
|
||||
this.b = 0;
|
||||
@ -21,7 +21,7 @@ var ARCFourCipher = (function() {
|
||||
}
|
||||
|
||||
constructor.prototype = {
|
||||
encryptBlock: function(data) {
|
||||
encryptBlock: function aRCFourCipherEncryptBlock(data) {
|
||||
var i, n = data.length, tmp, tmp2;
|
||||
var a = this.a, b = this.b, s = this.s;
|
||||
var output = new Uint8Array(n);
|
||||
@ -45,7 +45,7 @@ var ARCFourCipher = (function() {
|
||||
return constructor;
|
||||
})();
|
||||
|
||||
var md5 = (function() {
|
||||
var md5 = (function md5Md5() {
|
||||
var r = new Uint8Array([
|
||||
7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
|
||||
5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
|
||||
@ -129,12 +129,12 @@ var md5 = (function() {
|
||||
return hash;
|
||||
})();
|
||||
|
||||
var NullCipher = (function() {
|
||||
var NullCipher = (function nullCipher() {
|
||||
function constructor() {
|
||||
}
|
||||
|
||||
constructor.prototype = {
|
||||
decryptBlock: function(data) {
|
||||
decryptBlock: function nullCipherDecryptBlock(data) {
|
||||
return data;
|
||||
}
|
||||
};
|
||||
@ -142,7 +142,7 @@ var NullCipher = (function() {
|
||||
return constructor;
|
||||
})();
|
||||
|
||||
var AES128Cipher = (function() {
|
||||
var AES128Cipher = (function aES128Cipher() {
|
||||
var rcon = new Uint8Array([
|
||||
0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
|
||||
0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
|
||||
@ -372,7 +372,7 @@ var AES128Cipher = (function() {
|
||||
}
|
||||
|
||||
constructor.prototype = {
|
||||
decryptBlock: function(data) {
|
||||
decryptBlock: function aES128CipherDecryptBlock(data) {
|
||||
var i, sourceLength = data.length;
|
||||
var buffer = this.buffer, bufferLength = this.bufferPosition;
|
||||
// waiting for IV values -- they are at the start of the stream
|
||||
@ -395,19 +395,21 @@ var AES128Cipher = (function() {
|
||||
return constructor;
|
||||
})();
|
||||
|
||||
var CipherTransform = (function() {
|
||||
var CipherTransform = (function cipherTransform() {
|
||||
function constructor(stringCipherConstructor, streamCipherConstructor) {
|
||||
this.stringCipherConstructor = stringCipherConstructor;
|
||||
this.streamCipherConstructor = streamCipherConstructor;
|
||||
}
|
||||
constructor.prototype = {
|
||||
createStream: function(stream) {
|
||||
createStream: function cipherTransformCreateStream(stream) {
|
||||
var cipher = new this.streamCipherConstructor();
|
||||
return new DecryptStream(stream, function(data) {
|
||||
return cipher.decryptBlock(data);
|
||||
});
|
||||
return new DecryptStream(stream,
|
||||
function cipherTransformDecryptStream(data) {
|
||||
return cipher.decryptBlock(data);
|
||||
}
|
||||
);
|
||||
},
|
||||
decryptString: function(s) {
|
||||
decryptString: function cipherTransformDecryptString(s) {
|
||||
var cipher = new this.stringCipherConstructor();
|
||||
var data = stringToBytes(s);
|
||||
data = cipher.decryptBlock(data);
|
||||
@ -417,7 +419,7 @@ var CipherTransform = (function() {
|
||||
return constructor;
|
||||
})();
|
||||
|
||||
var CipherTransformFactory = (function() {
|
||||
var CipherTransformFactory = (function cipherTransformFactory() {
|
||||
function prepareKeyData(fileId, password, ownerPassword, userPassword,
|
||||
flags, revision, keyLength, encryptMetadata) {
|
||||
var defaultPasswordBytes = new Uint8Array([
|
||||
@ -552,18 +554,18 @@ var CipherTransformFactory = (function() {
|
||||
if (cryptFilter != null)
|
||||
cfm = cryptFilter.get('CFM');
|
||||
if (!cfm || cfm.name == 'None') {
|
||||
return function() {
|
||||
return function cipherTransformFactoryBuildCipherConstructorNone() {
|
||||
return new NullCipher();
|
||||
};
|
||||
}
|
||||
if ('V2' == cfm.name) {
|
||||
return function() {
|
||||
return function cipherTransformFactoryBuildCipherConstructorV2() {
|
||||
return new ARCFourCipher(
|
||||
buildObjectKey(num, gen, key, false));
|
||||
};
|
||||
}
|
||||
if ('AESV2' == cfm.name) {
|
||||
return function() {
|
||||
return function cipherTransformFactoryBuildCipherConstructorAESV2() {
|
||||
return new AES128Cipher(
|
||||
buildObjectKey(num, gen, key, true));
|
||||
};
|
||||
@ -573,7 +575,8 @@ var CipherTransformFactory = (function() {
|
||||
}
|
||||
|
||||
constructor.prototype = {
|
||||
createCipherTransform: function(num, gen) {
|
||||
createCipherTransform: function buildCipherCreateCipherTransform(num,
|
||||
gen) {
|
||||
if (this.algorithm == 4) {
|
||||
return new CipherTransform(
|
||||
buildCipherConstructor(this.cf, this.stmf,
|
||||
@ -583,7 +586,7 @@ var CipherTransformFactory = (function() {
|
||||
}
|
||||
// algorithms 1 and 2
|
||||
var key = buildObjectKey(num, gen, this.encryptionKey, false);
|
||||
var cipherConstructor = function() {
|
||||
var cipherConstructor = function buildCipherCipherConstructor() {
|
||||
return new ARCFourCipher(key);
|
||||
};
|
||||
return new CipherTransform(cipherConstructor, cipherConstructor);
|
||||
|
43
fonts.js
43
fonts.js
@ -124,7 +124,7 @@ var serifFonts = {
|
||||
var FontLoader = {
|
||||
listeningForFontLoad: false,
|
||||
|
||||
bind: function(fonts, callback) {
|
||||
bind: function fontLoaderBind(fonts, callback) {
|
||||
function checkFontsLoaded() {
|
||||
for (var i = 0; i < objs.length; i++) {
|
||||
var fontObj = objs[i];
|
||||
@ -180,7 +180,8 @@ var FontLoader = {
|
||||
// loaded in a subdocument. It's expected that the load of |rules|
|
||||
// has already started in this (outer) document, so that they should
|
||||
// be ordered before the load in the subdocument.
|
||||
prepareFontLoadEvent: function(rules, names, objs) {
|
||||
prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
|
||||
objs) {
|
||||
/** Hack begin */
|
||||
// There's no event when a font has finished downloading so the
|
||||
// following code is a dirty hack to 'guess' when a font is
|
||||
@ -219,7 +220,7 @@ var FontLoader = {
|
||||
if (!this.listeningForFontLoad) {
|
||||
window.addEventListener(
|
||||
'message',
|
||||
function(e) {
|
||||
function fontLoaderMessage(e) {
|
||||
var fontNames = JSON.parse(e.data);
|
||||
for (var i = 0; i < objs.length; ++i) {
|
||||
var font = objs[i];
|
||||
@ -247,7 +248,7 @@ var FontLoader = {
|
||||
fontNamesArray += '"' + names[i] + '", ';
|
||||
}
|
||||
src += ' var fontNames=[' + fontNamesArray + '];\n';
|
||||
src += ' window.onload = function () {\n';
|
||||
src += ' window.onload = function fontLoaderOnload() {\n';
|
||||
src += ' parent.postMessage(JSON.stringify(fontNames), "*");\n';
|
||||
src += ' }';
|
||||
src += '</script></head><body>';
|
||||
@ -599,7 +600,7 @@ var Font = (function Font() {
|
||||
var length = glyphs.length;
|
||||
for (var n = 0; n < length; ++n)
|
||||
codes.push({ unicode: glyphs[n].unicode, code: n });
|
||||
codes.sort(function(a, b) {
|
||||
codes.sort(function fontGetRangesSort(a, b) {
|
||||
return a.unicode - b.unicode;
|
||||
});
|
||||
|
||||
@ -928,7 +929,7 @@ var Font = (function Font() {
|
||||
}
|
||||
|
||||
// Check that table are sorted by platformID then encodingID,
|
||||
records.sort(function(a, b) {
|
||||
records.sort(function fontReplaceCMapTableSort(a, b) {
|
||||
return ((a.platformID << 16) + a.encodingID) -
|
||||
((b.platformID << 16) + b.encodingID);
|
||||
});
|
||||
@ -1061,11 +1062,11 @@ var Font = (function Font() {
|
||||
var itemSize, itemDecode, itemEncode;
|
||||
if (isGlyphLocationsLong) {
|
||||
itemSize = 4;
|
||||
itemDecode = function(data, offset) {
|
||||
itemDecode = function fontItemDecodeLong(data, offset) {
|
||||
return (data[offset] << 24) | (data[offset + 1] << 16) |
|
||||
(data[offset + 2] << 8) | data[offset + 3];
|
||||
};
|
||||
itemEncode = function(data, offset, value) {
|
||||
itemEncode = function fontItemEncodeLong(data, offset, value) {
|
||||
data[offset] = (value >>> 24) & 0xFF;
|
||||
data[offset + 1] = (value >> 16) & 0xFF;
|
||||
data[offset + 2] = (value >> 8) & 0xFF;
|
||||
@ -1073,10 +1074,10 @@ var Font = (function Font() {
|
||||
};
|
||||
} else {
|
||||
itemSize = 2;
|
||||
itemDecode = function(data, offset) {
|
||||
itemDecode = function fontItemDecode(data, offset) {
|
||||
return (data[offset] << 9) | (data[offset + 1] << 1);
|
||||
};
|
||||
itemEncode = function(data, offset, value) {
|
||||
itemEncode = function fontItemEncode(data, offset, value) {
|
||||
data[offset] = (value >> 9) & 0xFF;
|
||||
data[offset + 1] = (value >> 1) & 0xFF;
|
||||
};
|
||||
@ -1323,7 +1324,7 @@ var Font = (function Font() {
|
||||
'cmap': createCMapTable(charstrings.slice(), font.glyphIds),
|
||||
|
||||
// Font header
|
||||
'head': (function() {
|
||||
'head': (function fontFieldsHead() {
|
||||
return stringToArray(
|
||||
'\x00\x01\x00\x00' + // Version number
|
||||
'\x00\x00\x10\x00' + // fontRevision
|
||||
@ -1345,7 +1346,7 @@ var Font = (function Font() {
|
||||
})(),
|
||||
|
||||
// Horizontal header
|
||||
'hhea': (function() {
|
||||
'hhea': (function fontFieldsHhea() {
|
||||
return stringToArray(
|
||||
'\x00\x01\x00\x00' + // Version number
|
||||
string16(properties.ascent) + // Typographic Ascent
|
||||
@ -1368,7 +1369,7 @@ var Font = (function Font() {
|
||||
})(),
|
||||
|
||||
// Horizontal metrics
|
||||
'hmtx': (function() {
|
||||
'hmtx': (function fontFieldsHmtx() {
|
||||
var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
|
||||
for (var i = 0; i < charstrings.length; i++) {
|
||||
hmtx += string16(charstrings[i].width) + string16(0);
|
||||
@ -1377,7 +1378,7 @@ var Font = (function Font() {
|
||||
})(),
|
||||
|
||||
// Maximum profile
|
||||
'maxp': (function() {
|
||||
'maxp': (function fontFieldsMaxp() {
|
||||
return stringToArray(
|
||||
'\x00\x00\x50\x00' + // Version number
|
||||
string16(charstrings.length + 1)); // Num of glyphs
|
||||
@ -1505,7 +1506,7 @@ var Font = (function Font() {
|
||||
* program. Some of its logic depends on the Type2 charstrings
|
||||
* structure.
|
||||
*/
|
||||
var Type1Parser = function() {
|
||||
var Type1Parser = function type1Parser() {
|
||||
/*
|
||||
* Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
|
||||
* of Plaintext Bytes. The function took a key as a parameter which can be
|
||||
@ -2033,7 +2034,7 @@ var CFFStrings = [
|
||||
|
||||
var type1Parser = new Type1Parser();
|
||||
|
||||
var CFF = function(name, file, properties) {
|
||||
var CFF = function cFF(name, file, properties) {
|
||||
// Get the data block containing glyphs and subrs informations
|
||||
var headerBlock = file.getBytes(properties.length1);
|
||||
type1Parser.extractFontHeader(headerBlock, properties);
|
||||
@ -2233,7 +2234,7 @@ CFF.prototype = {
|
||||
'names': this.createCFFIndexHeader([name]),
|
||||
|
||||
'topDict': (function topDict(self) {
|
||||
return function() {
|
||||
return function cFFWrapTopDict() {
|
||||
var header = '\x00\x01\x01\x01';
|
||||
var dict =
|
||||
'\xf8\x1b\x00' + // version
|
||||
@ -2310,7 +2311,7 @@ CFF.prototype = {
|
||||
'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
|
||||
true),
|
||||
|
||||
'private': (function(self) {
|
||||
'private': (function cFFWrapPrivate(self) {
|
||||
var data =
|
||||
'\x8b\x14' + // defaultWidth
|
||||
'\x8b\x15'; // nominalWidth
|
||||
@ -2363,7 +2364,7 @@ CFF.prototype = {
|
||||
}
|
||||
};
|
||||
|
||||
var Type2CFF = (function() {
|
||||
var Type2CFF = (function type2CFF() {
|
||||
// TODO: replace parsing code with the Type2Parser in font_utils.js
|
||||
function constructor(file, properties) {
|
||||
var bytes = file.getBytes();
|
||||
@ -2503,7 +2504,9 @@ var Type2CFF = (function() {
|
||||
}
|
||||
|
||||
// sort the array by the unicode value
|
||||
charstrings.sort(function(a, b) {return a.unicode - b.unicode});
|
||||
charstrings.sort(function type2CFFGetCharStringsSort(a, b) {
|
||||
return a.unicode - b.unicode;
|
||||
});
|
||||
return charstrings;
|
||||
},
|
||||
|
||||
|
90
pdf.js
90
pdf.js
@ -3427,8 +3427,10 @@ var Page = (function pagePage() {
|
||||
},
|
||||
get mediaBox() {
|
||||
var obj = this.inheritPageProp('MediaBox');
|
||||
return shadow(this, 'mediaBox',
|
||||
((IsArray(obj) && obj.length == 4) ? obj : null));
|
||||
// Reset invalid media box to letter size.
|
||||
if (!IsArray(obj) || obj.length !== 4)
|
||||
obj = [0, 0, 612, 792];
|
||||
return shadow(this, 'mediaBox', obj);
|
||||
},
|
||||
get view() {
|
||||
var obj = this.inheritPageProp('CropBox');
|
||||
@ -4922,7 +4924,65 @@ var CanvasGraphics = (function canvasGraphics() {
|
||||
TODO('set flatness: ' + flatness);
|
||||
},
|
||||
setGState: function canvasGraphicsSetGState(dictName) {
|
||||
TODO('set graphics state from dict: ' + dictName);
|
||||
var extGState = this.xref.fetchIfRef(this.res.get('ExtGState'));
|
||||
if (IsDict(extGState) && extGState.has(dictName.name)) {
|
||||
var gsState = this.xref.fetchIfRef(extGState.get(dictName.name));
|
||||
var self = this;
|
||||
gsState.forEach(function(key, value) {
|
||||
switch (key) {
|
||||
case 'Type':
|
||||
break;
|
||||
case 'LW':
|
||||
self.setLineWidth(value);
|
||||
break;
|
||||
case 'LC':
|
||||
self.setLineCap(value);
|
||||
break;
|
||||
case 'LJ':
|
||||
self.setLineJoin(value);
|
||||
break;
|
||||
case 'ML':
|
||||
self.setMiterLimit(value);
|
||||
break;
|
||||
case 'D':
|
||||
self.setDash(value[0], value[1]);
|
||||
break;
|
||||
case 'RI':
|
||||
self.setRenderingIntent(value);
|
||||
break;
|
||||
case 'FL':
|
||||
self.setFlatness(value);
|
||||
break;
|
||||
case 'Font':
|
||||
self.setFont(value[0], value[1]);
|
||||
break;
|
||||
case 'OP':
|
||||
case 'op':
|
||||
case 'OPM':
|
||||
case 'BG':
|
||||
case 'BG2':
|
||||
case 'UCR':
|
||||
case 'UCR2':
|
||||
case 'TR':
|
||||
case 'TR2':
|
||||
case 'HT':
|
||||
case 'SM':
|
||||
case 'SA':
|
||||
case 'BM':
|
||||
case 'SMask':
|
||||
case 'CA':
|
||||
case 'ca':
|
||||
case 'AIS':
|
||||
case 'TK':
|
||||
TODO('graphic state operator ' + key);
|
||||
break;
|
||||
default:
|
||||
warn('Unknown graphic state operator ' + key);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
save: function canvasGraphicsSave() {
|
||||
this.ctx.save();
|
||||
@ -5089,11 +5149,17 @@ var CanvasGraphics = (function canvasGraphics() {
|
||||
this.current.leading = -leading;
|
||||
},
|
||||
setFont: function canvasGraphicsSetFont(fontRef, size) {
|
||||
var font = this.xref.fetchIfRef(this.res.get('Font'));
|
||||
if (!IsDict(font))
|
||||
return;
|
||||
var font;
|
||||
// the tf command uses a name, but graphics state uses a reference
|
||||
if (IsName(fontRef)) {
|
||||
font = this.xref.fetchIfRef(this.res.get('Font'));
|
||||
if (!IsDict(font))
|
||||
return;
|
||||
|
||||
font = font.get(fontRef.name);
|
||||
font = font.get(fontRef.name);
|
||||
} else if (IsRef(fontRef)) {
|
||||
font = fontRef;
|
||||
}
|
||||
font = this.xref.fetchIfRef(font);
|
||||
if (!font)
|
||||
error('Referenced font is not found');
|
||||
@ -6572,7 +6638,7 @@ var PDFFunction = (function pDFFunction() {
|
||||
return out;
|
||||
};
|
||||
},
|
||||
constructStiched: function(fn, dict, xref) {
|
||||
constructStiched: function pDFFunctionConstructStiched(fn, dict, xref) {
|
||||
var domain = dict.get('Domain');
|
||||
var range = dict.get('Range');
|
||||
|
||||
@ -6591,8 +6657,8 @@ var PDFFunction = (function pDFFunction() {
|
||||
var bounds = dict.get('Bounds');
|
||||
var encode = dict.get('Encode');
|
||||
|
||||
this.func = function(args) {
|
||||
var clip = function(v, min, max) {
|
||||
this.func = function pDFFunctionConstructStichedFunc(args) {
|
||||
var clip = function pDFFunctionConstructStichedFuncClip(v, min, max) {
|
||||
if (v > max)
|
||||
v = max;
|
||||
else if (v < min)
|
||||
@ -6625,9 +6691,9 @@ var PDFFunction = (function pDFFunction() {
|
||||
return fns[i].func([v2]);
|
||||
};
|
||||
},
|
||||
constructPostScript: function() {
|
||||
constructPostScript: function pDFFunctionConstructPostScript() {
|
||||
TODO('unhandled type of function');
|
||||
this.func = function() {
|
||||
this.func = function pDFFunctionConstructPostScriptFunc() {
|
||||
return [255, 105, 180];
|
||||
};
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ function load() {
|
||||
|
||||
var r = new XMLHttpRequest();
|
||||
r.open('GET', manifestFile, false);
|
||||
r.onreadystatechange = function(e) {
|
||||
r.onreadystatechange = function loadOnreadystatechange(e) {
|
||||
if (r.readyState == 4) {
|
||||
log('done\n');
|
||||
manifest = JSON.parse(r.responseText);
|
||||
@ -50,7 +50,21 @@ function load() {
|
||||
r.send(null);
|
||||
}
|
||||
|
||||
function cleanup() {
|
||||
var styleSheet = document.styleSheets[0];
|
||||
if (styleSheet) {
|
||||
while (styleSheet.cssRules.length > 0)
|
||||
styleSheet.deleteRule(0);
|
||||
}
|
||||
var guard = document.getElementById('content-end');
|
||||
var body = document.body;
|
||||
while (body.lastChild !== guard)
|
||||
body.removeChild(body.lastChild);
|
||||
}
|
||||
|
||||
function nextTask() {
|
||||
cleanup();
|
||||
|
||||
if (currentTaskIdx == manifest.length) {
|
||||
return done();
|
||||
}
|
||||
@ -62,7 +76,7 @@ function nextTask() {
|
||||
var r = new XMLHttpRequest();
|
||||
r.open('GET', task.file);
|
||||
r.mozResponseType = r.responseType = 'arraybuffer';
|
||||
r.onreadystatechange = function() {
|
||||
r.onreadystatechange = function nextTaskOnreadystatechange() {
|
||||
var failure;
|
||||
if (r.readyState == 4) {
|
||||
var data = r.mozResponseArrayBuffer || r.mozResponse ||
|
||||
@ -85,11 +99,15 @@ function isLastPage(task) {
|
||||
return (task.pageNum > task.pdfDoc.numPages);
|
||||
}
|
||||
|
||||
function canvasToDataURL() {
|
||||
return canvas.toDataURL('image/png');
|
||||
}
|
||||
|
||||
function nextPage(task, loadError) {
|
||||
var failure = loadError || '';
|
||||
|
||||
if (!task.pdfDoc) {
|
||||
sendTaskResult(canvas.toDataURL('image/png'), task, failure);
|
||||
sendTaskResult(canvasToDataURL(), task, failure);
|
||||
log('done' + (failure ? ' (failed !: ' + failure + ')' : '') + '\n');
|
||||
++currentTaskIdx;
|
||||
nextTask();
|
||||
@ -133,7 +151,7 @@ function nextPage(task, loadError) {
|
||||
|
||||
page.startRendering(
|
||||
ctx,
|
||||
function(e) {
|
||||
function nextPageStartRendering(e) {
|
||||
snapshotCurrentPage(task, (!failure && e) ?
|
||||
('render : ' + e) : failure);
|
||||
}
|
||||
@ -153,13 +171,13 @@ function nextPage(task, loadError) {
|
||||
function snapshotCurrentPage(task, failure) {
|
||||
log('done, snapshotting... ');
|
||||
|
||||
sendTaskResult(canvas.toDataURL('image/png'), task, failure);
|
||||
sendTaskResult(canvasToDataURL(), task, failure);
|
||||
log('done' + (failure ? ' (failed !: ' + failure + ')' : '') + '\n');
|
||||
|
||||
// Set up the next request
|
||||
var backoff = (inFlightRequests > 0) ? inFlightRequests * 10 : 0;
|
||||
setTimeout(
|
||||
function() {
|
||||
function snapshotCurrentPageSetTimeout() {
|
||||
++task.pageNum;
|
||||
nextPage(task);
|
||||
},
|
||||
@ -208,7 +226,7 @@ function sendTaskResult(snapshot, task, failure) {
|
||||
// (The POST URI is ignored atm.)
|
||||
r.open('POST', '/submit_task_results', true);
|
||||
r.setRequestHeader('Content-Type', 'application/json');
|
||||
r.onreadystatechange = function(e) {
|
||||
r.onreadystatechange = function sendTaskResultOnreadystatechange(e) {
|
||||
if (r.readyState == 4) {
|
||||
inFlightRequests--;
|
||||
}
|
||||
|
105
test/pdfs/extgstate.pdf
Normal file
105
test/pdfs/extgstate.pdf
Normal file
@ -0,0 +1,105 @@
|
||||
%PDF-1.4
|
||||
%öäüß
|
||||
1 0 obj
|
||||
<<
|
||||
/Type /Catalog
|
||||
/Version /1.4
|
||||
/Pages 2 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/Type /Pages
|
||||
/Kids [3 0 R]
|
||||
/Count 1
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/Type /Page
|
||||
/MediaBox [0 0 612 792]
|
||||
/Resources 4 0 R
|
||||
/Parent 2 0 R
|
||||
/Contents 5 0 R
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/ExtGState 6 0 R
|
||||
/Font 7 0 R
|
||||
/XObject <<
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Length 8 0 R
|
||||
>>
|
||||
stream
|
||||
/GS1 gs
|
||||
/F0 12 Tf
|
||||
BT
|
||||
100 700 Td
|
||||
(I should be courier!) Tj
|
||||
ET
|
||||
50 600 m
|
||||
400 600 l
|
||||
S
|
||||
|
||||
endstream
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/GS1 9 0 R
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/F0 10 0 R
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
82
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Type /ExtGState
|
||||
/LW 10
|
||||
/LC 1
|
||||
/LJ 2
|
||||
/ML 0.3000000119
|
||||
/D [[0.0917000026 183.3300018311]
|
||||
0]
|
||||
/Font [10 0 R 36]
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Type /Font
|
||||
/Subtype /Type1
|
||||
/BaseFont /Courier
|
||||
/Encoding /WinAnsiEncoding
|
||||
>>
|
||||
endobj
|
||||
xref
|
||||
0 11
|
||||
0000000000 65535 f
|
||||
0000000015 00000 n
|
||||
0000000078 00000 n
|
||||
0000000135 00000 n
|
||||
0000000239 00000 n
|
||||
0000000304 00000 n
|
||||
0000000441 00000 n
|
||||
0000000473 00000 n
|
||||
0000000505 00000 n
|
||||
0000000523 00000 n
|
||||
0000000653 00000 n
|
||||
trailer
|
||||
<<
|
||||
/Root 1 0 R
|
||||
/ID [<BFFF29B7D1C75EC69AC080682C2AFC5B> <BFFF29B7D1C75EC69AC080682C2AFC5B>]
|
||||
/Size 11
|
||||
>>
|
||||
startxref
|
||||
749
|
||||
%%EOF
|
@ -152,6 +152,12 @@
|
||||
"rounds": 1,
|
||||
"type": "load"
|
||||
},
|
||||
{ "id": "extgstate",
|
||||
"file": "pdfs/extgstate.pdf",
|
||||
"link": false,
|
||||
"rounds": 1,
|
||||
"type": "load"
|
||||
},
|
||||
{ "id": "ibwa-bad",
|
||||
"file": "pdfs/ibwa-bad.pdf",
|
||||
"link": true,
|
||||
|
@ -14,6 +14,7 @@
|
||||
<body onload="load();">
|
||||
<pre style="width:800; height:800; overflow: scroll;"id="stdout"></pre>
|
||||
<p>Inflight requests: <span id="inFlightCount"></span></p>
|
||||
<div id="content-end"><!-- cleanup() guard --></div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
Loading…
Reference in New Issue
Block a user