diff --git a/fonts.js b/fonts.js index ce49a82b9..6afb47557 100755 --- a/fonts.js +++ b/fonts.js @@ -789,6 +789,8 @@ var Font = (function Font() { encoding: null, checkAndRepair: function font_checkAndRepair(name, font, properties) { + var kCmapGlyphOffset = 0xFF; + function readTableEntry(file) { // tag var tag = file.getBytes(4); @@ -1027,26 +1029,27 @@ var Font = (function Font() { if (properties.type == 'CIDFontType2') { // Type2 composite fonts map characters directly to glyphs so the cmap // table must be replaced. + // canvas fillText will reencode some characters even if the font has a + // glyph at that position - e.g. newline is converted to a space and U+00AD + // (soft hypen) is not drawn. + // So, offset all the glyphs by 0xFF to avoid these cases and use + // the encoding to map incoming characters to the new glyph positions var glyphs = []; - var charset = properties.charset; - if (!charset.length) { - // Type2 composite fonts map characters directly to glyphs so the cmap - for (var i = 1; i < numGlyphs; i++) { - glyphs.push({ - unicode: i - }); - } - } else { - for (var i = 1; i < charset.length; i++) { - var index = charset.indexOf(i); - if (index == -1) - break; + var encoding = properties.encoding; - glyphs.push({ - unicode: index - }); - } + for (var i = 1; i < numGlyphs; i++) { + glyphs.push({ unicode: i + kCmapGlyphOffset }); + } + + if ('undefined' == typeof(encoding[0])) { + // the font is directly characters to glyphs with no encoding + // so create an identity encoding + for (i = 0; i < numGlyphs; i++) + encoding[i] = i + kCmapGlyphOffset; + } else { + for (var i in encoding) + encoding[i] = encoding[i] + kCmapGlyphOffset; } if (!cmap) { @@ -1260,31 +1263,26 @@ var Font = (function Font() { if (!charsCache) charsCache = this.charsCache = Object.create(null); + // translate the string using the font's encoding + var encoding = this.encoding; + if (!encoding) + return chars; + str = ''; + if (this.compositeFont) { // composite fonts have multi-byte strings convert the string from - // single-byte to multi-byte XXX assuming CIDFonts are two-byte - later - // need to extract the correct byte encoding according to the PDF spec - str = ''; - var multiByteStr = ''; - var length = chars.length; + // single-byte to multi-byte + // XXX assuming CIDFonts are two-byte - later need to extract the + // correct byte encoding according to the PDF spec + var length = chars.length - 1; // looping over two bytes at a time so + // loop should never end on the last byte for (var i = 0; i < length; i++) { - var byte1 = chars.charCodeAt(i++) & 0xFF; - var byte2; - if (i == length) - byte2 = 0; - else - byte2 = chars.charCodeAt(i) & 0xFF; - multiByteStr += String.fromCharCode((byte1 << 8) | byte2); + var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]); + var unicode = encoding[charcode]; + str += String.fromCharCode(unicode); } - str = multiByteStr; } else { - // translate the string using the font's encoding - var encoding = this.encoding; - if (!encoding) - return chars; - - str = ''; for (var i = 0; i < chars.length; ++i) { var charcode = chars.charCodeAt(i); var unicode = encoding[charcode]; diff --git a/pdf.js b/pdf.js index b8193a138..642e37d32 100644 --- a/pdf.js +++ b/pdf.js @@ -4028,14 +4028,15 @@ var PartialEvaluator = (function() { if (subType.name == 'CIDFontType2') { var cidToGidMap = descendant.get('CIDToGIDMap'); if (cidToGidMap && IsRef(cidToGidMap)) { - // Extract the charset from the CIDToGIDMap + // Extract the encoding from the CIDToGIDMap var glyphsStream = xref.fetchIfRef(cidToGidMap); var glyphsData = glyphsStream.getBytes(0); - var i = 0; // Glyph ids are big-endian 2-byte values + encodingMap[0] = 0; //set this to 0 to verify the font has an encoding for (var j = 0; j < glyphsData.length; j++) { var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - charset.push(glyphID); + if (glyphID != 0) + encodingMap[j>>1] = glyphID; } } } diff --git a/test/pdfs/complex_ttf_font.pdf b/test/pdfs/complex_ttf_font.pdf new file mode 100644 index 000000000..284caabe4 --- /dev/null +++ b/test/pdfs/complex_ttf_font.pdf @@ -0,0 +1,575 @@ +%PDF-1.3 +% +1 0 obj +<< +/Parent 2 0 R +/MediaBox [0 0 595 842] +/Resources 3 0 R +/pdftk_PageNum 1 +/Contents 4 0 R +/Type /Page +>> +endobj +2 0 obj +<< +/MediaBox [0 0 612 792] +/Kids [1 0 R] +/Count 1 +/Type /Pages +>> +endobj +4 0 obj +<< +/Length 8531 +>> +stream +q Q q 0 0 595 842 re W n 0 0 0 1 k BT 36 0 0 36 165.615 619.79 Tm /F1.1 1 +Tf [ <033d> -0.2 <0b0b> 0.4 <04a8000301e5> -0.2 <000301b9> 0.2 <033d> -0.2 +<0b61> 0.1 <02250003100e> ] TJ ET BT 36 0 0 36 253.725 619.955 Tm /F1.1 1 +Tf <0d010b61> Tj ET BT 36 0 0 36 268.38 619.79 Tm /F1.1 1 Tf [ <08e7> -0.2 +<04a80003> 0.4 <100c> -0.3 <02be> 0.2 <0003100e> 0.2 <0cb1> -0.2 <033d> -0.2 +<0ccc> 0.4 <00a2000307060225> -0.3 <00a209de> 0.2 <00a200030a2e039d> -0.1 +<0a670003> 0.4 <0a45> -0.1 <0371> -0.1 <02b8> 0.1 <00a200030362> ] TJ ET BT +36 0 0 36 474.69 619.955 Tm /F1.1 1 Tf <0e0f02a4> Tj ET BT 36 0 0 36 494.37 619.79 +Tm /F1.1 1 Tf <04a8> Tj ET BT 36 0 0 36 167.58 568.415 Tm /F1.1 1 Tf [ <033f> +-0.2 <0b0b04a8000301e5> 0.2 <000301ba> 1.2 <033f> -0.2 <0b61> 0.1 <02250003100e> +] TJ ET BT -0.0002 Tc 36 0 0 36 254.25 568.58 Tm /F1.1 1 Tf <0d140b61> Tj +0 Tc ET BT 36 0 0 36 268.02 568.415 Tm /F1.1 1 Tf [ <08ed> -0.4 <04a80003> +0.4 <100c> -0.3 <02be> 0.2 <0003100e> -0.3 <0cba> 0.3 <033f> -0.2 <0ccc00a200030706022500a209df> +0.3 <00a200030a2e039d> -0.1 <0a5e> 1 <00030a45> 0.3 <0371> -0.1 <02ba> 0.1 +<00a200030362> ] TJ ET BT 0.0004 Tc 36 0 0 36 474 568.58 Tm /F1.1 1 Tf <0e0f02a6> +Tj 0 Tc ET BT 36 0 0 36 494.37 568.415 Tm /F1.1 1 Tf <04a8> Tj ET BT 36 0 0 36 161.55 517.055 +Tm /F1.1 1 Tf [ <033d> -0.2 <0b0b04a8000301e5> 0.2 <000301b9> 0.2 <033d> -0.2 +<0b61> 0.1 <0225> -0.3 <0003> 0.4 <100e> ] TJ ET BT 36 0 0 36 249.66 517.22 +Tm /F1.1 1 Tf <0d020b61> Tj ET BT 36 0 0 36 264.315 517.055 Tm /F1.1 1 Tf +[ <08e7> -0.2 <04a80003100c02be> 0.2 <0003100e> -0.3 <0cb1> 0.3 <033d> -0.2 +<0ccc00a200030706022500a209e000a200030a2e039d> -0.1 <0a670003> 0.4 <0a45> +-0.1 <0371> -0.1 <02b8> 0.1 <00a200030362> ] TJ ET BT 36 0 0 36 474.69 517.22 +Tm /F1.1 1 Tf <0e0f02a4> Tj ET BT 36 0 0 36 494.37 517.055 Tm /F1.1 1 Tf <04a8> +Tj ET BT 36 0 0 36 98.88 463.685 Tm /F1.1 1 Tf [ <033d> 0.2 <0b17> -0.2 <04a80003> +0.4 <01e5> -0.2 <000301ba> 1.2 <033f> -0.2 <0b61> 0.1 <02250003100e> ] TJ +ET BT -0.0002 Tc 36 0 0 36 191.955 463.85 Tm /F1.1 1 Tf <0d140b61> Tj 0 Tc +ET BT 36 0 0 36 205.725 463.685 Tm /F1.1 1 Tf [ <08ed> -0.4 <04a8> 0.4 <000303cc02be> +-0.2 <0003100e> 0.2 <0cba033f> 0.2 <0ccc00a20003> ] TJ ET BT 36 0 0 36 309.6 465.695 +Tm /F1.1 1 Tf [ <071e> -0.2 <022500a209df> 0.3 <00a20003> ] TJ ET BT 36 0 0 36 361.68 463.685 +Tm /F1.1 1 Tf [ <020f> -0.2 <039d> 0.3 <0a5e> 1 <0003000300030a4c> 0.2 <0371> +-0.1 <02ba> 0.1 <00a200030362> ] TJ ET BT 0.0004 Tc 36 0 0 36 474 463.85 Tm +/F1.1 1 Tf <0e0f02a6> Tj 0 Tc ET BT 36 0 0 36 494.37 463.685 Tm /F1.1 1 Tf +<04a8> Tj ET BT 36 0 0 36 113.625 409.25 Tm /F1.1 1 Tf <100f> Tj ET BT 0.0001 +Tc 36 0 0 36 125.325 409.775 Tm /F1.1 1 Tf <0d1d0b73> Tj 0 Tc ET BT 36 0 0 36 153.405 409.25 +Tm /F1.1 1 Tf [ <08f3> 0.2 <04a8000303ce02bf0003100e> ] TJ ET BT 36 0 0 36 222.57 409.52 +Tm /F1.1 1 Tf <0d2602a7> Tj ET BT 36 0 0 36 237.69 409.25 Tm /F1.1 1 Tf <0340> +Tj ET BT 36 0 0 36 246.93 410.225 Tm /F1.1 1 Tf <0330> Tj ET BT 36 0 0 36 258.705 410.495 +Tm /F1.1 1 Tf <0dde02a7> Tj ET BT 36 0 0 36 281.07 409.235 Tm /F1.1 1 Tf <00a20003> +Tj ET BT 36 0 0 36 287.295 411.23 Tm /F1.1 1 Tf [ <071e> 0.3 <0225> -0.3 <00a209de> +0.2 <00a20003> ] TJ ET BT 36 0 0 36 339.06 409.235 Tm /F1.1 1 Tf <0a2e03d6> +Tj ET BT -0.0003 Tc 36 0 0 36 357.555 410.21 Tm /F1.1 1 Tf <030e0a71> Tj 0 +Tc ET BT 36 0 0 36 380.415 409.235 Tm /F1.1 1 Tf [ <0003000300030a45> -0.1 +<0363> ] TJ ET BT -0.0006 Tc 36 0 0 36 411.51 409.58 Tm /F1.1 1 Tf <02f7033102a7> +Tj 0 Tc ET BT 36 0 0 36 447.885 409.235 Tm /F1.1 1 Tf <00a200030363> Tj ET +BT 36 0 0 36 464.31 409.82 Tm /F1.1 1 Tf <02fe> Tj ET BT 36 0 0 36 478.74 409.55 +Tm /F1.1 1 Tf <0e0702a7> Tj ET BT 36 0 0 36 494.37 409.235 Tm /F1.1 1 Tf <04a8> +Tj ET BT 36 0 0 36 162.15 348.08 Tm /F1.1 1 Tf [ <000303e6033d> -366 <043e> +365.8 <0b0b> 0.4 <00a4> -0.3 <0003043c> -117.1 <03dc> 117.1 <01e5> 0.2 <0003043c01b9> +-0.2 <033d> 0.2 <03dc> -117.1 <03df> 117.1 <0b61> -58.2 <0439> 58.3 <0225> +-0.3 <0003> -58 <03dc> 58.3 <100e> ] TJ ET BT 36 0 0 36 252.63 348.245 Tm +/F1.1 1 Tf <0d01043d0b61> Tj ET BT 36 0 0 36 265.185 348.08 Tm /F1.1 1 Tf +[ <0410> -175.4 <03e1> 117.1 <08e7> -0.2 <00a4> 0.1 <0003> -58.4 <043e> 58.3 +<100c046c02be> -0.2 <0003> -58.4 <03dc> 58.3 <100e> 0.2 <044e0cb1> -0.2 <033d> +-116.9 <03f2> 117.1 <0ccc04aa000303dc> -117.1 <03dc> 117.1 <07060410022500a203f209de> +-0.2 <04aa0003> -58.4 <043c> 58.3 <0a2e0450> -175.4 <03dc> 175.4 <039d> 58.7 +<043c> -58.3 <0a670003> -117.1 <044f> 117.1 <0a45> -0.1 <043d> -234.2 <043e> +234.2 <0371> 58.2 <046c> -58.3 <03e102b8> 0.1 <04aa0003> -58.4 <043c> 58.3 +<0362> ] TJ ET BT 0.3513 Tc 36 0 0 36 472.05 348.245 Tm /F1.1 1 Tf [ <03e103df> +644 <0e0f> 410 <03e1> 293 <02a4> ] TJ 0 Tc ET BT 36 0 0 36 493.815 348.08 +Tm /F1.1 1 Tf <00a4> Tj ET BT 36 0 0 36 162.15 278.72 Tm /F1.1 1 Tf [ <000303e6033d> +-366 <0411> 365.8 <0b0b> 0.4 <00a4> -0.3 <0003040f> -117.1 <0495> 117.1 <01e5> +0.2 <0003040f01b9> -0.2 <033d> 0.2 <0495> -117.1 <0496> 117.1 <0b61> -58.2 +<040c> 58.3 <0225> -0.3 <0003> -58 <0495> 58.3 <100e> ] TJ ET BT 36 0 0 36 252.63 278.885 +Tm /F1.1 1 Tf <0d01043d0b61> Tj ET BT 36 0 0 36 265.185 278.72 Tm /F1.1 1 +Tf [ <03e0> -175.4 <0497> 117.1 <08e7> -0.2 <00a4> 0.1 <0003> -58.4 <0411> +58.3 <100c043d02be> -0.2 <0003> -58.4 <0495> 58.3 <100e> 0.2 <041f0cb1> -0.2 +<033d> -116.9 <03f2> 117.1 <0ccc04aa00030495> -117.1 <0495> 117.1 <07060410022500a203f209de> +-0.2 <04aa0003> -58.4 <040f> 58.3 <0a2e0421> -175.4 <0495> 175.4 <039d> 58.7 +<043c> -58.3 <0a670003> -117.1 <0420> 117.1 <0a45> -0.1 <0410> -234.2 <0411> +234.2 <0371> 58.2 <043d> -58.3 <049702b8> 0.1 <04aa0003> -58.4 <040f> 58.3 +<0362> ] TJ ET BT 0.3513 Tc 36 0 0 36 472.05 278.885 Tm /F1.1 1 Tf [ <04970496> +644 <0e0f> 410 <0497> 293 <02a4> ] TJ 0 Tc ET BT 36 0 0 36 493.815 278.72 +Tm /F1.1 1 Tf <00a4> Tj ET BT 36 0 0 36 140.535 209.345 Tm /F1.1 1 Tf [ <000303e9033d> +-365.6 <046e> 365.8 <0b0b00a4> 0.1 <0003046b> -117.1 <03dd> 117.1 <01e5> -0.2 +<0003046b01b9> 0.2 <033d> -0.2 <040c> -117.1 <040f> 117.1 <0b61> -58.2 <0468> +58.3 <02250003> -58.4 <040d> 58.3 <100e> ] TJ ET BT 36 0 0 36 231 209.51 Tm +/F1.1 1 Tf [ <0d01> -0.4 <043d0b61> ] TJ ET BT 36 0 0 36 243.57 209.345 Tm +/F1.1 1 Tf [ <0410> -175.4 <0412> 117.1 <08e7> 0.3 <00a4> -0.3 <0003> -58.4 +<046e> 58.3 <100c046c02be> 0.2 <0003> -58.4 <040d> 58.3 <100e> -0.3 <047b0cb1> +0.3 <033d> -117.3 <041f> 117.1 <0ccc04aa000303dc> -117.1 <040c> 117.1 <07060410022500a2041f09de> +0.2 <04aa0003> -58.4 <040f> 58.3 <0a2e043d041e03d6043a0316> 58.4 <046b> -58.3 +<0a5d0003> -117.1 <047c> 117.1 <0a45> -0.1 <043d> -234.2 <043f> 234.2 <0371> +58.2 <046c> -58.3 <03e202b8> 0.1 <04aa0003> -58.4 <046b> 58.3 <0362> ] TJ +ET BT 0.3513 Tc 36 0 0 36 472.05 209.51 Tm /F1.1 1 Tf [ <03e2040f> 644 <0e0f> +410 <0497> 293 <02a4> ] TJ 0 Tc ET BT 36 0 0 36 493.815 209.345 Tm /F1.1 1 +Tf <00a4> Tj ET BT 9 0 0 9 609.45 625.205 Tm /F2.1 1 Tf [ <0031> 0.5 <005200030026> +0.5 <004b> -0.5 <00440051> -0.5 <004a0048> ] TJ ET BT 9 0 0 9 609.45 573.2 +Tm /F2.1 1 Tf [ <0026> 0.5 <004b> -0.5 <00440055> 0.5 <00440046> 0.5 <0057> +-0.3 <0048> 1.5 <0055> 0.5 <00030044004f> -0.5 <0057> -0.3 <0048> 1.5 <0055> +0.5 <0051> -0.5 <00440057> -0.3 <0048> 1.5 <0056> 0.8 <00030014> ] TJ ET BT +9 0 0 9 609.45 521.195 Tm /F2.1 1 Tf [ <0026> 0.5 <004b> -0.5 <00440055> 0.5 +<00440046> 0.5 <0057> -0.3 <0048> 1.5 <0055> 0.5 <00030044004f> -0.5 <0057> +-0.3 <0048> 1.5 <0055> 0.5 <0051> -0.5 <00440057> -0.3 <0048> 1.5 <0056> 0.8 +<00030015> ] TJ ET BT 9 0 0 9 609.45 469.205 Tm /F2.1 1 Tf [ <0029> -0.8 <004c> +0.5 <0051> -0.5 <0044004f> -0.5 <0003003a004c> 0.5 <0047> -0.5 <0048> 1.5 +<00030029> -0.8 <00520055> 0.5 <0050> -0.3 <0056> ] TJ ET BT 9 0 0 9 609.45 406.805 +Tm /F2.1 1 Tf [ <0032> 0.5 <0057> -0.3 <004b> -0.5 <0048> 1.5 <0055> 0.5 <0003003a004c> +0.5 <0047> -0.5 <0048> 1.5 <00030029> -0.8 <00520055> 0.5 <0050> -0.3 <0056> +] TJ ET BT 9 0 0 9 609.45 344.405 Tm /F2.1 1 Tf [ <0031> 0.5 <00520055> 0.5 +<0050> -0.3 <0044004f> -0.5 <00030027> 0.5 <004c> 0.5 <00440046> 0.5 <0055> +0.5 <004c> 0.5 <0057> -0.3 <004c> 0.5 <0046> 0.5 <00030033> 0.2 <00520056> +0.8 <004c> 0.5 <0057> -0.3 <004c> 0.5 <00520051> -0.5 <0056> ] TJ ET BT 9 0 0 9 609.45 282.005 +Tm /F2.1 1 Tf [ <0029> -0.8 <00440055> 0.5 <0057> -0.3 <004b> -0.5 <0048> +1.5 <0055> 0.5 <00030027> 0.5 <004c> 0.5 <00440046> 0.5 <0055> 0.5 <004c> +0.5 <0057> -0.3 <004c> 0.5 <0046> 0.5 <0056> ] TJ ET BT 9 0 0 9 609.45 209.195 +Tm /F2.1 1 Tf [ <0027> 0.5 <004c> 0.5 <00440046> 0.5 <0055> 0.5 <004c> 0.5 +<0057> -0.3 <004c> 0.5 <0046> 0.5 <00030024> 0.5 <004f> -0.5 <0057> -0.3 <0048> +1.5 <0055> 0.5 <0051> -0.5 <00440057> -0.3 <0048> 1.5 <0056> ] TJ ET Q +endstream +endobj +3 0 obj +<< +/Font +<< +/F2.1 5 0 R +/F1.1 6 0 R +>> +/ProcSet [/PDF /Text] +>> +endobj +6 0 obj +<< +/DescendantFonts [7 0 R] +/BaseFont /LSUISA+font0000000013f5eeab +/Subtype /Type0 +/Encoding /Identity-H +/Type /Font +>> +endobj +5 0 obj +<< +/DescendantFonts [8 0 R] +/BaseFont /ZCCVRA+font0000000013f5eeab +/Subtype /Type0 +/Encoding /Identity-H +/Type /Font +>> +endobj +9 0 obj +<< +/Pages 2 0 R +/Type /Catalog +>> +endobj +7 0 obj +<< +/BaseFont /LSUISA+font0000000013f5eeab +/DW 1000 +/CIDSystemInfo +<< +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/Subtype /CIDFontType2 +/FontDescriptor 10 0 R +/W 11 0 R +/CIDToGIDMap 12 0 R +/Type /Font +>> +endobj +10 0 obj +<< +/FontName /LSUISA+font0000000013f5eeab +/StemV 0 +/FontFile2 13 0 R +/Ascent 785 +/Flags 32 +/XHeight 523 +/Descent -662 +/ItalicAngle 0 +/MaxWidth 4959 +/FontBBox [-979 -662 4935 785] +/Type /FontDescriptor +/CapHeight 291 +>> +endobj +13 0 obj +<< +/Length 15672 +/Length1 15672 +>> +stream +true cvt XfpgmLglyf7Lhead6hhea4$hmtx`  %=#,:!!>%(*ys7&'67&'&'6767'"*; )*AH (7 +{8(%C9',/ 3C##)s'&'67&'&'6767h#*: (*@H )8 +{8(%C9',/ 3C##). 2547&'&676'&5&76 M<'+C& / 0/ +1 U +(;#"&#"#"5476326324#"6;'-C+% +!2K"#%%<2)/.#'nGE `7#&5&'&'&7632 +$ + 1; !j'1BP.A#"767676547&'&7676&'&7676"'&'&&632I &ed +>h1,"& / #  ," /L.O +@'1E$'-1  b@ :1dJ)1%#"'&'#"54767654'&63232654'&632&'76J!%?@%C`? f %7/%   *B,0E183\* -49G + V{? +1r1=(-%.2d+3%# '&'#"5474'&632!27654'&6326'76!T쭌O *<] +  +)U>áG&.:2 41MA$I5 -I0<%kI2g,%'GoAL- E?" +)1:%'#"'&'&563267654'&'&632327654'#"&546324#"32 +^YG%_Y +(/NK?*$470>-3I#&',`) +''}sl @WI!m2))L>*8&#f‟F T%6;Oa;d7q1%#"'&54763232654''#"'&>32q xK_m9-- 60Bx ' % *)B8hK/A3GsQ:I>&#Q4M27tzv!(PJ%#3l ,L# b7HPT=?5%#"54767676767654'&54632-3>6EpUT<0+6CmY>12 ! $,)]29(/)$_uLqZ +X4:G,Y.,B'D'(%b) +9d+19%#"'#"547676'&463232545&54632&'76+\S. *@\:1Z +W779#* \,0`Ϸ..+A#DV3)NR +e FA-%Nd +y!%#"547632767654'632tfgV[MX])V #)jD$oI@QIAg(Ea)+? p~gRae7&'67# %&'&'&'&76!27676767654'&632}"H ) +&!q<بbL80/q +:y=H 78( 3D3KV + L(87+6P-j59}72#"546327676u*R4 5.N7{%#"54632765&'&4763+8čk! Z>",7# )&59^+DR%#"''"''&547&'&'&#"#"5463276763263267676&4632&'&#"327676+);t~5)$UV'   5G94 + .##r.k3$rrbI !+'.AHA~$6=D%5   %B7(11q$$sg;Lh ow?K%!"%''&547&'&12#"54632767632367632327654&'674'&#"3276o]}V( ! +)8I( +  %)G=4<-(KGwО2[-%+'Hg_Pk*: F%!&!7"  +/'3` +N;4Zw +yr'4%#&'#"546327&54632'.46324'&#"326 5slOc)v?1DE`@ % F)I54A197P_;=4Za/?2!- >+Hr)6%# '#"546327&546327654'674'&#"326H>2үe\JU)v?1V殲B $ F)Ia,$?37P_;=%"/B75*+#7#"546327654'&74632$dO'( + +c-A7,E!+ Z" + O + 7#"5463276'&'&#"547632+%D0) 2  +@-7 %#M!d7IOT#%#"5463276'&54763NkvK'* + #$u,>7&DY *." %) + 1%'"&#"#"546327676323254'&54632:'u#6TO0(f%_ #  '(MnL(/'7 ('!)f  =%1%#"'#"546327654'&5&6323276&74632%LV)j0   +?$W 0b7, ?OZ|P%,0 c! +\>W#"'#"'#"&#"&'&#"#"546327&7632326#2576763254'&7&7462 7@ ?23EGN !)C(( ##+/u33m0-; >BD B  +):"  +&-s+-<'V-3y$*22@=7ZT- T, $(% +*& R +e+%#2&#"#"546327&'&'&54632 M< =8) 51`76>H7#"&'#"54632767637654'&'&746322'&'&'&>3^,H. 9$z ! +  +X FVe;$5("F(7/W0 > Z! + &)  @uE%'#"546327676254&#"u+8x4iC,"#-/* B(!5N976<61:( T!%2#"'&'&#"#"54632767632FA$ -56#   *K8$#8 +#%2#"'#"5463276'&'&632 htW K70+AQ ]r&H%2#"'!"54632767632R!a^ &K9b7; * %2#"'&'&#"#"5463276763" E + /MK. +(MK977+ ,d6%2#"'#"'#"7#"546327676327676326V> !;8,Ug Dzt> +D= 3+AK9`V)=-37' +8 ( (j 8L1;%2#"'''&547&'#"546327676766763274'&#"676 kP-?'ˆ\B"(,+8>qK77 <  aFBy,T-# 03[ C23+#'%2#"'#"546327&546'4'&#"326TIV)v?1AH6 F)IK8B27O_Bq!v". <,BOY%2#"'%#"54627676'7&54632676327&546'4'&326!4&#"676 w>O+7&& %l$-4@*$<|Su?1A' + @'DuL',_oz{xK3:7'1a2 +R !JƲ/+J\ NSP`Csg* 7'&:]"!/0%2#"'&'#"546327654'&'&5476%67! qc +7C\E:h@V3:p8}K=6<.k6@7HK~\?F`6?<# $P8%2#"'&547!"5463 %$%&#"# 5476732$32B&!L_{{297 YLw1FBcB<=K9,&766:7921[YNx,*4%V.iV1,5>M>&%2#"'#"'&7#"54632767632&'&#"  'Zbˆ`F06 Z K9 ++ 8?M7 DL.%# +{(%2#"'#"'&7#"546327>72'&'&#m Q &M`7fN/5%+5Z K) ! 8[J(s3-( T 3&67676!u%!'+e@49D  (#&'&''&76767&'&54632'4#"6  >!6#>0(># #7#6]  0% #!!#B9!@ + 21&>" ;`M*(4 .*0"WG  #"547>32&#"32C6 +79!& 0PD@+=`J3-'&767&#"#"'&632K799F )L P4D[ + a + 2'&767>2'&7># ;_M 0# ;^N*4 /*VA5.+!W9r &67676&67676b*0%)0% &5oB5BM, '4pA4AN 321&767>#"''&767676767676'&76) .UQ "2 !/  +- 9C1- +3 2'&7> ! 8[J(3-( T 3&67676!u%!'+e@49D2 Z(#"'&''&76767&547632'4#"6 @/2">0A!# #7 5   /&#!! #" 9"> +u 2'&67>" :`L*u5/*3 XGw? #"54767632'&#"3216 +9!& 0#>+ _( I3-l'&767&#"#"'&632K799F V P4DY  a \%#"''&763676767676'&722 !/ + C1/ +\w 22&767>#"''&763676767676'&72( .2 !/ + u.= 8C1/ +\!GO#"&'"'&76767&'&54632#"''&763676767676'&72'4#"6 =!5 5+%8 2 !/ + >0a )%<2C1/ +D +[$1#"''&763676767>'&722'&767>2 !/ +  :* . !1D 20 -> 9G 2'&7> ! 8[J(G3-( Td| 3&67676!u%|!'+e@49D +"*#0&'&''&76767&'&547632'4#"6 + ?'9"90)!# #7#5/ /%!!#"8 "<? 21&767># ;`M ?5/( YG #"547>32'&#"3206 +79!& 0%@+=_( +H1-'&767&#"#"'&632K899F Y O5Dh[   _ + 12'&767>#"''&763676767>'&76) .3 !/ +  /? 8D00 ODL#.'#"5&76767&'&54632#"''&763676767>'&76'4#"6  =!1 5+%8 3 !/ +  >0# + '$ +;4! D00   $1#"''&763676767>'&762&767>2 !/  :* .C1. -=  8 2'&7> ! 8[J(3-( T +- (&'&''&76767&'&54632'4#"6 + >%7$90(># #8#6 + 0%!""B8!!=T 2'&>" :`L)(5/*0"W@'&767&#"#&'&632K899F Y O5D\  _ +0J 12'&767>#"''&763676767>'&76) .2 !/ +  I0? 8C00 0CK#&'&'#"5&767&'&54632#"''&763676767>'&76'4#"6  ;&,  i!%8 2 !/ +  =04# )";/ +;4"C00  Q'&767676A RbP*H 5'&0'&''6767&'&54632'4#"6 7*)j!#8 2 0: - ;. <4!9  #"547>32&#"32D5 6<#&1%D@+=bJ3-" +> +stream + + #$%)*+,236789:;<=>?@BCFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +endstream +endobj +8 0 obj +<< +/BaseFont /ZCCVRA+font0000000013f5eeab +/DW 1000 +/CIDSystemInfo +<< +/Supplement 0 +/Ordering (Identity) +/Registry (Adobe) +>> +/Subtype /CIDFontType2 +/FontDescriptor 14 0 R +/W 15 0 R +/CIDToGIDMap 16 0 R +/Type /Font +>> +endobj +14 0 obj +<< +/FontName /ZCCVRA+font0000000013f5eeab +/StemV 0 +/FontFile2 17 0 R +/Leading 42 +/Ascent 891 +/Flags 32 +/XHeight 242 +/Descent -216 +/ItalicAngle 0 +/MaxWidth 2000 +/FontBBox [-558 -307 2000 1026] +/Type /FontDescriptor +/CapHeight 346 +>> +endobj +17 0 obj +<< +/Length 20588 +/Length1 20588 +>> +stream +true + cvt &fpgmglyf#X,head6hhea4$hmtx"hloca# 6maxp nameP<0prepXA4444455545L5d5|5</VHI +_<5FON5 !EWT  2  2 ( A?__@x3@r3@n3@j3@T3@J32@ + 2 2@Z3@A V3S3P3@M3@G3DE2@B3@>3:3A$ @p//@3A/`  ?O +lEE2@+.2@()22'2BB2682*-2A +((.22@2@APo-12 +2A  @2@2߲042߳2PA# 2Ay)z2~ٲ2ٲ(*2A +|2sq4lk2 @ 2@2kkn/n 2A @Ҳ 2A +@ 2@3@ 2A &82A&0 00Po0/py2y$(2}|2~~ 2@|2| 2?O@س2o@2@Բ 2{z2z2@ 2AToTTTTT/T_T@P2Z@I3HHH"2G"22-2/QKONd@Q2N8:20NN#2N2F 2C +2D+2+2*2A:37 707322PAd2@2`222202P22666p661?11111`10`00P//@/`/////--0----o,, @:@5%,2@j%,2@.%,2@(%,27` p 0 @ P  :3@:3MMM7A @>>>MMM---@M:27_o/?O_o/?O` p 0 @ P   P`p/?@AC`p@P#0#@#0#p@"0$@$$ $$$$$$$A:#0#`p@P#0ײ#7A_/?o@',2&3@"3@3@3@2_A?D3@=3@:3A7_O/??pO_/?z/z@ i(((A# # # # # W# @ # # # # A +J$ $ $ j@$ $ $ $ $ " !@" " " " " " \" Q" L" A +(  ^ @ Y : A +4 4 4 54 4 4 [ [  +*> *>!M%MAMRMrMA  * **^*9*#fff4f4ffA (&M?MA >%@*r*(*$*$*f.ff(lA (&sMqM$pM/oM5k>i>A gf*af*_fA ](\5GM9F>A E>%DCB@*0>*&=f%>*)*  f +&Mr>V@(MbM@Mr>@ *f"*@*.&y(Mf)fbf&(@ fL*+&f)@@*y&uMtMs*p(^j(@i*Rh* gf)efga*`5^*S5KfVI>HfRF&?fV@ ;f42*.5-CU7/r@.~bTB/'%!  +@+JKKSB7+KR8+KP[XYKcKb S# +QZ#BKKTB8+TXCX,FYYv??>9FD>9FD>9FD>9FD>9F`D>9F`DED+++++++++++++++++++++++++KSXY2KSXYK)S \XljEDkjEDYXhlERXlhDYYK;S \X>kEDMkEDYX\>ERX>\DYYK;S \X>ED>>EDYXOERXODYYKZS \XC>ED>>EDYXCERXCDYYKS \X*lED@lEDYXl*ERX*lDYYKS \X&&EDf&EDYX2&ERX&2DYYKQS \X&&ED(&EDYX&ERX&DYYKS \X&&ED5&EDYX(&ERX&(DYY++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++eB+++++++++++++++++++++++++++++++++++++++++++++++++++=vnXEe#E`#Ee`#E`vhb nvEe#E &`bch &aev#eDn#D =XEe#E &`bch &aeX#eD=#DXETXX@eD=@=E#aDYN8qEe#E`#Ee`#E`vhb 8Ee#E &`bch &ae#eD8#D NqEe#E &`bch &aeq#eDN#DqETXq@eDN@NE#aDYKRBKPXBYC\XBY +CX`!YBp>CX;!~ +Y #B #BCX-A-A +Y#B#BCX~;! +Y#B#BtEiDEiDssssttuuuu+++ss++++++EiDssst+EDssssstttEDsttttttuuuEDsuEDssttEDsssssttttuuuuuuuuuuu++tttttts+CXMMEiDM:2+Ys++uuu+++++ss+C\X3@ 3MMMA @>>>MMM---7+tttttts++Ysststststststu+sus+++s++++u+++s+++++t+s+sst+ss++++++s+s+++t+++sssss+ss+++s++++sts+s++++u++++++++u+++++s++++stu++sss+++u++s++++++++++stust+stu+++++++++++++++++++stu++++LLJk#j$$%$]E.X9K +(#KPJ 1F%O"NAGi@'LHQP.;L +#"sZPRn\Z[In~`5br(8 n+F@h33n5C4\]|(;H{7cx!z'4RFTm?N+En!I{nc(i~?2&5@EIWl&@[{w~(8/@FM~{/h   37x{#Xby!$]ehj /7?PW\@!$0MM]fz|/=JP_f|*D!a +3%?CZk"#',?WXw ""*6J\ +#Axy22%i54BHJWdqqrvwzz"#07C[`exxxx{-AGJP[]]_c'Eg&AHk2HI_c +6PT' M)[/td_|D= +a6;Pyd_UVCFJ]e7td %/B?v:7Q)?VN/4$4Z#/DtAPOQRIn{{j"% L}4mi jj88bZDmHm@@\Y+L@ HHd%2v1x + cB,4A8HXlYCp(7BPZdsx\,cAKU_s Ad*8t,@ + ,;DVcWd6P9ND$B"`9,N8iT=qAPO5G9P+WUs\rXD@BUT@?>=<;:987543210/.-,+*)('&%$#"!  + ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y QX# D#Y!!-, EhD ` EFvhE`D-, +C#Ce +-, + C#C -,#p>#pE: -,E#DE#D-, E%EadPQXED!!Y-,Cc#b#B+-, EC`D-,CCe +-, i@a ,b`+ d#da\XaY-,E+#Dz-,E+#D-,CXE+#DzEi #D QX+#Dz!zYY-,-,%F`F@aH-,KS \XYXY-, %E#DE#DEe#E %`j #B#hj`a Ry!@E TX#!?#YaDRy@ E TX#!?#YaD-,C#C -,C#C -, C#C -, C#Ce -,C#Ce -,C#Ce -,KRXED!!Y-, %#I@` c RX#%8#%e8c8!!!!!Y-,KdQXEi C`:!!!Y-,%# `#-,%# a#-,%-, ` <<-, a <<-,++**-,CC -,>**-,5-,v#p E PXaY:/-,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,&&&&Eh:-,&&&&Ehe:-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,KTX8!!Y-,CXY-,CXY-,KTC\ZX8!!Y-,C\X %% d#dadQX%% F`H F`HY +!!!!Y-,C\X %% d#dadQX%% F`H F`HY +!!!!Y-,KS#KQZX:+!!Y-,KS#KQZX;+!!Y-,KS#KQZC\ZX8!!Y-, KT&KTZ +C\ZX8!!Y-,F#F`F# F`ab# #''pE` PXaFY`h:-,B#Q@SZX TXC`BY$QX @TXC`BY$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BYYYY-,CTXKS#KQZX8!!Y!!!!Y-92Q.9P4\NsOOMsF9*9+LsFJKQ&i tF5E; +f i 8 Yd[qch5"_oA 5#5@  @Po+N]]pO jB+9%% c:)%% B-QWk$ +4 +4 +4 @Y +4  6Mkkyy  +&CA +/&hwv v7$Z@Z!jj _/p&&%n2+NCX@  + + +MM] +MMYN]]M??9910KSy2Cy@$ &%  &  +% +% % %+++++*++]q]q++++#&&#"3267#"$54$323267W',1?\ĜvrY\ /k*ĒvՙpuwkF\>$/3qL+ @\ +4# +4 +4+ +4ghg%)(gihc "" "#."5->0P},=+N]q>-,($(( $9,(%(%$-.!=++??<<<9/<<N"! ( _  }P##(Po}"=v+Nq]rLGz+:%% #O`iuR%%Zl$6"%Pk @3hh +  '''( + +4 +4 +4 +4 +4@d +4 +4 +4      +   ffxw vv V55  nX+NMCX@M@/ ?  M]N]qM]@M@/ ?  MN]qMY??10KSyQCy@<%&& %& %%%% % % +%%++<+<+++++*+++++]q]C\X9@ 99 99 9 9 9++++++++Y++++++++q]$! '&"32765&DȞ8aOzUgEXbd_ n .Lt2@  n4L$Ϲ 9 @\ 9O& "* "" "# "#..!!`/&&-  P `  }%&!=++N]r@aK59~-<--!-5- 5EJJI5Xf5 3>-1>P>c`>r:> +P>t;H;@9;23 +,(+,%+,)<3333=3M3}33333333 p33;!eu;Lz p &++,))f/;H2]//@)+4_o@4 ,,/,?,,D)C%%%/ ?       @@>>@>`>>@(P(?+7772@#%4o0@P`=8U1+N]q+Mqq+]]q]]r<]]??9+/]q+<9]qr9]qr9999<<<]+rCTX ]Y10Cy@28:# +%&!% &9& "#:7  +" 8;++++<+++++++rq]rq]q+q+++%#"&546%54&&#"#"&546632327#"&'32IPj5@(A*&I;?Urn + 2kDPZ +y;'!-2iOk^j7)+(1EL3HFqB*@!%JCK9GQ67.#N_#@m$ Y # +,*Wf gv v +r#%!& !H +2?@ 4%%%22?(+4@ 4$8+N+]++M]N]]q++Mr??q<999]q9q910]q]rq%#"547632#"&'&'&#"326@Bof{ؑE8;M 0"4TI7K1X|yƿZ9DNd?3M;+.OEL-z@# 7- #[+  _@y!&**@2?O/K5/;=4/@ 4P//p///&&@@2?0@P.8+N]q+M]N]r+++]q+M]]<?z4Ak*&O] 5@XK]ohey% +  +"@4Vfo"w"  * + ] F(& @ 2?@"4i2? 4@5/"?"_""" )22??&04@ 4!8+N]++++M]N]++q+M++<??<<]q10Cy@%++++*+]+q]q!3267#"'&54324&'&#"] ZEa) / >@?>@9>@&'4>@4>@40>>4>@@47 /@/14@ +1/E&H ?H@ + ? HHH:@2? ::2rr/@),B@ ?B@ ?/BBBBH!@ ?@ ?/@&402?4444@!&+,@2?,@()4,@#%4,o,,P,,,wM8U+]q+++<]q+]]++]]++]q<q+]++??<+<9/9+/CTX@!4+Y+]+++++CTX>%'4>4++Y99999999910]q]+!##"'"372#"&&5467&5467&&54632"32654'&"32654'&&;1oJr-=7>OqhU~ZE^jsx]J:PO6uonA053SJCF8L,߹ 9.@/K54FP..& ", ",$@"'$"#" $ ##$!@c#($,##",f"!! +  *@!A?@EG4@=5@C5@9:4@014@'(4@+-4@"$4@4@4 @.../.p..@>5.9:4.014.'(4.4.,.4.@4.*('@!A?'/''''7:4'/14'"$4'@ !4'-N+N++++]q+LQCdk5$$!et;!7E d"$$ kj4%*#l @?$" $#$#@464@  + @464   @)    *@?:5 #44@/-04{@P`/?N+]qr]]q+++++<]<]+?.Bl[@@ZZ@@[;c7$$"c"c7%+$L@?` $"$# $@# +* @? :5 -44 #4 @#4     {/?144-.4N+++]q]]q+++++<]<?.BLvc7$$"cb7%LuFN@G@ +7<F<F67$״"-$(@"A$<#"$##@'"$'ط#@;7$;@*#B$F##"-6!<2ff + +F<;(' +H@2?H@U"4HHHHH*@=5@+-4@!"*.-@=5-@+-4---@---777*BA@"4`AAAAA/AAAAGHS!N++N]qr+54&&#"!567654&'5MNZz!PPas-'>9++X-A'-/(!/5'>;'>{TCTVZPYl4$$'a}D!?? +e%$$#1R@$K +c?$$ lj4%F7+ 9 -@8K5P-%5F!+!+$@"&$!#" +$##$ @#'$+##!  +f_@V5y+ +  *@!A?@=5 @EG4@C5@9:4@564@014@+-4@'(4@"$4@4@4@--/-p--@>5-9:4-564-014-,.4-'(4-4-@4-*''&@!A?&/&&&&7:4&/14&@ $4&,N+N+++]q+'5+VJ'5';'>yNGeK9l5$$%cs> +stream + +  +endstream +endobj +18 0 obj (Mac OS X 10.6.8 Quartz PDFContext) +endobj +19 0 obj (Adil) +endobj +20 0 obj (al-Nashir al-Sahafi Version 4.5.0) +endobj +21 0 obj (D:20110812232909Z00'00') +endobj +22 0 obj +<< +/Creator (al-Nashir al-Sahafi Version 4.5.0) +/Author (Adil) +/Producer (Mac OS X 10.6.8 Quartz PDFContext) +/ModDate (D:20110812232909Z00'00') +/CreationDate (D:20110812232909Z00'00') +>> +endobj xref +0 23 +0000000000 65535 f +0000000015 00000 n +0000000138 00000 n +0000008807 00000 n +0000000221 00000 n +0000009026 00000 n +0000008889 00000 n +0000009214 00000 n +0000034643 00000 n +0000009163 00000 n +0000009448 00000 n +0000025429 00000 n +0000026363 00000 n +0000009685 00000 n +0000034877 00000 n +0000055787 00000 n +0000055953 00000 n +0000035127 00000 n +0000056184 00000 n +0000056237 00000 n +0000056261 00000 n +0000056314 00000 n +0000056357 00000 n +trailer + +<< +/Info 22 0 R +/Root 9 0 R +/Size 23 +/ID [<0c87b1b9a219e7aeea550c93d2d72c96> <0c87b1b9a219e7aeea550c93d2d72c96>] +>> +startxref +56561 +%%EOF diff --git a/test/test_manifest.json b/test/test_manifest.json index c74af7729..90a9f8a77 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -64,6 +64,11 @@ "rounds": 1, "type": "load" }, + { "id": "complexttffont-pdf", + "file": "pdfs/complex_ttf_font.pdf", + "rounds": 1, + "type": "load" + }, { "id": "i9-pdf", "file": "pdfs/i9.pdf", "link": true,