Merge pull request #11186 from Snuffleupagus/issue-9655
Improve the heuristics, in `PartialEvaluator._buildSimpleFontToUnicode`, for glyphNames of the Cdd{d}/cdd{d} format (issue 9655)
This commit is contained in:
commit
cead77ef3a
@ -1977,7 +1977,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
* @returns {ToUnicodeMap}
|
* @returns {ToUnicodeMap}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_buildSimpleFontToUnicode(properties) {
|
_buildSimpleFontToUnicode(properties, forceGlyphs = false) {
|
||||||
assert(!properties.composite, 'Must be a simple font.');
|
assert(!properties.composite, 'Must be a simple font.');
|
||||||
|
|
||||||
let toUnicode = [], charcode, glyphName;
|
let toUnicode = [], charcode, glyphName;
|
||||||
@ -2017,14 +2017,31 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
code = parseInt(glyphName.substring(1), 16);
|
code = parseInt(glyphName.substring(1), 16);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'C': // Cddd glyph
|
case 'C': // Cdd{d} glyph
|
||||||
case 'c': // cddd glyph
|
case 'c': // cdd{d} glyph
|
||||||
if (glyphName.length >= 3) {
|
if (glyphName.length >= 3 && glyphName.length <= 4) {
|
||||||
code = +glyphName.substring(1);
|
const codeStr = glyphName.substring(1);
|
||||||
|
|
||||||
|
if (forceGlyphs) {
|
||||||
|
code = parseInt(codeStr, 16);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Normally the Cdd{d}/cdd{d} glyphName format will contain
|
||||||
|
// regular, i.e. base 10, charCodes (see issue4550.pdf)...
|
||||||
|
code = +codeStr;
|
||||||
|
|
||||||
|
// ... however some PDF generators violate that assumption by
|
||||||
|
// containing glyph, i.e. base 16, codes instead.
|
||||||
|
// In that case we need to re-parse the *entire* encoding to
|
||||||
|
// prevent broken text-selection (fixes issue9655_reduced.pdf).
|
||||||
|
if (Number.isNaN(code) &&
|
||||||
|
Number.isInteger(parseInt(codeStr, 16))) {
|
||||||
|
return this._buildSimpleFontToUnicode(properties,
|
||||||
|
/* forceGlyphs */ true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default: // 'uniXXXX'/'uXXXX{XX}' glyphs
|
||||||
// 'uniXXXX'/'uXXXX{XX}' glyphs
|
|
||||||
let unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
|
let unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);
|
||||||
if (unicode !== -1) {
|
if (unicode !== -1) {
|
||||||
code = unicode;
|
code = unicode;
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -73,6 +73,7 @@
|
|||||||
!issue9291.pdf
|
!issue9291.pdf
|
||||||
!issue9418.pdf
|
!issue9418.pdf
|
||||||
!issue9458.pdf
|
!issue9458.pdf
|
||||||
|
!issue9655_reduced.pdf
|
||||||
!issue9915_reduced.pdf
|
!issue9915_reduced.pdf
|
||||||
!issue9940.pdf
|
!issue9940.pdf
|
||||||
!issue10388_reduced.pdf
|
!issue10388_reduced.pdf
|
||||||
|
BIN
test/pdfs/issue9655_reduced.pdf
Normal file
BIN
test/pdfs/issue9655_reduced.pdf
Normal file
Binary file not shown.
@ -495,6 +495,13 @@
|
|||||||
"rounds": 1,
|
"rounds": 1,
|
||||||
"type": "text"
|
"type": "text"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue9655-text",
|
||||||
|
"file": "pdfs/issue9655_reduced.pdf",
|
||||||
|
"md5": "87259a82cf3cda18e240517ca53c312a",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": false,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
{ "id": "jai-pdf",
|
{ "id": "jai-pdf",
|
||||||
"file": "pdfs/jai.pdf",
|
"file": "pdfs/jai.pdf",
|
||||||
"md5": "1f5dd128c3757420a881a155f2f8ace3",
|
"md5": "1f5dd128c3757420a881a155f2f8ace3",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user