|
|
@ -22,7 +22,7 @@ |
|
|
|
stdFontMap, symbolsFonts, getTilingPatternIR, warn, Util, Promise, |
|
|
|
stdFontMap, symbolsFonts, getTilingPatternIR, warn, Util, Promise, |
|
|
|
RefSetCache, isRef, TextRenderingMode, CMapFactory, OPS, |
|
|
|
RefSetCache, isRef, TextRenderingMode, CMapFactory, OPS, |
|
|
|
UNSUPPORTED_FEATURES, UnsupportedManager, NormalizedUnicodes, |
|
|
|
UNSUPPORTED_FEATURES, UnsupportedManager, NormalizedUnicodes, |
|
|
|
IDENTITY_MATRIX, reverseIfRtl */ |
|
|
|
IDENTITY_MATRIX, reverseIfRtl, createPromiseCapability */ |
|
|
|
|
|
|
|
|
|
|
|
'use strict'; |
|
|
|
'use strict'; |
|
|
|
|
|
|
|
|
|
|
@ -121,13 +121,15 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
|
|
|
|
|
|
|
|
operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); |
|
|
|
operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); |
|
|
|
|
|
|
|
|
|
|
|
this.getOperatorList(xobj, (xobj.dict.get('Resources') || resources), |
|
|
|
return this.getOperatorList(xobj, |
|
|
|
operatorList, initialState); |
|
|
|
(xobj.dict.get('Resources') || resources), operatorList, initialState). |
|
|
|
|
|
|
|
then(function () { |
|
|
|
operatorList.addOp(OPS.paintFormXObjectEnd, []); |
|
|
|
operatorList.addOp(OPS.paintFormXObjectEnd, []); |
|
|
|
|
|
|
|
|
|
|
|
if (group) { |
|
|
|
if (group) { |
|
|
|
operatorList.addOp(OPS.endGroup, [groupOptions]); |
|
|
|
operatorList.addOp(OPS.endGroup, [groupOptions]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
buildPaintImageXObject: |
|
|
|
buildPaintImageXObject: |
|
|
@ -236,7 +238,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
subtype: smask.get('S').name, |
|
|
|
subtype: smask.get('S').name, |
|
|
|
backdrop: smask.get('BC') |
|
|
|
backdrop: smask.get('BC') |
|
|
|
}; |
|
|
|
}; |
|
|
|
this.buildFormXObject(resources, smaskContent, smaskOptions, |
|
|
|
return this.buildFormXObject(resources, smaskContent, smaskOptions, |
|
|
|
operatorList, stateManager.state.clone()); |
|
|
|
operatorList, stateManager.state.clone()); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
@ -245,15 +247,18 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
pattern, patternDict, |
|
|
|
pattern, patternDict, |
|
|
|
operatorList) { |
|
|
|
operatorList) { |
|
|
|
// Create an IR of the pattern code.
|
|
|
|
// Create an IR of the pattern code.
|
|
|
|
var tilingOpList = this.getOperatorList(pattern, |
|
|
|
var tilingOpList = new OperatorList(); |
|
|
|
(patternDict.get('Resources') || resources)); |
|
|
|
return this.getOperatorList(pattern, |
|
|
|
// Add the dependencies to the parent operator list so they are resolved
|
|
|
|
(patternDict.get('Resources') || resources), tilingOpList). |
|
|
|
// before sub operator list is executed synchronously.
|
|
|
|
then(function () { |
|
|
|
|
|
|
|
// Add the dependencies to the parent operator list so they are
|
|
|
|
|
|
|
|
// resolved before sub operator list is executed synchronously.
|
|
|
|
operatorList.addDependencies(tilingOpList.dependencies); |
|
|
|
operatorList.addDependencies(tilingOpList.dependencies); |
|
|
|
operatorList.addOp(fn, getTilingPatternIR({ |
|
|
|
operatorList.addOp(fn, getTilingPatternIR({ |
|
|
|
fnArray: tilingOpList.fnArray, |
|
|
|
fnArray: tilingOpList.fnArray, |
|
|
|
argsArray: tilingOpList.argsArray |
|
|
|
argsArray: tilingOpList.argsArray |
|
|
|
}, patternDict, args)); |
|
|
|
}, patternDict, args)); |
|
|
|
|
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
handleSetFont: |
|
|
|
handleSetFont: |
|
|
@ -266,8 +271,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
fontName = fontArgs[0].name; |
|
|
|
fontName = fontArgs[0].name; |
|
|
|
} |
|
|
|
} |
|
|
|
var self = this; |
|
|
|
var self = this; |
|
|
|
var font = this.loadFont(fontName, fontRef, this.xref, resources, |
|
|
|
return this.loadFont(fontName, fontRef, this.xref, resources, |
|
|
|
operatorList); |
|
|
|
operatorList).then(function (font) { |
|
|
|
state.font = font; |
|
|
|
state.font = font; |
|
|
|
var loadedName = font.loadedName; |
|
|
|
var loadedName = font.loadedName; |
|
|
|
if (!font.sent) { |
|
|
|
if (!font.sent) { |
|
|
@ -282,6 +287,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return loadedName; |
|
|
|
return loadedName; |
|
|
|
|
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
handleText: function PartialEvaluator_handleText(chars, state) { |
|
|
|
handleText: function PartialEvaluator_handleText(chars, state) { |
|
|
@ -324,7 +330,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
operatorList, xref, |
|
|
|
operatorList, xref, |
|
|
|
stateManager) { |
|
|
|
stateManager) { |
|
|
|
|
|
|
|
|
|
|
|
var self = this; |
|
|
|
|
|
|
|
// TODO(mack): This should be rewritten so that this function returns
|
|
|
|
// TODO(mack): This should be rewritten so that this function returns
|
|
|
|
// what should be added to the queue during each iteration
|
|
|
|
// what should be added to the queue during each iteration
|
|
|
|
function setGStateForKey(gStateObj, key, value) { |
|
|
|
function setGStateForKey(gStateObj, key, value) { |
|
|
@ -343,11 +348,14 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
gStateObj.push([key, value]); |
|
|
|
gStateObj.push([key, value]); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 'Font': |
|
|
|
case 'Font': |
|
|
|
var loadedName = self.handleSetFont(resources, null, value[0], |
|
|
|
promise = promise.then(function () { |
|
|
|
operatorList, |
|
|
|
return self.handleSetFont(resources, null, value[0], |
|
|
|
stateManager.state); |
|
|
|
operatorList, stateManager.state). |
|
|
|
|
|
|
|
then(function (loadedName) { |
|
|
|
operatorList.addDependency(loadedName); |
|
|
|
operatorList.addDependency(loadedName); |
|
|
|
gStateObj.push([key, [loadedName, value[1]]]); |
|
|
|
gStateObj.push([key, [loadedName, value[1]]]); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 'BM': |
|
|
|
case 'BM': |
|
|
|
gStateObj.push([key, value]); |
|
|
|
gStateObj.push([key, value]); |
|
|
@ -359,7 +367,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
var dict = xref.fetchIfRef(value); |
|
|
|
var dict = xref.fetchIfRef(value); |
|
|
|
if (isDict(dict)) { |
|
|
|
if (isDict(dict)) { |
|
|
|
self.handleSMask(dict, resources, operatorList, stateManager); |
|
|
|
promise = promise.then(function () { |
|
|
|
|
|
|
|
return self.handleSMask(dict, resources, operatorList, |
|
|
|
|
|
|
|
stateManager); |
|
|
|
|
|
|
|
}); |
|
|
|
gStateObj.push([key, true]); |
|
|
|
gStateObj.push([key, true]); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
warn('Unsupported SMask type'); |
|
|
|
warn('Unsupported SMask type'); |
|
|
@ -394,12 +405,15 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
// This array holds the converted/processed state data.
|
|
|
|
// This array holds the converted/processed state data.
|
|
|
|
var gStateObj = []; |
|
|
|
var gStateObj = []; |
|
|
|
var gStateMap = gState.map; |
|
|
|
var gStateMap = gState.map; |
|
|
|
|
|
|
|
var self = this; |
|
|
|
|
|
|
|
var promise = Promise.resolve(); |
|
|
|
for (var key in gStateMap) { |
|
|
|
for (var key in gStateMap) { |
|
|
|
var value = gStateMap[key]; |
|
|
|
var value = gStateMap[key]; |
|
|
|
setGStateForKey(gStateObj, key, value); |
|
|
|
setGStateForKey(gStateObj, key, value); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return promise.then(function () { |
|
|
|
operatorList.addOp(OPS.setGState, [gStateObj]); |
|
|
|
operatorList.addOp(OPS.setGState, [gStateObj]); |
|
|
|
|
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
loadFont: function PartialEvaluator_loadFont(fontName, font, xref, |
|
|
|
loadFont: function PartialEvaluator_loadFont(fontName, font, xref, |
|
|
@ -407,10 +421,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
parentOperatorList) { |
|
|
|
parentOperatorList) { |
|
|
|
|
|
|
|
|
|
|
|
function errorFont() { |
|
|
|
function errorFont() { |
|
|
|
return { |
|
|
|
return Promise.resolve({ |
|
|
|
translated: new ErrorFont('Font ' + fontName + ' is not available'), |
|
|
|
translated: new ErrorFont('Font ' + fontName + ' is not available'), |
|
|
|
loadedName: 'g_font_error' |
|
|
|
loadedName: 'g_font_error' |
|
|
|
}; |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var fontRef; |
|
|
|
var fontRef; |
|
|
@ -435,6 +449,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
return errorFont(); |
|
|
|
return errorFont(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var fontCapability = createPromiseCapability(); |
|
|
|
|
|
|
|
|
|
|
|
var preEvaluatedFont = this.preEvaluateFont(font, xref); |
|
|
|
var preEvaluatedFont = this.preEvaluateFont(font, xref); |
|
|
|
var descriptor = preEvaluatedFont.descriptor; |
|
|
|
var descriptor = preEvaluatedFont.descriptor; |
|
|
|
var fontID = fontRef.num + '_' + fontRef.gen; |
|
|
|
var fontID = fontRef.num + '_' + fontRef.gen; |
|
|
@ -471,7 +487,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
// fontName in font.loadedName below.
|
|
|
|
// fontName in font.loadedName below.
|
|
|
|
var fontRefIsDict = isDict(fontRef); |
|
|
|
var fontRefIsDict = isDict(fontRef); |
|
|
|
if (!fontRefIsDict) { |
|
|
|
if (!fontRefIsDict) { |
|
|
|
this.fontCache.put(fontRef, font); |
|
|
|
this.fontCache.put(fontRef, fontCapability.promise); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Keep track of each font we translated so the caller can
|
|
|
|
// Keep track of each font we translated so the caller can
|
|
|
@ -490,27 +506,38 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
font.translated = translated; |
|
|
|
font.translated = translated; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var loadCharProcsPromise = Promise.resolve(); |
|
|
|
if (font.translated.loadCharProcs) { |
|
|
|
if (font.translated.loadCharProcs) { |
|
|
|
var charProcs = font.get('CharProcs').getAll(); |
|
|
|
var charProcs = font.get('CharProcs').getAll(); |
|
|
|
var fontResources = (font.get('Resources') || resources); |
|
|
|
var fontResources = (font.get('Resources') || resources); |
|
|
|
var charProcKeys = Object.keys(charProcs); |
|
|
|
var charProcKeys = Object.keys(charProcs); |
|
|
|
var charProcOperatorList = {}; |
|
|
|
var charProcOperatorList = {}; |
|
|
|
for (var i = 0, n = charProcKeys.length; i < n; ++i) { |
|
|
|
for (var i = 0, n = charProcKeys.length; i < n; ++i) { |
|
|
|
var key = charProcKeys[i]; |
|
|
|
loadCharProcsPromise = loadCharProcsPromise.then(function (key) { |
|
|
|
var glyphStream = charProcs[key]; |
|
|
|
var glyphStream = charProcs[key]; |
|
|
|
var operatorList = this.getOperatorList(glyphStream, fontResources); |
|
|
|
var operatorList = new OperatorList(); |
|
|
|
|
|
|
|
return this.getOperatorList(glyphStream, fontResources, |
|
|
|
|
|
|
|
operatorList). |
|
|
|
|
|
|
|
then(function () { |
|
|
|
charProcOperatorList[key] = operatorList.getIR(); |
|
|
|
charProcOperatorList[key] = operatorList.getIR(); |
|
|
|
if (!parentOperatorList) { |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// Add the dependencies to the parent operator list so they are
|
|
|
|
// Add the dependencies to the parent operator list so they are
|
|
|
|
// resolved before sub operator list is executed synchronously.
|
|
|
|
// resolved before sub operator list is executed synchronously.
|
|
|
|
parentOperatorList.addDependencies(charProcOperatorList.dependencies); |
|
|
|
if (parentOperatorList) { |
|
|
|
|
|
|
|
parentOperatorList.addDependencies(operatorList.dependencies); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
}.bind(this, charProcKeys[i])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
loadCharProcsPromise = loadCharProcsPromise.then(function () { |
|
|
|
font.translated.charProcOperatorList = charProcOperatorList; |
|
|
|
font.translated.charProcOperatorList = charProcOperatorList; |
|
|
|
|
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return loadCharProcsPromise.then(function () { |
|
|
|
font.loaded = true; |
|
|
|
font.loaded = true; |
|
|
|
return font; |
|
|
|
fontCapability.resolve(font); |
|
|
|
|
|
|
|
return fontCapability.promise; |
|
|
|
|
|
|
|
}, fontCapability.reject); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { |
|
|
|
buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { |
|
|
@ -534,19 +561,20 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
var xref = this.xref; |
|
|
|
var xref = this.xref; |
|
|
|
var imageCache = {}; |
|
|
|
var imageCache = {}; |
|
|
|
|
|
|
|
|
|
|
|
operatorList = (operatorList || new OperatorList()); |
|
|
|
assert(operatorList); |
|
|
|
|
|
|
|
|
|
|
|
resources = (resources || Dict.empty); |
|
|
|
resources = (resources || Dict.empty); |
|
|
|
var xobjs = (resources.get('XObject') || Dict.empty); |
|
|
|
var xobjs = (resources.get('XObject') || Dict.empty); |
|
|
|
var patterns = (resources.get('Pattern') || Dict.empty); |
|
|
|
var patterns = (resources.get('Pattern') || Dict.empty); |
|
|
|
var stateManager = new StateManager(initialState || new EvalState()); |
|
|
|
var stateManager = new StateManager(initialState || new EvalState()); |
|
|
|
var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); |
|
|
|
var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); |
|
|
|
|
|
|
|
var shading; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new Promise(function next(resolve, reject) { |
|
|
|
var operation, i, ii; |
|
|
|
var operation, i, ii; |
|
|
|
while ((operation = preprocessor.read())) { |
|
|
|
while ((operation = preprocessor.read())) { |
|
|
|
var args = operation.args; |
|
|
|
var args = operation.args; |
|
|
|
var fn = operation.fn; |
|
|
|
var fn = operation.fn; |
|
|
|
var shading; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (fn | 0) { |
|
|
|
switch (fn | 0) { |
|
|
|
case OPS.setStrokeColorN: |
|
|
|
case OPS.setStrokeColorN: |
|
|
@ -564,10 +592,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
var typeNum = dict.get('PatternType'); |
|
|
|
var typeNum = dict.get('PatternType'); |
|
|
|
|
|
|
|
|
|
|
|
if (typeNum == TILING_PATTERN) { |
|
|
|
if (typeNum == TILING_PATTERN) { |
|
|
|
self.handleTilingType(fn, args, resources, pattern, dict, |
|
|
|
return self.handleTilingType(fn, args, resources, pattern, |
|
|
|
operatorList); |
|
|
|
dict, operatorList).then( |
|
|
|
args = []; |
|
|
|
function() { |
|
|
|
continue; |
|
|
|
next(resolve, reject); |
|
|
|
|
|
|
|
}, reject); |
|
|
|
} else if (typeNum == SHADING_PATTERN) { |
|
|
|
} else if (typeNum == SHADING_PATTERN) { |
|
|
|
shading = dict.get('Shading'); |
|
|
|
shading = dict.get('Shading'); |
|
|
|
var matrix = dict.get('Matrix'); |
|
|
|
var matrix = dict.get('Matrix'); |
|
|
@ -575,7 +604,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
resources); |
|
|
|
resources); |
|
|
|
args = pattern.getIR(); |
|
|
|
args = pattern.getIR(); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
error('Unkown PatternType ' + typeNum); |
|
|
|
error('Unknown PatternType ' + typeNum); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
@ -601,11 +630,13 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
|
|
|
|
|
|
|
|
if ('Form' == type.name) { |
|
|
|
if ('Form' == type.name) { |
|
|
|
stateManager.save(); |
|
|
|
stateManager.save(); |
|
|
|
self.buildFormXObject(resources, xobj, null, operatorList, |
|
|
|
return self.buildFormXObject(resources, xobj, null, |
|
|
|
stateManager.state.clone()); |
|
|
|
operatorList, |
|
|
|
args = []; |
|
|
|
stateManager.state.clone()). |
|
|
|
|
|
|
|
then(function () { |
|
|
|
stateManager.restore(); |
|
|
|
stateManager.restore(); |
|
|
|
continue; |
|
|
|
next(resolve, reject); |
|
|
|
|
|
|
|
}, reject); |
|
|
|
} else if ('Image' == type.name) { |
|
|
|
} else if ('Image' == type.name) { |
|
|
|
self.buildPaintImageXObject(resources, xobj, false, |
|
|
|
self.buildPaintImageXObject(resources, xobj, false, |
|
|
|
operatorList, name, imageCache); |
|
|
|
operatorList, name, imageCache); |
|
|
@ -617,13 +648,15 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case OPS.setFont: |
|
|
|
case OPS.setFont: |
|
|
|
|
|
|
|
var fontSize = args[1]; |
|
|
|
// eagerly collect all fonts
|
|
|
|
// eagerly collect all fonts
|
|
|
|
var loadedName = self.handleSetFont(resources, args, null, |
|
|
|
return self.handleSetFont(resources, args, null, |
|
|
|
operatorList, |
|
|
|
operatorList, stateManager.state). |
|
|
|
stateManager.state); |
|
|
|
then(function (loadedName) { |
|
|
|
operatorList.addDependency(loadedName); |
|
|
|
operatorList.addDependency(loadedName); |
|
|
|
args[0] = loadedName; |
|
|
|
operatorList.addOp(OPS.setFont, [loadedName, fontSize]); |
|
|
|
break; |
|
|
|
next(resolve, reject); |
|
|
|
|
|
|
|
}, reject); |
|
|
|
case OPS.endInlineImage: |
|
|
|
case OPS.endInlineImage: |
|
|
|
var cacheKey = args[0].cacheKey; |
|
|
|
var cacheKey = args[0].cacheKey; |
|
|
|
if (cacheKey && imageCache.key === cacheKey) { |
|
|
|
if (cacheKey && imageCache.key === cacheKey) { |
|
|
@ -636,22 +669,22 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
args = []; |
|
|
|
args = []; |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
case OPS.showText: |
|
|
|
case OPS.showText: |
|
|
|
args[0] = this.handleText(args[0], stateManager.state); |
|
|
|
args[0] = self.handleText(args[0], stateManager.state); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case OPS.showSpacedText: |
|
|
|
case OPS.showSpacedText: |
|
|
|
var arr = args[0]; |
|
|
|
var arr = args[0]; |
|
|
|
var arrLength = arr.length; |
|
|
|
var arrLength = arr.length; |
|
|
|
for (i = 0; i < arrLength; ++i) { |
|
|
|
for (i = 0; i < arrLength; ++i) { |
|
|
|
if (isString(arr[i])) { |
|
|
|
if (isString(arr[i])) { |
|
|
|
arr[i] = this.handleText(arr[i], stateManager.state); |
|
|
|
arr[i] = self.handleText(arr[i], stateManager.state); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case OPS.nextLineShowText: |
|
|
|
case OPS.nextLineShowText: |
|
|
|
args[0] = this.handleText(args[0], stateManager.state); |
|
|
|
args[0] = self.handleText(args[0], stateManager.state); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case OPS.nextLineSetSpacingShowText: |
|
|
|
case OPS.nextLineSetSpacingShowText: |
|
|
|
args[2] = this.handleText(args[2], stateManager.state); |
|
|
|
args[2] = self.handleText(args[2], stateManager.state); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case OPS.setTextRenderingMode: |
|
|
|
case OPS.setTextRenderingMode: |
|
|
|
stateManager.state.textRenderingMode = args[0]; |
|
|
|
stateManager.state.textRenderingMode = args[0]; |
|
|
@ -687,10 +720,10 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var gState = extGState.get(dictName.name); |
|
|
|
var gState = extGState.get(dictName.name); |
|
|
|
self.setGState(resources, gState, operatorList, xref, |
|
|
|
return self.setGState(resources, gState, operatorList, xref, |
|
|
|
stateManager); |
|
|
|
stateManager).then(function() { |
|
|
|
args = []; |
|
|
|
next(resolve, reject); |
|
|
|
continue; |
|
|
|
}, reject); |
|
|
|
case OPS.moveTo: |
|
|
|
case OPS.moveTo: |
|
|
|
case OPS.lineTo: |
|
|
|
case OPS.lineTo: |
|
|
|
case OPS.curveTo: |
|
|
|
case OPS.curveTo: |
|
|
@ -702,14 +735,13 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
operatorList.addOp(fn, args); |
|
|
|
operatorList.addOp(fn, args); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Some PDFs don't close all restores inside object/form.
|
|
|
|
// Some PDFs don't close all restores inside object/form.
|
|
|
|
// Closing those for them.
|
|
|
|
// Closing those for them.
|
|
|
|
for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { |
|
|
|
for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { |
|
|
|
operatorList.addOp(OPS.restore, []); |
|
|
|
operatorList.addOp(OPS.restore, []); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
resolve(); |
|
|
|
return operatorList; |
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getTextContent: function PartialEvaluator_getTextContent(stream, resources, |
|
|
|
getTextContent: function PartialEvaluator_getTextContent(stream, resources, |
|
|
@ -767,10 +799,13 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function handleSetFont(fontName, fontRef) { |
|
|
|
function handleSetFont(fontName, fontRef) { |
|
|
|
var font = textState.font = self.loadFont(fontName, fontRef, xref, |
|
|
|
return self.loadFont(fontName, fontRef, xref, resources, null). |
|
|
|
resources, null).translated; |
|
|
|
then(function (font) { |
|
|
|
textState.fontMatrix = font.fontMatrix ? font.fontMatrix : |
|
|
|
var fontTranslated = textState.font = font.translated; |
|
|
|
|
|
|
|
textState.fontMatrix = fontTranslated.fontMatrix ? |
|
|
|
|
|
|
|
fontTranslated.fontMatrix : |
|
|
|
FONT_IDENTITY_MATRIX; |
|
|
|
FONT_IDENTITY_MATRIX; |
|
|
|
|
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function buildTextGeometry(chars, textChunk) { |
|
|
|
function buildTextGeometry(chars, textChunk) { |
|
|
@ -865,15 +900,17 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
return textChunk; |
|
|
|
return textChunk; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new Promise(function next(resolve, reject) { |
|
|
|
while ((operation = preprocessor.read())) { |
|
|
|
while ((operation = preprocessor.read())) { |
|
|
|
textState = stateManager.state; |
|
|
|
textState = stateManager.state; |
|
|
|
var fn = operation.fn; |
|
|
|
var fn = operation.fn; |
|
|
|
var args = operation.args; |
|
|
|
var args = operation.args; |
|
|
|
switch (fn | 0) { |
|
|
|
switch (fn | 0) { |
|
|
|
case OPS.setFont: |
|
|
|
case OPS.setFont: |
|
|
|
handleSetFont(args[0].name); |
|
|
|
|
|
|
|
textState.fontSize = args[1]; |
|
|
|
textState.fontSize = args[1]; |
|
|
|
break; |
|
|
|
return handleSetFont(args[0].name).then(function() { |
|
|
|
|
|
|
|
next(resolve, reject); |
|
|
|
|
|
|
|
}, reject); |
|
|
|
case OPS.setTextRise: |
|
|
|
case OPS.setTextRise: |
|
|
|
textState.textRise = args[0]; |
|
|
|
textState.textRise = args[0]; |
|
|
|
break; |
|
|
|
break; |
|
|
@ -926,7 +963,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
textState.translateTextMatrix(offset, 0); |
|
|
|
textState.translateTextMatrix(offset, 0); |
|
|
|
textChunk.width += offset; |
|
|
|
textChunk.width += offset; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
offset = -val * textState.fontSize * textState.textMatrix[3]; |
|
|
|
offset = -val * textState.fontSize * |
|
|
|
|
|
|
|
textState.textMatrix[3]; |
|
|
|
textState.translateTextMatrix(0, offset); |
|
|
|
textState.translateTextMatrix(0, offset); |
|
|
|
textChunk.height += offset; |
|
|
|
textChunk.height += offset; |
|
|
|
} |
|
|
|
} |
|
|
@ -998,18 +1036,18 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
stateManager.transform(matrix); |
|
|
|
stateManager.transform(matrix); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var formTextContent = this.getTextContent( |
|
|
|
return self.getTextContent(xobj, |
|
|
|
xobj, |
|
|
|
xobj.dict.get('Resources') || resources, stateManager). |
|
|
|
xobj.dict.get('Resources') || resources, |
|
|
|
then(function (formTextContent) { |
|
|
|
stateManager |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
Util.concatenateToArray(bidiTexts, formTextContent.items); |
|
|
|
Util.concatenateToArray(bidiTexts, formTextContent.items); |
|
|
|
Util.extendObj(textContent.styles, formTextContent.styles); |
|
|
|
Util.extendObj(textContent.styles, formTextContent.styles); |
|
|
|
stateManager.restore(); |
|
|
|
stateManager.restore(); |
|
|
|
|
|
|
|
|
|
|
|
xobjsCache.key = name; |
|
|
|
xobjsCache.key = name; |
|
|
|
xobjsCache.texts = formTextContent; |
|
|
|
xobjsCache.texts = formTextContent; |
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
next(resolve, reject); |
|
|
|
|
|
|
|
}, reject); |
|
|
|
case OPS.setGState: |
|
|
|
case OPS.setGState: |
|
|
|
var dictName = args[0]; |
|
|
|
var dictName = args[0]; |
|
|
|
var extGState = resources.get('ExtGState'); |
|
|
|
var extGState = resources.get('ExtGState'); |
|
|
@ -1018,18 +1056,26 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var gsState = extGState.get(dictName.name); |
|
|
|
var gsStateMap = extGState.get(dictName.name); |
|
|
|
|
|
|
|
var gsStateFont = null; |
|
|
|
for (var i = 0; i < gsState.length; i++) { |
|
|
|
for (var key in gsStateMap) { |
|
|
|
if (gsState[i] === 'Font') { |
|
|
|
if (key === 'Font') { |
|
|
|
handleSetFont(args[0].name); |
|
|
|
assert(!gsStateFont); |
|
|
|
|
|
|
|
gsStateFont = gsStateMap[key]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (gsStateFont) { |
|
|
|
|
|
|
|
textState.fontSize = gsStateFont[1]; |
|
|
|
|
|
|
|
return handleSetFont(gsStateFont[0]).then(function() { |
|
|
|
|
|
|
|
next(resolve, reject); |
|
|
|
|
|
|
|
}, reject); |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} // switch
|
|
|
|
} // switch
|
|
|
|
} // while
|
|
|
|
} // while
|
|
|
|
|
|
|
|
|
|
|
|
return textContent; |
|
|
|
resolve(textContent); |
|
|
|
|
|
|
|
}); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
extractDataStructures: function |
|
|
|
extractDataStructures: function |
|
|
|