Add Encodings.js and change the code to generate a CharSet per font, this will allow future changes to the OpenType font generator
This commit is contained in:
parent
1dcd42b66c
commit
f7e90f569c
1552
Encodings.js
Normal file
1552
Encodings.js
Normal file
File diff suppressed because it is too large
Load Diff
46
PDFFont.js
46
PDFFont.js
@ -40,7 +40,7 @@ var Fonts = {
|
||||
|
||||
unicodeFromCode: function fonts_unicodeFromCode(aCode) {
|
||||
var active = this._active;
|
||||
if (!active)
|
||||
if (!active || !active.encoding)
|
||||
return aCode;
|
||||
|
||||
var difference = active.encoding[aCode];
|
||||
@ -60,7 +60,7 @@ var Fonts = {
|
||||
* As an improvment the last parameter can be replaced by an automatic guess
|
||||
* of the font type based on the first byte of the file.
|
||||
*/
|
||||
var Font = function(aName, aFile, aEncoding, aType) {
|
||||
var Font = function(aName, aFile, aEncoding, aCharset, aType) {
|
||||
this.name = aName;
|
||||
|
||||
// If the font has already been decoded simply return
|
||||
@ -95,6 +95,7 @@ var Font = function(aName, aFile, aEncoding, aType) {
|
||||
Fonts[aName] = {
|
||||
data: this.font,
|
||||
encoding: aEncoding,
|
||||
charset: aCharset ? aCharset.slice() : null,
|
||||
loading: true
|
||||
}
|
||||
|
||||
@ -125,10 +126,10 @@ Font.prototype = {
|
||||
// Actually there is not event when a font has finished downloading so
|
||||
// the following tons of code are a dirty hack to 'guess' when a font is
|
||||
// ready
|
||||
var debug = false;
|
||||
var debug = true;
|
||||
|
||||
var canvas = document.createElement("canvas");
|
||||
var style = "position:absolute; top: " +
|
||||
var style = "border: 1px solid black; position:absolute; top: " +
|
||||
(debug ? (80 * fontCount) : "-200") + "px; left: 100px;";
|
||||
canvas.setAttribute("style", style);
|
||||
canvas.setAttribute("width", 100);
|
||||
@ -136,40 +137,19 @@ Font.prototype = {
|
||||
document.body.appendChild(canvas);
|
||||
|
||||
// Retrieve font charset
|
||||
var charset = null;
|
||||
var page = pdfDocument.getPage(pageNum);
|
||||
var xref = page.xref;
|
||||
|
||||
var fonts = page.fonts;
|
||||
fonts.forEach(function(fontKey, fontData) {
|
||||
var descriptor = xref.fetch(fontData.get("FontDescriptor"));
|
||||
var name = descriptor.get("FontName").toString();
|
||||
var font = Fonts[name.replace("+", "_")];
|
||||
if (font && font.loading && name == fontName.replace("_", "+")) {
|
||||
charset = descriptor.get("CharSet");
|
||||
charset = charset ? charset.split("/") : null;
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// Warn if the charset is not found, this is likely
|
||||
var testCharset = charset || [];
|
||||
if (!charset) {
|
||||
warn("No charset found for: " + fontName);
|
||||
} else {
|
||||
// if the charset is too small make it repeat a few times
|
||||
var count = 30;
|
||||
while (count-- && testCharset.length <= 30)
|
||||
testCharset = testCharset.concat(charset.slice());
|
||||
}
|
||||
var charset = Fonts[fontName].charset || [];
|
||||
// if the charset is too small make it repeat a few times
|
||||
var count = 30;
|
||||
while (count-- && charset.length <= 30)
|
||||
charset = charset.concat(charset.slice());
|
||||
|
||||
// Get the font size canvas think it will be
|
||||
var ctx = canvas.getContext("2d");
|
||||
var testString = "";
|
||||
for (var i = 0; i < testCharset.length; i++) {
|
||||
var unicode = new Number("0x" + GlyphsUnicode[testCharset[i]]);
|
||||
for (var i = 0; i < charset.length; i++) {
|
||||
var unicode = new Number("0x" + GlyphsUnicode[charset[i]]);
|
||||
if (!unicode)
|
||||
error("Unicode for " + testCharset[i] + " is has not been found in the glyphs list");
|
||||
error("Unicode for " + charset[i] + " is has not been found in the glyphs list");
|
||||
testString += String.fromCharCode(unicode);
|
||||
}
|
||||
ctx.font = "20px " + fontName + ", Symbol";
|
||||
|
@ -7,6 +7,7 @@
|
||||
<script type="text/javascript" src="test.js"></script>
|
||||
<script type="text/javascript" src="cffStandardStrings.js"></script>
|
||||
<script type="text/javascript" src="glyphlist.js"></script>
|
||||
<script type="text/javascript" src="Encodings.js"></script>
|
||||
<script type="text/javascript" src="PDFFont.js"></script>
|
||||
</head>
|
||||
|
||||
|
19
test.js
19
test.js
@ -93,17 +93,34 @@ function displayPage(num) {
|
||||
if (fontDict.has("Encoding")) {
|
||||
var encoding = xref.fetchIfRef(fontDict.get("Encoding"));
|
||||
if (IsDict(encoding)) {
|
||||
|
||||
// Build an map between codes and glyphs
|
||||
var differences = encoding.get("Differences");
|
||||
var index = 0;
|
||||
for (var j = 0; j < differences.length; j++) {
|
||||
var data = differences[j];
|
||||
IsNum(data) ? index = data : encodingMap[index++] = data;
|
||||
}
|
||||
|
||||
// Get the font charset
|
||||
var charset = descriptor.get("CharSet").split("/");
|
||||
|
||||
} else if (IsName(encoding)) {
|
||||
var encoding = Encodings[encoding];
|
||||
var widths = xref.fetchIfRef(fontDict.get("Widths"));
|
||||
var firstchar = xref.fetchIfRef(fontDict.get("FirstChar"));
|
||||
|
||||
var charset = [];
|
||||
for (var j = 0; j < widths.length; j++) {
|
||||
var index = widths[j];
|
||||
if (index)
|
||||
charset.push(encoding[j + firstchar]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var subtype = fontDict.get("Subtype").name;
|
||||
new Font(fontName, fontFile, encodingMap, subtype);
|
||||
new Font(fontName, fontFile, encodingMap, charset, subtype);
|
||||
return fontsReady = false;
|
||||
} else if (font.loading) {
|
||||
return fontsReady = false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user