From 18db087f791032919e6237446e821bd1eff92f65 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Wed, 7 Dec 2011 20:59:44 -0600 Subject: [PATCH] Fixing TrueType code-glyph assigmnent to pass sanitizer --- src/fonts.js | 17 +++++++++++++++-- test/pdfs/lista_preliminar.pdf.link | 1 + test/test_manifest.json | 8 ++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 test/pdfs/lista_preliminar.pdf.link diff --git a/src/fonts.js b/src/fonts.js index 1a4366c19..fa2c0a7f1 100644 --- a/src/fonts.js +++ b/src/fonts.js @@ -1765,7 +1765,7 @@ var Font = (function Font() { var hasShortCmap = !!cmapTable.hasShortCmap; var toUnicode = this.toUnicode; - if (toUnicode) { + if (toUnicode && toUnicode.length > 0) { // checking if cmap is just identity map var isIdentity = true; for (var i = 0, ii = glyphs.length; i < ii; i++) { @@ -1776,9 +1776,22 @@ var Font = (function Font() { } // if it is, replacing with meaningful toUnicode values if (isIdentity) { + var usedUnicodes = [], unassignedUnicodeItems = []; for (var i = 0, ii = glyphs.length; i < ii; i++) { - var unicode = toUnicode[i + 1] || i + 1; + var unicode = toUnicode[i + 1]; + if (!unicode || usedUnicodes[unicode]) { + unassignedUnicodeItems.push(i); + continue; + } glyphs[i].unicode = unicode; + usedUnicodes[unicode] = true; + } + var unusedUnicode = kCmapGlyphOffset; + for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) { + var i = unassignedUnicodeItems[j]; + while (usedUnicodes[unusedUnicode]) + unusedUnicode++; + glyphs[i].unicode = unusedUnicode++; } this.useToUnicode = true; } diff --git a/test/pdfs/lista_preliminar.pdf.link b/test/pdfs/lista_preliminar.pdf.link new file mode 100644 index 000000000..54102b3b1 --- /dev/null +++ b/test/pdfs/lista_preliminar.pdf.link @@ -0,0 +1 @@ +http://www.lfg.com.br/concursodebolsas/lista_preliminar_classificao.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index bd50068f7..0e6e1913c 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -311,5 +311,13 @@ "pageLimit": 5, "skipPages": [1], "type": "eq" + }, + { "id": "lista_preliminar", + "file": "pdfs/lista_preliminar.pdf", + "md5": "4eff251319eeb660ba8a7a5cfac7787d", + "rounds": 1, + "link": true, + "pageLimit": 3, + "type": "eq" } ]