|
|
@ -26,6 +26,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
this.handler = handler; |
|
|
|
this.handler = handler; |
|
|
|
this.uniquePrefix = uniquePrefix; |
|
|
|
this.uniquePrefix = uniquePrefix; |
|
|
|
this.objIdCounter = 0; |
|
|
|
this.objIdCounter = 0; |
|
|
|
|
|
|
|
this.fontIdCounter = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var OP_MAP = { |
|
|
|
var OP_MAP = { |
|
|
@ -138,6 +139,35 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
PartialEvaluator.prototype = { |
|
|
|
PartialEvaluator.prototype = { |
|
|
|
|
|
|
|
loadFont: function PartialEvaluator_loadFont(fontName, font, xref, |
|
|
|
|
|
|
|
resources, dependency) { |
|
|
|
|
|
|
|
var fontRes = resources.get('Font'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(fontRes, 'fontRes not available'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
font = xref.fetchIfRef(font) || fontRes.get(fontName); |
|
|
|
|
|
|
|
assertWellFormed(isDict(font)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
++this.fontIdCounter; |
|
|
|
|
|
|
|
var loadedName = font.loadedName; |
|
|
|
|
|
|
|
if (!loadedName) { |
|
|
|
|
|
|
|
// keep track of each font we translated so the caller can
|
|
|
|
|
|
|
|
// load them asynchronously before calling display on a page
|
|
|
|
|
|
|
|
loadedName = 'font_' + this.uniquePrefix + this.fontIdCounter; |
|
|
|
|
|
|
|
font.loadedName = loadedName; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var translated; |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
translated = this.translateFont(font, xref, resources, |
|
|
|
|
|
|
|
dependency); |
|
|
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
|
|
translated = { error: e }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
font.translated = translated; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return font; |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getOperatorList: function PartialEvaluator_getOperatorList(stream, |
|
|
|
getOperatorList: function PartialEvaluator_getOperatorList(stream, |
|
|
|
resources, |
|
|
|
resources, |
|
|
|
dependency, |
|
|
|
dependency, |
|
|
@ -160,45 +190,35 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function handleSetFont(fontName, font) { |
|
|
|
function handleSetFont(fontName, font) { |
|
|
|
var loadedName = null; |
|
|
|
font = self.loadFont(fontName, font, xref, resources, dependency); |
|
|
|
|
|
|
|
|
|
|
|
var fontRes = resources.get('Font'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(fontRes, 'fontRes not available'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
font = xref.fetchIfRef(font) || fontRes.get(fontName); |
|
|
|
|
|
|
|
assertWellFormed(isDict(font)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
++self.objIdCounter; |
|
|
|
var loadedName = font.loadedName; |
|
|
|
if (!font.loadedName) { |
|
|
|
if (!font.sent) { |
|
|
|
var translated = self.translateFont(font, xref, resources, |
|
|
|
var data = font.translated; |
|
|
|
dependency); |
|
|
|
if (data.loadCharProcs) { |
|
|
|
if (translated) { |
|
|
|
delete data.loadCharProcs; |
|
|
|
// keep track of each font we translated so the caller can
|
|
|
|
|
|
|
|
// load them asynchronously before calling display on a page
|
|
|
|
|
|
|
|
loadedName = 'font_' + uniquePrefix + self.objIdCounter; |
|
|
|
|
|
|
|
translated.properties.loadedName = loadedName; |
|
|
|
|
|
|
|
font.loadedName = loadedName; |
|
|
|
|
|
|
|
font.translated = translated; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var data; |
|
|
|
var charProcs = font.get('CharProcs').getAll(); |
|
|
|
try { |
|
|
|
var fontResources = font.get('Resources') || resources; |
|
|
|
var fontObj = new Font(translated.name, |
|
|
|
var charProcOperatorList = {}; |
|
|
|
translated.file, |
|
|
|
for (var key in charProcs) { |
|
|
|
translated.properties); |
|
|
|
var glyphStream = charProcs[key]; |
|
|
|
data = fontObj.export(); |
|
|
|
charProcOperatorList[key] = |
|
|
|
} catch (e) { |
|
|
|
self.getOperatorList(glyphStream, fontResources, dependency); |
|
|
|
data = { error: e }; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
data.charProcOperatorList = charProcOperatorList; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (data instanceof Font) |
|
|
|
|
|
|
|
data = data.export(); |
|
|
|
|
|
|
|
|
|
|
|
handler.send('obj', [ |
|
|
|
handler.send('obj', [ |
|
|
|
loadedName, |
|
|
|
loadedName, |
|
|
|
'Font', |
|
|
|
'Font', |
|
|
|
data |
|
|
|
data |
|
|
|
]); |
|
|
|
]); |
|
|
|
|
|
|
|
font.sent = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
loadedName = loadedName || font.loadedName; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Ensure the font is ready before the font is set
|
|
|
|
// Ensure the font is ready before the font is set
|
|
|
|
// and later on used for drawing.
|
|
|
|
// and later on used for drawing.
|
|
|
@ -491,20 +511,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
var xref = this.xref; |
|
|
|
var xref = this.xref; |
|
|
|
|
|
|
|
|
|
|
|
function handleSetFont(fontName, fontRef) { |
|
|
|
function handleSetFont(fontName, fontRef) { |
|
|
|
var fontRes = resources.get('Font'); |
|
|
|
return self.loadFont(fontName, fontRef, xref, resources, null); |
|
|
|
|
|
|
|
|
|
|
|
// TODO: TOASK: Is it possible to get here? If so, what does
|
|
|
|
|
|
|
|
// args[0].name should be like???
|
|
|
|
|
|
|
|
assert(fontRes, 'fontRes not available'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fontRes = xref.fetchIfRef(fontRes); |
|
|
|
|
|
|
|
fontRef = fontRef || fontRes.get(fontName); |
|
|
|
|
|
|
|
var font = xref.fetchIfRef(fontRef), tra; |
|
|
|
|
|
|
|
assertWellFormed(isDict(font)); |
|
|
|
|
|
|
|
if (!font.translated) { |
|
|
|
|
|
|
|
font.translated = self.translateFont(font, xref, resources); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return font; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resources = xref.fetchIfRef(resources) || new Dict(); |
|
|
|
resources = xref.fetchIfRef(resources) || new Dict(); |
|
|
@ -546,7 +553,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
break; |
|
|
|
break; |
|
|
|
} // switch
|
|
|
|
} // switch
|
|
|
|
if (chunk !== '') { |
|
|
|
if (chunk !== '') { |
|
|
|
text += fontCharsToUnicode(chunk, font.translated.properties); |
|
|
|
text += fontCharsToUnicode(chunk, font.translated); |
|
|
|
chunk = ''; |
|
|
|
chunk = ''; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -853,7 +860,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
// - get the FontDescriptor from the descendant font
|
|
|
|
// - get the FontDescriptor from the descendant font
|
|
|
|
var df = dict.get('DescendantFonts'); |
|
|
|
var df = dict.get('DescendantFonts'); |
|
|
|
if (!df) |
|
|
|
if (!df) |
|
|
|
return null; |
|
|
|
error('Descendant fonts are not specified'); |
|
|
|
|
|
|
|
|
|
|
|
dict = isArray(df) ? xref.fetchIfRef(df[0]) : df; |
|
|
|
dict = isArray(df) ? xref.fetchIfRef(df[0]) : df; |
|
|
|
|
|
|
|
|
|
|
@ -876,7 +883,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
// This case is here for compatibility.
|
|
|
|
// This case is here for compatibility.
|
|
|
|
var baseFontName = dict.get('BaseFont'); |
|
|
|
var baseFontName = dict.get('BaseFont'); |
|
|
|
if (!isName(baseFontName)) |
|
|
|
if (!isName(baseFontName)) |
|
|
|
return null; |
|
|
|
error('Base font is not specified'); |
|
|
|
|
|
|
|
|
|
|
|
// Using base font name as a font name.
|
|
|
|
// Using base font name as a font name.
|
|
|
|
baseFontName = baseFontName.name.replace(/[,_]/g, '-'); |
|
|
|
baseFontName = baseFontName.name.replace(/[,_]/g, '-'); |
|
|
@ -899,11 +906,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
}; |
|
|
|
}; |
|
|
|
this.extractDataStructures(dict, dict, xref, properties); |
|
|
|
this.extractDataStructures(dict, dict, xref, properties); |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
return new Font(baseFontName, null, properties); |
|
|
|
name: baseFontName, |
|
|
|
|
|
|
|
dict: baseDict, |
|
|
|
|
|
|
|
properties: properties |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -939,6 +942,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
file: fontFile, |
|
|
|
file: fontFile, |
|
|
|
length1: length1, |
|
|
|
length1: length1, |
|
|
|
length2: length2, |
|
|
|
length2: length2, |
|
|
|
|
|
|
|
loadedName: baseDict.loadedName, |
|
|
|
composite: composite, |
|
|
|
composite: composite, |
|
|
|
wideChars: composite, |
|
|
|
wideChars: composite, |
|
|
|
fixedPitch: false, |
|
|
|
fixedPitch: false, |
|
|
@ -959,22 +963,9 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { |
|
|
|
|
|
|
|
|
|
|
|
if (type.name === 'Type3') { |
|
|
|
if (type.name === 'Type3') { |
|
|
|
properties.coded = true; |
|
|
|
properties.coded = true; |
|
|
|
var charProcs = dict.get('CharProcs').getAll(); |
|
|
|
|
|
|
|
var fontResources = dict.get('Resources') || resources; |
|
|
|
|
|
|
|
properties.charProcOperatorList = {}; |
|
|
|
|
|
|
|
for (var key in charProcs) { |
|
|
|
|
|
|
|
var glyphStream = charProcs[key]; |
|
|
|
|
|
|
|
properties.charProcOperatorList[key] = |
|
|
|
|
|
|
|
this.getOperatorList(glyphStream, fontResources, dependency); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
return new Font(fontName.name, fontFile, properties); |
|
|
|
name: fontName.name, |
|
|
|
|
|
|
|
dict: baseDict, |
|
|
|
|
|
|
|
file: fontFile, |
|
|
|
|
|
|
|
properties: properties |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|