From 2a0477d3ea925e0c786ba03990891ab0220e5bcf Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 29 Aug 2011 20:26:02 -0500 Subject: [PATCH] cmap fixes: hex/dec numbers, arrays, cmaps, ranges --- pdf.js | 65 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/pdf.js b/pdf.js index 201744efe..e46207315 100644 --- a/pdf.js +++ b/pdf.js @@ -4307,53 +4307,78 @@ var PartialEvaluator = (function() { var tokens = []; var token = ''; + var beginArrayToken = {}; var cmap = cmapObj.getBytes(cmapObj.length); for (var i = 0; i < cmap.length; i++) { var byte = cmap[i]; - if (byte == 0x20 || byte == 0x0A || byte == 0x3C || - byte == 0x3E) { + if (byte == 0x20 || byte == 0x0D || byte == 0x0A || + byte == 0x3C || byte == 0x5B || byte == 0x5D) { switch (token) { - case 'useCMap': - error('useCMap is not implemented'); + case 'usecmap': + error('usecmap is not implemented'); break; case 'beginbfchar': case 'beginbfrange': - case 'begincodespacerange': + case 'begincidchar': + case 'begincidrange': token = ''; tokens = []; break; - case 'endcodespacerange': - TODO('Support CMap ranges'); - break; - + case 'endcidrange': case 'endbfrange': for (var j = 0; j < tokens.length; j += 3) { - var startRange = parseInt('0x' + tokens[j]); - var endRange = parseInt('0x' + tokens[j + 1]); - var code = parseInt('0x' + tokens[j + 2]); + var startRange = tokens[j]; + var endRange = tokens[j + 1]; + var code = tokens[j + 2]; + while(startRange < endRange) { + encodingMap[startRange] = code++; + ++startRange; + } } break; + case 'endcidchar': case 'endbfchar': for (var j = 0; j < tokens.length; j += 2) { - var index = parseInt('0x' + tokens[j]); - var code = parseInt('0x' + tokens[j + 1]); + var index = tokens[j]; + var code = tokens[j + 1]; encodingMap[index] = code; } break; + case '': + break; + default: - if (token.length) { - tokens.push(token); - token = ''; - } + if (token[0] >= '0' && token[0] <= '9') + token = parseInt(token, 10); // a number + tokens.push(token); + token = ''; break; } - } else if (byte == 0x5B || byte == 0x5D) { - error('CMAP list parsing is not implemented'); + switch (byte) { + case 0x5B: + // begin list parsing + tokens.push(beginArrayToken); + break; + case 0x5D: + // collect array items + var items = [], item; + while (tokens.length && (item = tokens.pop()) != beginArrayToken) { + items.unshift(item); + } + tokens.push(items); + break; + } + } else if (byte == 0x3E) { + if (token.length) { + // parsing hex number + tokens.push(parseInt(token, 16)); + token = ''; + } } else { token += String.fromCharCode(byte); }