Browse Source

Merge pull request #388 from vingtetun/master

Fix issue #215
Andreas Gal 14 years ago
parent
commit
25f6ad4ba6
  1. 36
      fonts.js
  2. 9
      pdf.js

36
fonts.js

@ -428,7 +428,7 @@ var Font = (function Font() {
case 'CIDFontType2': case 'CIDFontType2':
this.mimetype = 'font/opentype'; this.mimetype = 'font/opentype';
// Repair the TrueType file if it is can be damaged in the point of // Repair the TrueType file. It is can be damaged in the point of
// view of the sanitizer // view of the sanitizer
data = this.checkAndRepair(name, file, properties); data = this.checkAndRepair(name, file, properties);
break; break;
@ -822,7 +822,7 @@ var Font = (function Font() {
function readOpenTypeHeader(ttf) { function readOpenTypeHeader(ttf) {
return { return {
version: ttf.getBytes(4), version: arrayToString(ttf.getBytes(4)),
numTables: int16(ttf.getBytes(2)), numTables: int16(ttf.getBytes(2)),
searchRange: int16(ttf.getBytes(2)), searchRange: int16(ttf.getBytes(2)),
entrySelector: int16(ttf.getBytes(2)), entrySelector: int16(ttf.getBytes(2)),
@ -983,7 +983,7 @@ var Font = (function Font() {
// The new numbers of tables will be the last one plus the num // The new numbers of tables will be the last one plus the num
// of missing tables // of missing tables
createOpenTypeHeader('\x00\x01\x00\x00', ttf, numTables); createOpenTypeHeader(header.version, ttf, numTables);
if (requiredTables.indexOf('OS/2') != -1) { if (requiredTables.indexOf('OS/2') != -1) {
tables.push({ tables.push({
@ -1829,7 +1829,7 @@ var CFF = function(name, file, properties) {
for (var info in data.properties) for (var info in data.properties)
properties[info] = data.properties[info]; properties[info] = data.properties[info];
var charstrings = this.getOrderedCharStrings(data.charstrings); var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
var type2Charstrings = this.getType2Charstrings(charstrings); var type2Charstrings = this.getType2Charstrings(charstrings);
var subrs = this.getType2Subrs(data.subrs); var subrs = this.getType2Subrs(data.subrs);
@ -1848,7 +1848,7 @@ CFF.prototype = {
if (count == 0) if (count == 0)
return '\x00\x00\x00'; return '\x00\x00\x00';
var data = String.fromCharCode(count >> 8, count & 0xff); var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
// Next byte contains the offset size use to reference object in the file // Next byte contains the offset size use to reference object in the file
// Actually we're using 0x04 to be sure to be able to store everything // Actually we're using 0x04 to be sure to be able to store everything
@ -1881,9 +1881,7 @@ CFF.prototype = {
String.fromCharCode((value >> 8) & 0xFF) + String.fromCharCode((value >> 8) & 0xFF) +
String.fromCharCode(value & 0xFF); String.fromCharCode(value & 0xFF);
} else if (value >= (-2147483648) && value <= 2147483647) { } else if (value >= (-2147483648) && value <= 2147483647) {
value ^= 0xffffffff; return '\x1d' +
value += 1;
return '\xff' +
String.fromCharCode((value >> 24) & 0xFF) + String.fromCharCode((value >> 24) & 0xFF) +
String.fromCharCode((value >> 16) & 0xFF) + String.fromCharCode((value >> 16) & 0xFF) +
String.fromCharCode((value >> 8) & 0xFF) + String.fromCharCode((value >> 8) & 0xFF) +
@ -1893,13 +1891,13 @@ CFF.prototype = {
return null; return null;
}, },
getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs) { getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs, properties) {
var charstrings = []; var charstrings = [];
var missings = []; var missings = [];
for (var i = 0; i < glyphs.length; i++) { for (var i = 0; i < glyphs.length; i++) {
var glyph = glyphs[i]; var glyph = glyphs[i];
var unicode = GlyphsUnicode[glyph.glyph]; var unicode = properties.glyphs[glyph.glyph];
if (!unicode) { if (!unicode) {
if (glyph.glyph != '.notdef') if (glyph.glyph != '.notdef')
missings.push(glyph.glyph); missings.push(glyph.glyph);
@ -2021,8 +2019,8 @@ CFF.prototype = {
'topDict': (function topDict(self) { 'topDict': (function topDict(self) {
return function() { return function() {
var header = '\x00\x01\x01\x01';
var dict = var dict =
'\x00\x01\x01\x01\x30' +
'\xf8\x1b\x00' + // version '\xf8\x1b\x00' + // version
'\xf8\x1c\x01' + // Notice '\xf8\x1c\x01' + // Notice
'\xf8\x1d\x02' + // FullName '\xf8\x1d\x02' + // FullName
@ -2037,19 +2035,29 @@ CFF.prototype = {
var offset = fields.header.length + var offset = fields.header.length +
fields.names.length + fields.names.length +
(dict.length + (4 + 4 + 7)) + (header.length + 1) +
(dict.length + (4 + 4)) +
fields.strings.length + fields.strings.length +
fields.globalSubrs.length; fields.globalSubrs.length;
// If the offset if over 32767, encodeNumber is going to return
// 5 bytes to encode the position instead of 3.
if ((offset + fields.charstrings.length) > 32767) {
offset += 9;
} else {
offset += 7;
}
dict += self.encodeNumber(offset) + '\x0f'; // Charset dict += self.encodeNumber(offset) + '\x0f'; // Charset
offset = offset + (glyphs.length * 2) + 1; offset = offset + (glyphs.length * 2) + 1;
dict += self.encodeNumber(offset) + '\x11'; // Charstrings dict += self.encodeNumber(offset) + '\x11'; // Charstrings
dict += self.encodeNumber(fields.private.length);
offset = offset + fields.charstrings.length; offset = offset + fields.charstrings.length;
dict += self.encodeNumber(fields.private.length);
dict += self.encodeNumber(offset) + '\x12'; // Private dict += self.encodeNumber(offset) + '\x12'; // Private
return dict; return header + String.fromCharCode(dict.length + 1) + dict;
}; };
})(this), })(this),

9
pdf.js

@ -4295,6 +4295,10 @@ var PartialEvaluator = (function() {
if (fontDict.has('ToUnicode')) { if (fontDict.has('ToUnicode')) {
encodingMap['empty'] = true; encodingMap['empty'] = true;
var glyphsMap = {};
for (var p in glyphMap)
glyphsMap[glyphMap[p]] = encodingMap[p];
var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode')); var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
if (IsName(cmapObj)) { if (IsName(cmapObj)) {
error('ToUnicode file cmap translation not implemented'); error('ToUnicode file cmap translation not implemented');
@ -4393,7 +4397,9 @@ var PartialEvaluator = (function() {
var descriptor = xref.fetch(fd); var descriptor = xref.fetch(fd);
var fontName = xref.fetchIfRef(descriptor.get('FontName')); var fontName = fontDict.get('Name');
if (!fontName)
fontName = xref.fetchIfRef(descriptor.get('FontName'));;
assertWellFormed(IsName(fontName), 'invalid font name'); assertWellFormed(IsName(fontName), 'invalid font name');
fontName = fontName.name.replace(/[\+,\-]/g, '_'); fontName = fontName.name.replace(/[\+,\-]/g, '_');
@ -4429,6 +4435,7 @@ var PartialEvaluator = (function() {
subtype: fileType, subtype: fileType,
widths: glyphWidths, widths: glyphWidths,
encoding: encodingMap, encoding: encodingMap,
glyphs: glyphsMap || GlyphsUnicode,
builtInEncoding: builtInEncoding, builtInEncoding: builtInEncoding,
charset: charset, charset: charset,
firstChar: fontDict.get('FirstChar'), firstChar: fontDict.get('FirstChar'),

Loading…
Cancel
Save