From 5a528944f0e3a58d6ac0c821d31f3e1471a9a463 Mon Sep 17 00:00:00 2001 From: Adil Allawi Date: Fri, 19 Aug 2011 14:04:34 +0100 Subject: [PATCH] Change the way Type 2 CID fonts are encoded. Move the cmap glyphs above the first 255 unicode values so that fillText does not change them and create an encoding to map characters to the glyphs. --- fonts.js | 68 ++-- pdf.js | 7 +- test/pdfs/complex_ttf_font.pdf | 575 +++++++++++++++++++++++++++++++++ test/test_manifest.json | 5 + 4 files changed, 616 insertions(+), 39 deletions(-) create mode 100644 test/pdfs/complex_ttf_font.pdf diff --git a/fonts.js b/fonts.js index 1860df2e5..1aff9eb0e 100755 --- a/fonts.js +++ b/fonts.js @@ -1032,26 +1032,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 + 0xFF }); + } + + 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 + 0xFF; + } else { + for (var i in encoding) + encoding[i] = encoding[i] + 0xFF; } if (!cmap) { @@ -1274,31 +1275,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 63aefcd32..f8739aade 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,