From a74f5a57f9a07f03067f9a6163064aab9660fb1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C4=81vis=20Mos=C4=81ns?= Date: Tue, 17 Sep 2019 15:43:37 +0300 Subject: [PATCH 01/31] Get correct default font --- src/Smalot/PdfParser/PDFObject.php | 56 +++++++++++++----------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/src/Smalot/PdfParser/PDFObject.php b/src/Smalot/PdfParser/PDFObject.php index 176b22fd..95a2a6d2 100644 --- a/src/Smalot/PdfParser/PDFObject.php +++ b/src/Smalot/PdfParser/PDFObject.php @@ -238,6 +238,23 @@ public function getSectionsText($content) return $sections; } + private function getDefaultFont(Page $page = null) + { + $fonts = []; + if (!is_null($page)) { + $fonts = $page->getFonts(); + } + + $fonts = array_merge($fonts, array_values($this->document->getFonts())); + + if (count($fonts) > 0) + { + return reset($fonts); + } + + return new Font($this->document); + } + /** * @param Page * @@ -248,18 +265,7 @@ public function getText(Page $page = null) { $text = ''; $sections = $this->getSectionsText($this->content); - $current_font = null; - - foreach ($this->document->getObjects() as $obj) { - if ($obj instanceof Font) { - $current_font = $obj; - break; - } - } - - if ($current_font === null) { - $current_font = new Font($this->document); - } + $current_font = $this->getDefaultFont($page); $current_position_td = array('x' => false, 'y' => false); $current_position_tm = array('x' => false, 'y' => false); @@ -321,14 +327,6 @@ public function getText(Page $page = null) case 'Tj': $command[self::COMMAND] = array($command); case 'TJ': - // Skip if not previously defined, should never happened. - if (is_null($current_font)) { - // Fallback - // TODO : Improve - $text .= $command[self::COMMAND][0][self::COMMAND]; - break; - } - $sub_text = $current_font->decodeText($command[self::COMMAND]); $text .= $sub_text; break; @@ -447,7 +445,7 @@ public function getTextArray(Page $page = null) { $text = array(); $sections = $this->getSectionsText($this->content); - $current_font = new Font($this->document); + $current_font = $this->getDefaultFont($page); foreach ($sections as $section) { @@ -469,23 +467,17 @@ public function getTextArray(Page $page = null) break; case 'Tf': - list($id,) = preg_split('/\s/s', $command[self::COMMAND]); - $id = trim($id, '/'); - $current_font = $page->getFont($id); + if (!is_null($page)) { + list($id,) = preg_split('/\s/s', $command[self::COMMAND]); + $id = trim($id, '/'); + $current_font = $page->getFont($id); + } break; case "'": case 'Tj': $command[self::COMMAND] = array($command); case 'TJ': - // Skip if not previously defined, should never happened. - if (is_null($current_font)) { - // Fallback - // TODO : Improve - $text[] = $command[self::COMMAND][0][self::COMMAND]; - break; - } - $sub_text = $current_font->decodeText($command[self::COMMAND]); $text[] = $sub_text; break; From 49ba4ee6218d27b99b6df3eb429d5b1ab32edfaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C4=81vis=20Mos=C4=81ns?= Date: Tue, 17 Sep 2019 15:46:25 +0300 Subject: [PATCH 02/31] Create header elements with it's respective class --- src/Smalot/PdfParser/Document.php | 1 + src/Smalot/PdfParser/Header.php | 7 +++++++ src/Smalot/PdfParser/Parser.php | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Document.php b/src/Smalot/PdfParser/Document.php index 30341ff8..d77b9135 100644 --- a/src/Smalot/PdfParser/Document.php +++ b/src/Smalot/PdfParser/Document.php @@ -87,6 +87,7 @@ public function init() // Propagate init to objects. foreach ($this->objects as $object) { + $object->getHeader()->init(); $object->init(); } } diff --git a/src/Smalot/PdfParser/Header.php b/src/Smalot/PdfParser/Header.php index 95b075c4..c0b79eff 100644 --- a/src/Smalot/PdfParser/Header.php +++ b/src/Smalot/PdfParser/Header.php @@ -62,6 +62,13 @@ public function __construct($elements = array(), Document $document = null) $this->document = $document; } + public function init() + { + foreach ($this->elements as $name => $element) { + $element->init(); + } + } + /** * Returns all elements. * diff --git a/src/Smalot/PdfParser/Parser.php b/src/Smalot/PdfParser/Parser.php index a3b640e8..6be4a70a 100644 --- a/src/Smalot/PdfParser/Parser.php +++ b/src/Smalot/PdfParser/Parser.php @@ -267,7 +267,8 @@ protected function parseHeaderElement($type, $value, $document) { switch ($type) { case '<<': - return $this->parseHeader($value, $document); + $header = $this->parseHeader($value, $document); + return PDFObject::factory($document, $header, null); case 'numeric': return new ElementNumeric($value, $document); From 33a1746c6c8a699e5039f907d6ea676fbfae0ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C4=81vis=20Mos=C4=81ns?= Date: Tue, 17 Sep 2019 15:47:08 +0300 Subject: [PATCH 03/31] Properly decode ANSI encodings --- src/Smalot/PdfParser/Encoding.php | 9 +- .../PdfParser/Encoding/PostScriptGlyphs.json | 1041 +++++++++++++++++ .../PdfParser/Encoding/PostScriptGlyphs.php | 24 + src/Smalot/PdfParser/Font.php | 68 +- 4 files changed, 1089 insertions(+), 53 deletions(-) create mode 100644 src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json create mode 100644 src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php diff --git a/src/Smalot/PdfParser/Encoding.php b/src/Smalot/PdfParser/Encoding.php index 547e4360..75b70145 100644 --- a/src/Smalot/PdfParser/Encoding.php +++ b/src/Smalot/PdfParser/Encoding.php @@ -31,6 +31,7 @@ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementNumeric; +use Smalot\PdfParser\Encoding\PostScriptGlyphs; /** * Class Encoding @@ -101,12 +102,10 @@ public function init() $code++; } - // Build final mapping (custom => standard). - $table = array_flip(array_reverse($this->encoding, true)); - + $this->mapping = $this->encoding; foreach ($this->differences as $code => $difference) { /** @var string $difference */ - $this->mapping[$code] = (isset($table[$difference]) ? $table[$difference] : Font::MISSING); + $this->mapping[$code] = $difference; } } } @@ -137,6 +136,6 @@ public function translateChar($dec) $dec = $this->mapping[$dec]; } - return $dec; + return PostScriptGlyphs::getCodePoint($dec); } } diff --git a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json new file mode 100644 index 00000000..cf6dea47 --- /dev/null +++ b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json @@ -0,0 +1,1041 @@ +{ + "space": "0x00a0", + "exclam": "0x0021", + "quotedbl": "0x0022", + "numbersign": "0x0023", + "dollar": "0x0024", + "percent": "0x0025", + "ampersand": "0x0026", + "quotesingle": "0x0027", + "parenleft": "0x0028", + "parenright": "0x0029", + "asterisk": "0x002a", + "plus": "0x002b", + "comma": "0x002c", + "hyphen": "0x002d", + "period": "0x002e", + "slash": "0x002f", + "zero": "0x0030", + "one": "0x0031", + "two": "0x0032", + "three": "0x0033", + "four": "0x0034", + "five": "0x0035", + "six": "0x0036", + "seven": "0x0037", + "eight": "0x0038", + "nine": "0x0039", + "colon": "0x003a", + "semicolon": "0x003b", + "less": "0x003c", + "equal": "0x003d", + "greater": "0x003e", + "question": "0x003f", + "at": "0x0040", + "A": "0x0041", + "B": "0x0042", + "C": "0x0043", + "D": "0x0044", + "E": "0x0045", + "F": "0x0046", + "G": "0x0047", + "H": "0x0048", + "I": "0x0049", + "J": "0x004a", + "K": "0x004b", + "L": "0x004c", + "M": "0x004d", + "N": "0x004e", + "O": "0x004f", + "P": "0x0050", + "Q": "0x0051", + "R": "0x0052", + "S": "0x0053", + "T": "0x0054", + "U": "0x0055", + "V": "0x0056", + "W": "0x0057", + "X": "0x0058", + "Y": "0x0059", + "Z": "0x005a", + "bracketleft": "0x005b", + "backslash": "0x005c", + "bracketright": "0x005d", + "asciicircum": "0x005e", + "underscore": "0x005f", + "grave": "0x0060", + "a": "0x0061", + "b": "0x0062", + "c": "0x0063", + "d": "0x0064", + "e": "0x0065", + "f": "0x0066", + "g": "0x0067", + "h": "0x0068", + "i": "0x0069", + "j": "0x006a", + "k": "0x006b", + "l": "0x006c", + "m": "0x006d", + "n": "0x006e", + "o": "0x006f", + "p": "0x0070", + "q": "0x0071", + "r": "0x0072", + "s": "0x0073", + "t": "0x0074", + "u": "0x0075", + "v": "0x0076", + "w": "0x0077", + "x": "0x0078", + "y": "0x0079", + "z": "0x007a", + "braceleft": "0x007b", + "bar": "0x007c", + "braceright": "0x007d", + "asciitilde": "0x007e", + "exclamdown": "0x00a1", + "cent": "0x00a2", + "sterling": "0x00a3", + "currency": "0x00a4", + "yen": "0x00a5", + "brokenbar": "0x00a6", + "section": "0x00a7", + "dieresis": "0x00a8", + "copyright": "0x00a9", + "ordfeminine": "0x00aa", + "guillemotleft": "0x00ab", + "logicalnot": "0x00ac", + "minus": "0x2212", + "registered": "0x00ae", + "macron": "0x02c9", + "degree": "0x00b0", + "plusminus": "0x00b1", + "twosuperior": "0x00b2", + "threesuperior": "0x00b3", + "acute": "0x00b4", + "mu": "0x03bc", + "paragraph": "0x00b6", + "periodcentered": "0x2219", + "cedilla": "0x00b8", + "onesuperior": "0x00b9", + "ordmasculine": "0x00ba", + "guillemotright": "0x00bb", + "onequarter": "0x00bc", + "onehalf": "0x00bd", + "threequarters": "0x00be", + "questiondown": "0x00bf", + "Agrave": "0x00c0", + "Aacute": "0x00c1", + "Acircumflex": "0x00c2", + "Atilde": "0x00c3", + "Adieresis": "0x00c4", + "Aring": "0x00c5", + "AE": "0x00c6", + "Ccedilla": "0x00c7", + "Egrave": "0x00c8", + "Eacute": "0x00c9", + "Ecircumflex": "0x00ca", + "Edieresis": "0x00cb", + "Igrave": "0x00cc", + "Iacute": "0x00cd", + "Icircumflex": "0x00ce", + "Idieresis": "0x00cf", + "Eth": "0x00d0", + "Ntilde": "0x00d1", + "Ograve": "0x00d2", + "Oacute": "0x00d3", + "Ocircumflex": "0x00d4", + "Otilde": "0x00d5", + "Odieresis": "0x00d6", + "multiply": "0x00d7", + "Oslash": "0x00d8", + "Ugrave": "0x00d9", + "Uacute": "0x00da", + "Ucircumflex": "0x00db", + "Udieresis": "0x00dc", + "Yacute": "0x00dd", + "Thorn": "0x00de", + "germandbls": "0x00df", + "agrave": "0x00e0", + "aacute": "0x00e1", + "acircumflex": "0x00e2", + "atilde": "0x00e3", + "adieresis": "0x00e4", + "aring": "0x00e5", + "ae": "0x00e6", + "ccedilla": "0x00e7", + "egrave": "0x00e8", + "eacute": "0x00e9", + "ecircumflex": "0x00ea", + "edieresis": "0x00eb", + "igrave": "0x00ec", + "iacute": "0x00ed", + "icircumflex": "0x00ee", + "idieresis": "0x00ef", + "eth": "0x00f0", + "ntilde": "0x00f1", + "ograve": "0x00f2", + "oacute": "0x00f3", + "ocircumflex": "0x00f4", + "otilde": "0x00f5", + "odieresis": "0x00f6", + "divide": "0x00f7", + "oslash": "0x00f8", + "ugrave": "0x00f9", + "uacute": "0x00fa", + "ucircumflex": "0x00fb", + "udieresis": "0x00fc", + "yacute": "0x00fd", + "thorn": "0x00fe", + "ydieresis": "0x00ff", + "Amacron": "0x0100", + "amacron": "0x0101", + "Abreve": "0x0102", + "abreve": "0x0103", + "Aogonek": "0x0104", + "aogonek": "0x0105", + "Cacute": "0x0106", + "cacute": "0x0107", + "Ccircumflex": "0x0108", + "ccircumflex": "0x0109", + "Cdotaccent": "0x010a", + "cdotaccent": "0x010b", + "Ccaron": "0x010c", + "ccaron": "0x010d", + "Dcaron": "0x010e", + "dcaron": "0x010f", + "Dcroat": "0x0110", + "dcroat": "0x0111", + "Emacron": "0x0112", + "emacron": "0x0113", + "Ebreve": "0x0114", + "ebreve": "0x0115", + "Edotaccent": "0x0116", + "edotaccent": "0x0117", + "Eogonek": "0x0118", + "eogonek": "0x0119", + "Ecaron": "0x011a", + "ecaron": "0x011b", + "Gcircumflex": "0x011c", + "gcircumflex": "0x011d", + "Gbreve": "0x011e", + "gbreve": "0x011f", + "Gdotaccent": "0x0120", + "gdotaccent": "0x0121", + "Gcommaaccent": "0x0122", + "gcommaaccent": "0x0123", + "Hcircumflex": "0x0124", + "hcircumflex": "0x0125", + "Hbar": "0x0126", + "hbar": "0x0127", + "Itilde": "0x0128", + "itilde": "0x0129", + "Imacron": "0x012a", + "imacron": "0x012b", + "Ibreve": "0x012c", + "ibreve": "0x012d", + "Iogonek": "0x012e", + "iogonek": "0x012f", + "Idotaccent": "0x0130", + "dotlessi": "0x0131", + "IJ": "0x0132", + "ij": "0x0133", + "Jcircumflex": "0x0134", + "jcircumflex": "0x0135", + "Kcommaaccent": "0x0136", + "kcommaaccent": "0x0137", + "kgreenlandic": "0x0138", + "Lacute": "0x0139", + "lacute": "0x013a", + "Lcommaaccent": "0x013b", + "lcommaaccent": "0x013c", + "Lcaron": "0x013d", + "lcaron": "0x013e", + "Ldot": "0x013f", + "ldot": "0x0140", + "Lslash": "0x0141", + "lslash": "0x0142", + "Nacute": "0x0143", + "nacute": "0x0144", + "Ncommaaccent": "0x0145", + "ncommaaccent": "0x0146", + "Ncaron": "0x0147", + "ncaron": "0x0148", + "napostrophe": "0x0149", + "Eng": "0x014a", + "eng": "0x014b", + "Omacron": "0x014c", + "omacron": "0x014d", + "Obreve": "0x014e", + "obreve": "0x014f", + "Ohungarumlaut": "0x0150", + "ohungarumlaut": "0x0151", + "OE": "0x0152", + "oe": "0x0153", + "Racute": "0x0154", + "racute": "0x0155", + "Rcommaaccent": "0x0156", + "rcommaaccent": "0x0157", + "Rcaron": "0x0158", + "rcaron": "0x0159", + "Sacute": "0x015a", + "sacute": "0x015b", + "Scircumflex": "0x015c", + "scircumflex": "0x015d", + "Scedilla": "0xf6c1", + "scedilla": "0xf6c2", + "Scaron": "0x0160", + "scaron": "0x0161", + "Tcommaaccent": "0x021a", + "tcommaaccent": "0x021b", + "Tcaron": "0x0164", + "tcaron": "0x0165", + "Tbar": "0x0166", + "tbar": "0x0167", + "Utilde": "0x0168", + "utilde": "0x0169", + "Umacron": "0x016a", + "umacron": "0x016b", + "Ubreve": "0x016c", + "ubreve": "0x016d", + "Uring": "0x016e", + "uring": "0x016f", + "Uhungarumlaut": "0x0170", + "uhungarumlaut": "0x0171", + "Uogonek": "0x0172", + "uogonek": "0x0173", + "Wcircumflex": "0x0174", + "wcircumflex": "0x0175", + "Ycircumflex": "0x0176", + "ycircumflex": "0x0177", + "Ydieresis": "0x0178", + "Zacute": "0x0179", + "zacute": "0x017a", + "Zdotaccent": "0x017b", + "zdotaccent": "0x017c", + "Zcaron": "0x017d", + "zcaron": "0x017e", + "longs": "0x017f", + "florin": "0x0192", + "Ohorn": "0x01a0", + "ohorn": "0x01a1", + "Uhorn": "0x01af", + "uhorn": "0x01b0", + "Gcaron": "0x01e6", + "gcaron": "0x01e7", + "Aringacute": "0x01fa", + "aringacute": "0x01fb", + "AEacute": "0x01fc", + "aeacute": "0x01fd", + "Oslashacute": "0x01fe", + "oslashacute": "0x01ff", + "Scommaaccent": "0x0218", + "scommaaccent": "0x0219", + "afii57929": "0x02bc", + "afii64937": "0x02bd", + "circumflex": "0x02c6", + "caron": "0x02c7", + "breve": "0x02d8", + "dotaccent": "0x02d9", + "ring": "0x02da", + "ogonek": "0x02db", + "tilde": "0x02dc", + "hungarumlaut": "0x02dd", + "gravecomb": "0x0300", + "acutecomb": "0x0301", + "tildecomb": "0x0303", + "hookabovecomb": "0x0309", + "dotbelowcomb": "0x0323", + "tonos": "0x0384", + "dieresistonos": "0x0385", + "Alphatonos": "0x0386", + "anoteleia": "0x0387", + "Epsilontonos": "0x0388", + "Etatonos": "0x0389", + "Iotatonos": "0x038a", + "Omicrontonos": "0x038c", + "Upsilontonos": "0x038e", + "Omegatonos": "0x038f", + "iotadieresistonos": "0x0390", + "Alpha": "0x0391", + "Beta": "0x0392", + "Gamma": "0x0393", + "Delta": "0x2206", + "Epsilon": "0x0395", + "Zeta": "0x0396", + "Eta": "0x0397", + "Theta": "0x0398", + "Iota": "0x0399", + "Kappa": "0x039a", + "Lambda": "0x039b", + "Mu": "0x039c", + "Nu": "0x039d", + "Xi": "0x039e", + "Omicron": "0x039f", + "Pi": "0x03a0", + "Rho": "0x03a1", + "Sigma": "0x03a3", + "Tau": "0x03a4", + "Upsilon": "0x03a5", + "Phi": "0x03a6", + "Chi": "0x03a7", + "Psi": "0x03a8", + "Omega": "0x2126", + "Iotadieresis": "0x03aa", + "Upsilondieresis": "0x03ab", + "alphatonos": "0x03ac", + "epsilontonos": "0x03ad", + "etatonos": "0x03ae", + "iotatonos": "0x03af", + "upsilondieresistonos": "0x03b0", + "alpha": "0x03b1", + "beta": "0x03b2", + "gamma": "0x03b3", + "delta": "0x03b4", + "epsilon": "0x03b5", + "zeta": "0x03b6", + "eta": "0x03b7", + "theta": "0x03b8", + "iota": "0x03b9", + "kappa": "0x03ba", + "lambda": "0x03bb", + "nu": "0x03bd", + "xi": "0x03be", + "omicron": "0x03bf", + "pi": "0x03c0", + "rho": "0x03c1", + "sigma1": "0x03c2", + "sigma": "0x03c3", + "tau": "0x03c4", + "upsilon": "0x03c5", + "phi": "0x03c6", + "chi": "0x03c7", + "psi": "0x03c8", + "omega": "0x03c9", + "iotadieresis": "0x03ca", + "upsilondieresis": "0x03cb", + "omicrontonos": "0x03cc", + "upsilontonos": "0x03cd", + "omegatonos": "0x03ce", + "theta1": "0x03d1", + "Upsilon1": "0x03d2", + "phi1": "0x03d5", + "omega1": "0x03d6", + "afii10023": "0x0401", + "afii10051": "0x0402", + "afii10052": "0x0403", + "afii10053": "0x0404", + "afii10054": "0x0405", + "afii10055": "0x0406", + "afii10056": "0x0407", + "afii10057": "0x0408", + "afii10058": "0x0409", + "afii10059": "0x040a", + "afii10060": "0x040b", + "afii10061": "0x040c", + "afii10062": "0x040e", + "afii10145": "0x040f", + "afii10017": "0x0410", + "afii10018": "0x0411", + "afii10019": "0x0412", + "afii10020": "0x0413", + "afii10021": "0x0414", + "afii10022": "0x0415", + "afii10024": "0x0416", + "afii10025": "0x0417", + "afii10026": "0x0418", + "afii10027": "0x0419", + "afii10028": "0x041a", + "afii10029": "0x041b", + "afii10030": "0x041c", + "afii10031": "0x041d", + "afii10032": "0x041e", + "afii10033": "0x041f", + "afii10034": "0x0420", + "afii10035": "0x0421", + "afii10036": "0x0422", + "afii10037": "0x0423", + "afii10038": "0x0424", + "afii10039": "0x0425", + "afii10040": "0x0426", + "afii10041": "0x0427", + "afii10042": "0x0428", + "afii10043": "0x0429", + "afii10044": "0x042a", + "afii10045": "0x042b", + "afii10046": "0x042c", + "afii10047": "0x042d", + "afii10048": "0x042e", + "afii10049": "0x042f", + "afii10065": "0x0430", + "afii10066": "0x0431", + "afii10067": "0x0432", + "afii10068": "0x0433", + "afii10069": "0x0434", + "afii10070": "0x0435", + "afii10072": "0x0436", + "afii10073": "0x0437", + "afii10074": "0x0438", + "afii10075": "0x0439", + "afii10076": "0x043a", + "afii10077": "0x043b", + "afii10078": "0x043c", + "afii10079": "0x043d", + "afii10080": "0x043e", + "afii10081": "0x043f", + "afii10082": "0x0440", + "afii10083": "0x0441", + "afii10084": "0x0442", + "afii10085": "0x0443", + "afii10086": "0x0444", + "afii10087": "0x0445", + "afii10088": "0x0446", + "afii10089": "0x0447", + "afii10090": "0x0448", + "afii10091": "0x0449", + "afii10092": "0x044a", + "afii10093": "0x044b", + "afii10094": "0x044c", + "afii10095": "0x044d", + "afii10096": "0x044e", + "afii10097": "0x044f", + "afii10071": "0x0451", + "afii10099": "0x0452", + "afii10100": "0x0453", + "afii10101": "0x0454", + "afii10102": "0x0455", + "afii10103": "0x0456", + "afii10104": "0x0457", + "afii10105": "0x0458", + "afii10106": "0x0459", + "afii10107": "0x045a", + "afii10108": "0x045b", + "afii10109": "0x045c", + "afii10110": "0x045e", + "afii10193": "0x045f", + "afii10146": "0x0462", + "afii10194": "0x0463", + "afii10147": "0x0472", + "afii10195": "0x0473", + "afii10148": "0x0474", + "afii10196": "0x0475", + "afii10050": "0x0490", + "afii10098": "0x0491", + "afii10846": "0x04d9", + "afii57799": "0x05b0", + "afii57801": "0x05b1", + "afii57800": "0x05b2", + "afii57802": "0x05b3", + "afii57793": "0x05b4", + "afii57794": "0x05b5", + "afii57795": "0x05b6", + "afii57798": "0x05b7", + "afii57797": "0x05b8", + "afii57806": "0x05b9", + "afii57796": "0x05bb", + "afii57807": "0x05bc", + "afii57839": "0x05bd", + "afii57645": "0x05be", + "afii57841": "0x05bf", + "afii57842": "0x05c0", + "afii57804": "0x05c1", + "afii57803": "0x05c2", + "afii57658": "0x05c3", + "afii57664": "0x05d0", + "afii57665": "0x05d1", + "afii57666": "0x05d2", + "afii57667": "0x05d3", + "afii57668": "0x05d4", + "afii57669": "0x05d5", + "afii57670": "0x05d6", + "afii57671": "0x05d7", + "afii57672": "0x05d8", + "afii57673": "0x05d9", + "afii57674": "0x05da", + "afii57675": "0x05db", + "afii57676": "0x05dc", + "afii57677": "0x05dd", + "afii57678": "0x05de", + "afii57679": "0x05df", + "afii57680": "0x05e0", + "afii57681": "0x05e1", + "afii57682": "0x05e2", + "afii57683": "0x05e3", + "afii57684": "0x05e4", + "afii57685": "0x05e5", + "afii57686": "0x05e6", + "afii57687": "0x05e7", + "afii57688": "0x05e8", + "afii57689": "0x05e9", + "afii57690": "0x05ea", + "afii57716": "0x05f0", + "afii57717": "0x05f1", + "afii57718": "0x05f2", + "afii57388": "0x060c", + "afii57403": "0x061b", + "afii57407": "0x061f", + "afii57409": "0x0621", + "afii57410": "0x0622", + "afii57411": "0x0623", + "afii57412": "0x0624", + "afii57413": "0x0625", + "afii57414": "0x0626", + "afii57415": "0x0627", + "afii57416": "0x0628", + "afii57417": "0x0629", + "afii57418": "0x062a", + "afii57419": "0x062b", + "afii57420": "0x062c", + "afii57421": "0x062d", + "afii57422": "0x062e", + "afii57423": "0x062f", + "afii57424": "0x0630", + "afii57425": "0x0631", + "afii57426": "0x0632", + "afii57427": "0x0633", + "afii57428": "0x0634", + "afii57429": "0x0635", + "afii57430": "0x0636", + "afii57431": "0x0637", + "afii57432": "0x0638", + "afii57433": "0x0639", + "afii57434": "0x063a", + "afii57440": "0x0640", + "afii57441": "0x0641", + "afii57442": "0x0642", + "afii57443": "0x0643", + "afii57444": "0x0644", + "afii57445": "0x0645", + "afii57446": "0x0646", + "afii57470": "0x0647", + "afii57448": "0x0648", + "afii57449": "0x0649", + "afii57450": "0x064a", + "afii57451": "0x064b", + "afii57452": "0x064c", + "afii57453": "0x064d", + "afii57454": "0x064e", + "afii57455": "0x064f", + "afii57456": "0x0650", + "afii57457": "0x0651", + "afii57458": "0x0652", + "afii57392": "0x0660", + "afii57393": "0x0661", + "afii57394": "0x0662", + "afii57395": "0x0663", + "afii57396": "0x0664", + "afii57397": "0x0665", + "afii57398": "0x0666", + "afii57399": "0x0667", + "afii57400": "0x0668", + "afii57401": "0x0669", + "afii57381": "0x066a", + "afii63167": "0x066d", + "afii57511": "0x0679", + "afii57506": "0x067e", + "afii57507": "0x0686", + "afii57512": "0x0688", + "afii57513": "0x0691", + "afii57508": "0x0698", + "afii57505": "0x06a4", + "afii57509": "0x06af", + "afii57514": "0x06ba", + "afii57519": "0x06d2", + "afii57534": "0x06d5", + "Wgrave": "0x1e80", + "wgrave": "0x1e81", + "Wacute": "0x1e82", + "wacute": "0x1e83", + "Wdieresis": "0x1e84", + "wdieresis": "0x1e85", + "Ygrave": "0x1ef2", + "ygrave": "0x1ef3", + "afii61664": "0x200c", + "afii301": "0x200d", + "afii299": "0x200e", + "afii300": "0x200f", + "figuredash": "0x2012", + "endash": "0x2013", + "emdash": "0x2014", + "afii00208": "0x2015", + "underscoredbl": "0x2017", + "quoteleft": "0x2018", + "quoteright": "0x2019", + "quotesinglbase": "0x201a", + "quotereversed": "0x201b", + "quotedblleft": "0x201c", + "quotedblright": "0x201d", + "quotedblbase": "0x201e", + "dagger": "0x2020", + "daggerdbl": "0x2021", + "bullet": "0x2022", + "onedotenleader": "0x2024", + "twodotenleader": "0x2025", + "ellipsis": "0x2026", + "afii61573": "0x202c", + "afii61574": "0x202d", + "afii61575": "0x202e", + "perthousand": "0x2030", + "minute": "0x2032", + "second": "0x2033", + "guilsinglleft": "0x2039", + "guilsinglright": "0x203a", + "exclamdbl": "0x203c", + "fraction": "0x2215", + "zerosuperior": "0x2070", + "foursuperior": "0x2074", + "fivesuperior": "0x2075", + "sixsuperior": "0x2076", + "sevensuperior": "0x2077", + "eightsuperior": "0x2078", + "ninesuperior": "0x2079", + "parenleftsuperior": "0x207d", + "parenrightsuperior": "0x207e", + "nsuperior": "0x207f", + "zeroinferior": "0x2080", + "oneinferior": "0x2081", + "twoinferior": "0x2082", + "threeinferior": "0x2083", + "fourinferior": "0x2084", + "fiveinferior": "0x2085", + "sixinferior": "0x2086", + "seveninferior": "0x2087", + "eightinferior": "0x2088", + "nineinferior": "0x2089", + "parenleftinferior": "0x208d", + "parenrightinferior": "0x208e", + "colonmonetary": "0x20a1", + "franc": "0x20a3", + "lira": "0x20a4", + "peseta": "0x20a7", + "afii57636": "0x20aa", + "dong": "0x20ab", + "Euro": "0x20ac", + "afii61248": "0x2105", + "Ifraktur": "0x2111", + "afii61289": "0x2113", + "afii61352": "0x2116", + "weierstrass": "0x2118", + "Rfraktur": "0x211c", + "prescription": "0x211e", + "trademark": "0x2122", + "estimated": "0x212e", + "aleph": "0x2135", + "onethird": "0x2153", + "twothirds": "0x2154", + "oneeighth": "0x215b", + "threeeighths": "0x215c", + "fiveeighths": "0x215d", + "seveneighths": "0x215e", + "arrowleft": "0x2190", + "arrowup": "0x2191", + "arrowright": "0x2192", + "arrowdown": "0x2193", + "arrowboth": "0x2194", + "arrowupdn": "0x2195", + "arrowupdnbse": "0x21a8", + "carriagereturn": "0x21b5", + "arrowdblleft": "0x21d0", + "arrowdblup": "0x21d1", + "arrowdblright": "0x21d2", + "arrowdbldown": "0x21d3", + "arrowdblboth": "0x21d4", + "universal": "0x2200", + "partialdiff": "0x2202", + "existential": "0x2203", + "emptyset": "0x2205", + "gradient": "0x2207", + "element": "0x2208", + "notelement": "0x2209", + "suchthat": "0x220b", + "product": "0x220f", + "summation": "0x2211", + "asteriskmath": "0x2217", + "radical": "0x221a", + "proportional": "0x221d", + "infinity": "0x221e", + "orthogonal": "0x221f", + "angle": "0x2220", + "logicaland": "0x2227", + "logicalor": "0x2228", + "intersection": "0x2229", + "union": "0x222a", + "integral": "0x222b", + "therefore": "0x2234", + "similar": "0x223c", + "congruent": "0x2245", + "approxequal": "0x2248", + "notequal": "0x2260", + "equivalence": "0x2261", + "lessequal": "0x2264", + "greaterequal": "0x2265", + "propersubset": "0x2282", + "propersuperset": "0x2283", + "notsubset": "0x2284", + "reflexsubset": "0x2286", + "reflexsuperset": "0x2287", + "circleplus": "0x2295", + "circlemultiply": "0x2297", + "perpendicular": "0x22a5", + "dotmath": "0x22c5", + "house": "0x2302", + "revlogicalnot": "0x2310", + "integraltp": "0x2320", + "integralbt": "0x2321", + "angleleft": "0x2329", + "angleright": "0x232a", + "SF100000": "0x2500", + "SF110000": "0x2502", + "SF010000": "0x250c", + "SF030000": "0x2510", + "SF020000": "0x2514", + "SF040000": "0x2518", + "SF080000": "0x251c", + "SF090000": "0x2524", + "SF060000": "0x252c", + "SF070000": "0x2534", + "SF050000": "0x253c", + "SF430000": "0x2550", + "SF240000": "0x2551", + "SF510000": "0x2552", + "SF520000": "0x2553", + "SF390000": "0x2554", + "SF220000": "0x2555", + "SF210000": "0x2556", + "SF250000": "0x2557", + "SF500000": "0x2558", + "SF490000": "0x2559", + "SF380000": "0x255a", + "SF280000": "0x255b", + "SF270000": "0x255c", + "SF260000": "0x255d", + "SF360000": "0x255e", + "SF370000": "0x255f", + "SF420000": "0x2560", + "SF190000": "0x2561", + "SF200000": "0x2562", + "SF230000": "0x2563", + "SF470000": "0x2564", + "SF480000": "0x2565", + "SF410000": "0x2566", + "SF450000": "0x2567", + "SF460000": "0x2568", + "SF400000": "0x2569", + "SF540000": "0x256a", + "SF530000": "0x256b", + "SF440000": "0x256c", + "upblock": "0x2580", + "dnblock": "0x2584", + "block": "0x2588", + "lfblock": "0x258c", + "rtblock": "0x2590", + "ltshade": "0x2591", + "shade": "0x2592", + "dkshade": "0x2593", + "filledbox": "0x25a0", + "H22073": "0x25a1", + "H18543": "0x25aa", + "H18551": "0x25ab", + "filledrect": "0x25ac", + "triagup": "0x25b2", + "triagrt": "0x25ba", + "triagdn": "0x25bc", + "triaglf": "0x25c4", + "lozenge": "0x25ca", + "circle": "0x25cb", + "H18533": "0x25cf", + "invbullet": "0x25d8", + "invcircle": "0x25d9", + "openbullet": "0x25e6", + "smileface": "0x263a", + "invsmileface": "0x263b", + "sun": "0x263c", + "female": "0x2640", + "male": "0x2642", + "spade": "0x2660", + "club": "0x2663", + "heart": "0x2665", + "diamond": "0x2666", + "musicalnote": "0x266a", + "musicalnotedbl": "0x266b", + "dotlessj": "0xf6be", + "LL": "0xf6bf", + "ll": "0xf6c0", + "commaaccent": "0xf6c3", + "afii10063": "0xf6c4", + "afii10064": "0xf6c5", + "afii10192": "0xf6c6", + "afii10831": "0xf6c7", + "afii10832": "0xf6c8", + "Acute": "0xf6c9", + "Caron": "0xf6ca", + "Dieresis": "0xf6cb", + "DieresisAcute": "0xf6cc", + "DieresisGrave": "0xf6cd", + "Grave": "0xf6ce", + "Hungarumlaut": "0xf6cf", + "Macron": "0xf6d0", + "cyrBreve": "0xf6d1", + "cyrFlex": "0xf6d2", + "dblGrave": "0xf6d3", + "cyrbreve": "0xf6d4", + "cyrflex": "0xf6d5", + "dblgrave": "0xf6d6", + "dieresisacute": "0xf6d7", + "dieresisgrave": "0xf6d8", + "copyrightserif": "0xf6d9", + "registerserif": "0xf6da", + "trademarkserif": "0xf6db", + "onefitted": "0xf6dc", + "rupiah": "0xf6dd", + "threequartersemdash": "0xf6de", + "centinferior": "0xf6df", + "centsuperior": "0xf6e0", + "commainferior": "0xf6e1", + "commasuperior": "0xf6e2", + "dollarinferior": "0xf6e3", + "dollarsuperior": "0xf6e4", + "hypheninferior": "0xf6e5", + "hyphensuperior": "0xf6e6", + "periodinferior": "0xf6e7", + "periodsuperior": "0xf6e8", + "asuperior": "0xf6e9", + "bsuperior": "0xf6ea", + "dsuperior": "0xf6eb", + "esuperior": "0xf6ec", + "isuperior": "0xf6ed", + "lsuperior": "0xf6ee", + "msuperior": "0xf6ef", + "osuperior": "0xf6f0", + "rsuperior": "0xf6f1", + "ssuperior": "0xf6f2", + "tsuperior": "0xf6f3", + "Brevesmall": "0xf6f4", + "Caronsmall": "0xf6f5", + "Circumflexsmall": "0xf6f6", + "Dotaccentsmall": "0xf6f7", + "Hungarumlautsmall": "0xf6f8", + "Lslashsmall": "0xf6f9", + "OEsmall": "0xf6fa", + "Ogoneksmall": "0xf6fb", + "Ringsmall": "0xf6fc", + "Scaronsmall": "0xf6fd", + "Tildesmall": "0xf6fe", + "Zcaronsmall": "0xf6ff", + "exclamsmall": "0xf721", + "dollaroldstyle": "0xf724", + "ampersandsmall": "0xf726", + "zerooldstyle": "0xf730", + "oneoldstyle": "0xf731", + "twooldstyle": "0xf732", + "threeoldstyle": "0xf733", + "fouroldstyle": "0xf734", + "fiveoldstyle": "0xf735", + "sixoldstyle": "0xf736", + "sevenoldstyle": "0xf737", + "eightoldstyle": "0xf738", + "nineoldstyle": "0xf739", + "questionsmall": "0xf73f", + "Gravesmall": "0xf760", + "Asmall": "0xf761", + "Bsmall": "0xf762", + "Csmall": "0xf763", + "Dsmall": "0xf764", + "Esmall": "0xf765", + "Fsmall": "0xf766", + "Gsmall": "0xf767", + "Hsmall": "0xf768", + "Ismall": "0xf769", + "Jsmall": "0xf76a", + "Ksmall": "0xf76b", + "Lsmall": "0xf76c", + "Msmall": "0xf76d", + "Nsmall": "0xf76e", + "Osmall": "0xf76f", + "Psmall": "0xf770", + "Qsmall": "0xf771", + "Rsmall": "0xf772", + "Ssmall": "0xf773", + "Tsmall": "0xf774", + "Usmall": "0xf775", + "Vsmall": "0xf776", + "Wsmall": "0xf777", + "Xsmall": "0xf778", + "Ysmall": "0xf779", + "Zsmall": "0xf77a", + "exclamdownsmall": "0xf7a1", + "centoldstyle": "0xf7a2", + "Dieresissmall": "0xf7a8", + "Macronsmall": "0xf7af", + "Acutesmall": "0xf7b4", + "Cedillasmall": "0xf7b8", + "questiondownsmall": "0xf7bf", + "Agravesmall": "0xf7e0", + "Aacutesmall": "0xf7e1", + "Acircumflexsmall": "0xf7e2", + "Atildesmall": "0xf7e3", + "Adieresissmall": "0xf7e4", + "Aringsmall": "0xf7e5", + "AEsmall": "0xf7e6", + "Ccedillasmall": "0xf7e7", + "Egravesmall": "0xf7e8", + "Eacutesmall": "0xf7e9", + "Ecircumflexsmall": "0xf7ea", + "Edieresissmall": "0xf7eb", + "Igravesmall": "0xf7ec", + "Iacutesmall": "0xf7ed", + "Icircumflexsmall": "0xf7ee", + "Idieresissmall": "0xf7ef", + "Ethsmall": "0xf7f0", + "Ntildesmall": "0xf7f1", + "Ogravesmall": "0xf7f2", + "Oacutesmall": "0xf7f3", + "Ocircumflexsmall": "0xf7f4", + "Otildesmall": "0xf7f5", + "Odieresissmall": "0xf7f6", + "Oslashsmall": "0xf7f8", + "Ugravesmall": "0xf7f9", + "Uacutesmall": "0xf7fa", + "Ucircumflexsmall": "0xf7fb", + "Udieresissmall": "0xf7fc", + "Yacutesmall": "0xf7fd", + "Thornsmall": "0xf7fe", + "Ydieresissmall": "0xf7ff", + "radicalex": "0xf8e5", + "arrowvertex": "0xf8e6", + "arrowhorizex": "0xf8e7", + "registersans": "0xf8e8", + "copyrightsans": "0xf8e9", + "trademarksans": "0xf8ea", + "parenlefttp": "0xf8eb", + "parenleftex": "0xf8ec", + "parenleftbt": "0xf8ed", + "bracketlefttp": "0xf8ee", + "bracketleftex": "0xf8ef", + "bracketleftbt": "0xf8f0", + "bracelefttp": "0xf8f1", + "braceleftmid": "0xf8f2", + "braceleftbt": "0xf8f3", + "braceex": "0xf8f4", + "integralex": "0xf8f5", + "parenrighttp": "0xf8f6", + "parenrightex": "0xf8f7", + "parenrightbt": "0xf8f8", + "bracketrighttp": "0xf8f9", + "bracketrightex": "0xf8fa", + "bracketrightbt": "0xf8fb", + "bracerighttp": "0xf8fc", + "bracerightmid": "0xf8fd", + "bracerightbt": "0xf8fe", + "ff": "0xfb00", + "fi": "0xfb01", + "fl": "0xfb02", + "ffi": "0xfb03", + "ffl": "0xfb04", + "afii57705": "0xfb1f", + "afii57694": "0xfb2a", + "afii57695": "0xfb2b", + "afii57723": "0xfb35", + "afii57700": "0xfb4b" +} diff --git a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php new file mode 100644 index 00000000..cd904269 --- /dev/null +++ b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php @@ -0,0 +1,24 @@ +getFontSpaceLimit(); foreach ($commands as $command) { @@ -372,11 +371,6 @@ public function decodeText($commands) case '<': // Decode hexadecimal. $text = self::decodeHexadecimal('<' . $command[PDFObject::COMMAND] . '>'); - - if (mb_check_encoding($text, "UTF-8")) { - $unicode = true; - } - break; default: @@ -400,8 +394,7 @@ public function decodeText($commands) } foreach ($words as &$word) { - $loop_unicode = $unicode; - $word = $this->decodeContent($word, $loop_unicode); + $word = $this->decodeContent($word); } return implode(' ', $words); @@ -413,7 +406,7 @@ public function decodeText($commands) * * @return string */ - protected function decodeContent($text, &$unicode) + protected function decodeContent($text) { if ($this->has('ToUnicode')) { @@ -459,62 +452,41 @@ protected function decodeContent($text, &$unicode) } $text = $result; - - // By definition, this code generates unicode chars. - $unicode = true; } - } elseif ($this->has('Encoding')) { + } elseif ($this->has('Encoding') && $this->get('Encoding') instanceof Encoding) { /** @var Encoding $encoding */ $encoding = $this->get('Encoding'); - - if ($encoding instanceof Encoding) { - if ($unicode) { - $chars = preg_split( + $unicode = mb_check_encoding($text, "UTF-8"); + $result = ''; + if ($unicode) { + $chars = preg_split( '//s' . ($unicode ? 'u' : ''), $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY - ); - $result = ''; + ); - foreach ($chars as $char) { + foreach ($chars as $char) { $dec_av = hexdec(bin2hex($char)); $dec_ap = $encoding->translateChar($dec_av); $result .= self::uchr($dec_ap); - } - - $text = $result; - } else { - $result = ''; - $length = strlen($text); + } + } else { + $length = strlen($text); - for ($i = 0; $i < $length; $i++) { + for ($i = 0; $i < $length; $i++) { $dec_av = hexdec(bin2hex($text[$i])); $dec_ap = $encoding->translateChar($dec_av); - $result .= chr($dec_ap); - } - - $text = $result; - - if ($encoding->get('BaseEncoding')->equals('MacRomanEncoding')) { - $text = mb_convert_encoding($text, 'UTF-8', 'Mac'); - - return $text; - } + $result .= self::uchr($dec_ap); } - } - } - - // Convert to unicode if not already done. - if (!$unicode) { - if ($this->get('Encoding') instanceof Element && - $this->get('Encoding')->equals('MacRomanEncoding') - ) { - $text = mb_convert_encoding($text, 'UTF-8', 'Mac'); - } else { - $text = mb_convert_encoding($text, 'UTF-8', 'Windows-1252'); } + $text = $result; + } elseif ($this->get('Encoding') instanceof Element && + $this->get('Encoding')->equals('MacRomanEncoding')) { + $text = mb_convert_encoding($text, 'UTF-8', 'Mac'); + } else { + $text = mb_convert_encoding($text, 'UTF-8', 'Windows-1252'); } return $text; From b5ddbf73ff70a4579e467e02458e051c7b34506d Mon Sep 17 00:00:00 2001 From: Connum Date: Sat, 26 Sep 2020 14:55:15 +0200 Subject: [PATCH 04/31] allow for line breaks when splitting xrefs for id and position --- src/Smalot/PdfParser/Parser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Parser.php b/src/Smalot/PdfParser/Parser.php index a67f3330..b12c7b9a 100644 --- a/src/Smalot/PdfParser/Parser.php +++ b/src/Smalot/PdfParser/Parser.php @@ -190,7 +190,7 @@ protected function parseObject($id, $structure, $document) $table = []; foreach ($xrefs as $xref) { - list($id, $position) = explode(' ', trim($xref)); + list($id, $position) = preg_split("/\s+/", trim($xref)); $table[$position] = $id; } From c800c65e624397eca03143a3eaca3e17388dbbe2 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 15:45:25 +0200 Subject: [PATCH 05/31] extend TestCase.php with functionality to "catch" E_NOTICE and E_WARNING --- tests/TestCase.php | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/TestCase.php b/tests/TestCase.php index fbcf67cb..34bb0b3f 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -46,6 +46,27 @@ abstract class TestCase extends PHPTestCase protected $rootDir; + private $errorHandlerChanged = false; + + private $catchAllErrorHandler; + + function __construct() { + parent::__construct(); + + // PHP does not implement setting a class property to an anonymous function, + // so we have to do it in the constructor. + $this->catchAllErrorHandler = function ($typeNumber, $message, $file, $lineNumber) { + $this->fail( + sprintf('%s: "%s" in %s:%d', + $this->getErrorType($typeNumber), + $message, + $file, + $lineNumber + ) + ); + }; + } + public function setUp() { parent::setUp(); @@ -53,6 +74,50 @@ public function setUp() $this->rootDir = __DIR__.'/..'; } + public function tearDown() { + // if we changed the error handler using catchAllErrors(), reset it now + if($this->errorHandlerChanged) { + restore_error_handler(); + } + } + + /** + * This temporarily changes the PHP-internal error handler + * in order to allow catching errors of type E_WARNING, E_NOTICE etc., + * which are not catchable via a try/catch statement. + * It will fail the current test from which it is run, + * giving a descriptive message. + * + * This can come in handy to make tests for making sure that such + * errors are not triggered by the code. + */ + protected function catchAllErrors() { + $this->errorHandlerChanged = true; + set_error_handler($this->catchAllErrorHandler); + } + + protected function getErrorType($typeNumber) { + $errorConstants = [ + 1 => 'E_ERROR', + 2 => 'E_WARNING', + 4 => 'E_PARSE', + 8 => 'E_NOTICE', + 16 => 'E_CORE_ERROR', + 32 => 'E_CORE_WARNING', + 64 => 'E_COMPILE_ERROR', + 128 => 'E_COMPILE_WARNING', + 256 => 'E_USER_ERROR', + 512 => 'E_USER_WARNING', + 1024 => 'E_USER_NOTICE', + 2048 => 'E_STRICT', + 4096 => 'E_RECOVERABLE_ERROR', + 8192 => 'E_DEPRECATED', + 16384 => 'E_USER_DEPRECATED', + 32767 => 'E_ALL' + ]; + return $errorConstants[$typeNumber]; + } + protected function getDocumentInstance() { return new Document(); From d87b51a675174d4cc7b015c8f49ba34e74140148 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 15:45:51 +0200 Subject: [PATCH 06/31] added test case for this fix --- tests/Integration/ParserTest.php | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index 6e02490e..8dd4750a 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -34,6 +34,7 @@ use Exception; use Smalot\PdfParser\Parser; +use Smalot\PdfParser\Document; use Smalot\PdfParser\XObject\Image; use Tests\Smalot\PdfParser\TestCase; @@ -77,6 +78,43 @@ public function testParseFile() } } + public function testIssue19() + { + ini_set('display_errors', 1); + $fixture = new ParserSub(); + $structure = [ + [ + '<<', + [ + [ + '/', + 'Type', + 7735, + ], + [ + '/', + 'ObjStm', + 7742, + ] + ] + ], + [ + 'stream', + '', + 7804, + [ + "17\n0", + [] + ] + ] + ]; + $document = new Document(); + $this->catchAllErrors(); + $fixture->exposedParseObject('19_0', $structure, $document); + + $this->expectNotToPerformAssertions(); + } + /** * Test that issue related pdf can now be parsed * @@ -92,3 +130,9 @@ public function testIssue267() $this->assertStringContainsString('4 von 4', $document->getText()); } } + +class ParserSub extends Parser { + public function exposedParseObject($id, $structure, $document) { + return $this->parseObject($id, $structure, $document); + } +} From b12df3bb26005a0f30547bea04c44369b96a179e Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 16:24:25 +0200 Subject: [PATCH 07/31] only reset error handler when the current handler is the handler we had set before --- tests/TestCase.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index 34bb0b3f..c0ed586f 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -46,8 +46,6 @@ abstract class TestCase extends PHPTestCase protected $rootDir; - private $errorHandlerChanged = false; - private $catchAllErrorHandler; function __construct() { @@ -76,7 +74,9 @@ public function setUp() public function tearDown() { // if we changed the error handler using catchAllErrors(), reset it now - if($this->errorHandlerChanged) { + $currentErrorHandler = set_error_handler('var_dump'); + restore_error_handler(); + if($currentErrorHandler === [$this, 'catchAllErrorHandler']) { restore_error_handler(); } } @@ -92,7 +92,6 @@ public function tearDown() { * errors are not triggered by the code. */ protected function catchAllErrors() { - $this->errorHandlerChanged = true; set_error_handler($this->catchAllErrorHandler); } From e1673b27a8416463c47f74083d99a0c037137694 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 16:33:18 +0200 Subject: [PATCH 08/31] work around for failing CI build with PHP 5.6 --- tests/Integration/ParserTest.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index 8dd4750a..f4fe5f44 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -111,8 +111,19 @@ public function testIssue19() $document = new Document(); $this->catchAllErrors(); $fixture->exposedParseObject('19_0', $structure, $document); + // reset the error handler here, so we can catch the exception following + restore_error_handler(); - $this->expectNotToPerformAssertions(); + // we could use + // $this->expectNotToPerformAssertions(); + // here, but it's not supported by the PHPUnit version used by PHP 5.6 + // and will cause the CI builds to fail in that environment. + // Therefore, we try to get the document text, which will fail expectedly, + // as the test data does not represent a complete PDF file. + // + // TODO: Once PHP 5 support is dropped from the library, remove this workaround + $this->expectExceptionMessage('Missing catalog.'); + $document->getText(); } /** From 5403abbf7150b134e8f768224e7a577e96cd111e Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 16:56:27 +0200 Subject: [PATCH 09/31] added comment and link to the workaround getting the current error handler --- tests/TestCase.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/TestCase.php b/tests/TestCase.php index c0ed586f..822d6ba6 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -74,6 +74,10 @@ public function setUp() public function tearDown() { // if we changed the error handler using catchAllErrors(), reset it now + // this is a workaround for PHP providing a way to directly get the current error handler, + // by temporarily setting it to var_dump and immediately resetting it. + // This is also used in PHPUnit's phpunit-bridge, see + // https://github.com/symfony/phpunit-bridge/blob/b6c713f26fd7ec6d0c77934e812f8c3d181e2fd2/DeprecationErrorHandler.php#L183-L184 $currentErrorHandler = set_error_handler('var_dump'); restore_error_handler(); if($currentErrorHandler === [$this, 'catchAllErrorHandler']) { From 5b5b48021c39c3fee944b14472dc06e7e0f6cbb4 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 16:56:58 +0200 Subject: [PATCH 10/31] removed unnecessary ini_set call --- tests/Integration/ParserTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index f4fe5f44..d0e80cd3 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -80,7 +80,6 @@ public function testParseFile() public function testIssue19() { - ini_set('display_errors', 1); $fixture = new ParserSub(); $structure = [ [ From 2319f8533ba74093a2fbf014324feb4777dcd01c Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 17:19:47 +0200 Subject: [PATCH 11/31] remove error level constant name before error message --- tests/TestCase.php | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index 822d6ba6..807e3619 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -55,8 +55,7 @@ function __construct() { // so we have to do it in the constructor. $this->catchAllErrorHandler = function ($typeNumber, $message, $file, $lineNumber) { $this->fail( - sprintf('%s: "%s" in %s:%d', - $this->getErrorType($typeNumber), + sprintf('"%s" in %s:%d', $message, $file, $lineNumber @@ -99,28 +98,6 @@ protected function catchAllErrors() { set_error_handler($this->catchAllErrorHandler); } - protected function getErrorType($typeNumber) { - $errorConstants = [ - 1 => 'E_ERROR', - 2 => 'E_WARNING', - 4 => 'E_PARSE', - 8 => 'E_NOTICE', - 16 => 'E_CORE_ERROR', - 32 => 'E_CORE_WARNING', - 64 => 'E_COMPILE_ERROR', - 128 => 'E_COMPILE_WARNING', - 256 => 'E_USER_ERROR', - 512 => 'E_USER_WARNING', - 1024 => 'E_USER_NOTICE', - 2048 => 'E_STRICT', - 4096 => 'E_RECOVERABLE_ERROR', - 8192 => 'E_DEPRECATED', - 16384 => 'E_USER_DEPRECATED', - 32767 => 'E_ALL' - ]; - return $errorConstants[$typeNumber]; - } - protected function getDocumentInstance() { return new Document(); From 51b8ea337e54e38a86ea7b2e072113d1f76fa596 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 17:34:16 +0200 Subject: [PATCH 12/31] restore error from the error handler itself, to prevent PHPUnit's "THE ERROR HANDLER HAS CHANGED!" message --- tests/TestCase.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/TestCase.php b/tests/TestCase.php index 807e3619..a97a3cdc 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -54,6 +54,7 @@ function __construct() { // PHP does not implement setting a class property to an anonymous function, // so we have to do it in the constructor. $this->catchAllErrorHandler = function ($typeNumber, $message, $file, $lineNumber) { + restore_error_handler(); $this->fail( sprintf('"%s" in %s:%d', $message, From 86525f63cdf9603f91a55e018febba73f608c579 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 18:19:42 +0200 Subject: [PATCH 13/31] reverse the changes made to the TestCase class and the code in the test case depending on it --- tests/Integration/ParserTest.php | 14 ---------- tests/TestCase.php | 46 -------------------------------- 2 files changed, 60 deletions(-) diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index d0e80cd3..b69b6f26 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -108,21 +108,7 @@ public function testIssue19() ] ]; $document = new Document(); - $this->catchAllErrors(); - $fixture->exposedParseObject('19_0', $structure, $document); - // reset the error handler here, so we can catch the exception following - restore_error_handler(); - // we could use - // $this->expectNotToPerformAssertions(); - // here, but it's not supported by the PHPUnit version used by PHP 5.6 - // and will cause the CI builds to fail in that environment. - // Therefore, we try to get the document text, which will fail expectedly, - // as the test data does not represent a complete PDF file. - // - // TODO: Once PHP 5 support is dropped from the library, remove this workaround - $this->expectExceptionMessage('Missing catalog.'); - $document->getText(); } /** diff --git a/tests/TestCase.php b/tests/TestCase.php index a97a3cdc..fbcf67cb 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -46,25 +46,6 @@ abstract class TestCase extends PHPTestCase protected $rootDir; - private $catchAllErrorHandler; - - function __construct() { - parent::__construct(); - - // PHP does not implement setting a class property to an anonymous function, - // so we have to do it in the constructor. - $this->catchAllErrorHandler = function ($typeNumber, $message, $file, $lineNumber) { - restore_error_handler(); - $this->fail( - sprintf('"%s" in %s:%d', - $message, - $file, - $lineNumber - ) - ); - }; - } - public function setUp() { parent::setUp(); @@ -72,33 +53,6 @@ public function setUp() $this->rootDir = __DIR__.'/..'; } - public function tearDown() { - // if we changed the error handler using catchAllErrors(), reset it now - // this is a workaround for PHP providing a way to directly get the current error handler, - // by temporarily setting it to var_dump and immediately resetting it. - // This is also used in PHPUnit's phpunit-bridge, see - // https://github.com/symfony/phpunit-bridge/blob/b6c713f26fd7ec6d0c77934e812f8c3d181e2fd2/DeprecationErrorHandler.php#L183-L184 - $currentErrorHandler = set_error_handler('var_dump'); - restore_error_handler(); - if($currentErrorHandler === [$this, 'catchAllErrorHandler']) { - restore_error_handler(); - } - } - - /** - * This temporarily changes the PHP-internal error handler - * in order to allow catching errors of type E_WARNING, E_NOTICE etc., - * which are not catchable via a try/catch statement. - * It will fail the current test from which it is run, - * giving a descriptive message. - * - * This can come in handy to make tests for making sure that such - * errors are not triggered by the code. - */ - protected function catchAllErrors() { - set_error_handler($this->catchAllErrorHandler); - } - protected function getDocumentInstance() { return new Document(); From 4e4b3e2c68e600522f406021952c4f671a7010db Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 18:20:26 +0200 Subject: [PATCH 14/31] simplified test case, now checking if object has been parsed correctly --- tests/Integration/ParserTest.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index b69b6f26..d9c4a7b1 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -78,6 +78,11 @@ public function testParseFile() } } + /** + * Tests that xrefs with line breaks between id and position are parsed correctly + * + * @see https://github.com/smalot/pdfparser/issues/336 + */ public function testIssue19() { $fixture = new ParserSub(); @@ -109,6 +114,10 @@ public function testIssue19() ]; $document = new Document(); + $fixture->exposedParseObject('19_0', $structure, $document); + $objects = $fixture->getObjects(); + + $this->assertArrayHasKey('17_0', $objects); } /** @@ -131,4 +140,8 @@ class ParserSub extends Parser { public function exposedParseObject($id, $structure, $document) { return $this->parseObject($id, $structure, $document); } + + public function getObjects() { + return $this->objects; + } } From c2cb4365ea171123cafee15f906c3f4d27bdff62 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 18:29:23 +0200 Subject: [PATCH 15/31] code linting --- tests/Integration/ParserTest.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index d9c4a7b1..9b316fc9 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -33,8 +33,8 @@ namespace Tests\Smalot\PdfParser\Integration; use Exception; -use Smalot\PdfParser\Parser; use Smalot\PdfParser\Document; +use Smalot\PdfParser\Parser; use Smalot\PdfParser\XObject\Image; use Tests\Smalot\PdfParser\TestCase; @@ -99,8 +99,8 @@ public function testIssue19() '/', 'ObjStm', 7742, - ] - ] + ], + ], ], [ 'stream', @@ -108,9 +108,9 @@ public function testIssue19() 7804, [ "17\n0", - [] - ] - ] + [], + ], + ], ]; $document = new Document(); @@ -136,12 +136,15 @@ public function testIssue267() } } -class ParserSub extends Parser { - public function exposedParseObject($id, $structure, $document) { +class ParserSub extends Parser +{ + public function exposedParseObject($id, $structure, $document) + { return $this->parseObject($id, $structure, $document); } - public function getObjects() { + public function getObjects() + { return $this->objects; } } From 637eae32755f769250604106504cd6fc3ec8fefe Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 20:51:01 +0200 Subject: [PATCH 16/31] applied linting --- src/Smalot/PdfParser/Encoding.php | 2 +- .../PdfParser/Encoding/PostScriptGlyphs.php | 4 +-- src/Smalot/PdfParser/Font.php | 26 +++++++++---------- src/Smalot/PdfParser/PDFObject.php | 5 ++-- src/Smalot/PdfParser/Parser.php | 1 + 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/Smalot/PdfParser/Encoding.php b/src/Smalot/PdfParser/Encoding.php index 85a44ad4..f86e580f 100644 --- a/src/Smalot/PdfParser/Encoding.php +++ b/src/Smalot/PdfParser/Encoding.php @@ -98,7 +98,7 @@ public function init() $this->mapping = $this->encoding; foreach ($this->differences as $code => $difference) { - /** @var string $difference */ + /* @var string $difference */ $this->mapping[$code] = $difference; } } diff --git a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php index cd904269..82b624e4 100644 --- a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php +++ b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php @@ -10,8 +10,8 @@ class PostScriptGlyphs public static function getGlyphs() { - if (self::$glyphs === null) { - self::$glyphs = json_decode(file_get_contents(dirname(__FILE__) . '/PostScriptGlyphs.json'), true); + if (null === self::$glyphs) { + self::$glyphs = json_decode(file_get_contents(__DIR__.'/PostScriptGlyphs.json'), true); } return self::$glyphs; diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index 8faa7d8f..303ab220 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -362,7 +362,7 @@ public function decodeText($commands) case '<': // Decode hexadecimal. - $text = self::decodeHexadecimal('<' . $command[PDFObject::COMMAND] . '>'); + $text = self::decodeHexadecimal('<'.$command[PDFObject::COMMAND].'>'); break; default: @@ -390,7 +390,6 @@ public function decodeText($commands) /** * @param string $text - * @param bool $unicode * * @return string */ @@ -442,30 +441,29 @@ public function decodeContent($text) } elseif ($this->has('Encoding') && $this->get('Encoding') instanceof Encoding) { /** @var Encoding $encoding */ $encoding = $this->get('Encoding'); - $unicode = mb_check_encoding($text, "UTF-8"); + $unicode = mb_check_encoding($text, 'UTF-8'); $result = ''; if ($unicode) { - $chars = preg_split( - '//s' . ($unicode ? 'u' : ''), + $chars = preg_split( + '//s'.($unicode ? 'u' : ''), $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); foreach ($chars as $char) { - $dec_av = hexdec(bin2hex($char)); - $dec_ap = $encoding->translateChar($dec_av); - $result .= self::uchr($dec_ap); + $dec_av = hexdec(bin2hex($char)); + $dec_ap = $encoding->translateChar($dec_av); + $result .= self::uchr($dec_ap); } } else { - $length = strlen($text); + $length = \strlen($text); - for ($i = 0; $i < $length; $i++) { - $dec_av = hexdec(bin2hex($text[$i])); - $dec_ap = $encoding->translateChar($dec_av); - $result .= self::uchr($dec_ap); + for ($i = 0; $i < $length; ++$i) { + $dec_av = hexdec(bin2hex($text[$i])); + $dec_ap = $encoding->translateChar($dec_av); + $result .= self::uchr($dec_ap); } - } $text = $result; } elseif ($this->get('Encoding') instanceof Element && diff --git a/src/Smalot/PdfParser/PDFObject.php b/src/Smalot/PdfParser/PDFObject.php index 3a45b040..35f1c023 100644 --- a/src/Smalot/PdfParser/PDFObject.php +++ b/src/Smalot/PdfParser/PDFObject.php @@ -234,14 +234,13 @@ public function getSectionsText($content) private function getDefaultFont(Page $page = null) { $fonts = []; - if (!is_null($page)) { + if (null !== $page) { $fonts = $page->getFonts(); } $fonts = array_merge($fonts, array_values($this->document->getFonts())); - if (count($fonts) > 0) - { + if (\count($fonts) > 0) { return reset($fonts); } diff --git a/src/Smalot/PdfParser/Parser.php b/src/Smalot/PdfParser/Parser.php index 004a4abd..a777ecda 100644 --- a/src/Smalot/PdfParser/Parser.php +++ b/src/Smalot/PdfParser/Parser.php @@ -272,6 +272,7 @@ protected function parseHeaderElement($type, $value, $document) case '<<': case '>>': $header = $this->parseHeader($value, $document); + return PDFObject::factory($document, $header, null); case 'numeric': From 48c472b74328e174b885b908fd3dfde0c0e21c10 Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 21:53:20 +0200 Subject: [PATCH 17/31] handle failed font lookup --- src/Smalot/PdfParser/PDFObject.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/PDFObject.php b/src/Smalot/PdfParser/PDFObject.php index 35f1c023..488d7537 100644 --- a/src/Smalot/PdfParser/PDFObject.php +++ b/src/Smalot/PdfParser/PDFObject.php @@ -310,7 +310,15 @@ public function getText(Page $page = null) list($id) = preg_split('/\s/s', $command[self::COMMAND]); $id = trim($id, '/'); if (null !== $page) { - $current_font = $page->getFont($id); + $new_font = $page->getFont($id); + // If an invalid font ID is given, do not update the font. + // This should theoretically never happen, as the PDF spec states for the Tf operator: + // "The specified font value shall match a resource name in the Font entry of the default resource dictionary" + // (https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf, page 435) + // But we want to make sure that malformed PDFs do not simply crash. + if (null !== $new_font) { + $current_font = $new_font; + } } break; From 4042e7455b597fc93b323fd94b5a6163db77713b Mon Sep 17 00:00:00 2001 From: Connum Date: Tue, 29 Sep 2020 21:57:37 +0200 Subject: [PATCH 18/31] look up unfiltered font resource name first, then fall back to filtered resource name --- src/Smalot/PdfParser/Page.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Page.php b/src/Smalot/PdfParser/Page.php index 901190dc..9aca6898 100644 --- a/src/Smalot/PdfParser/Page.php +++ b/src/Smalot/PdfParser/Page.php @@ -107,10 +107,19 @@ public function getFont($id) return $fonts[$id]; } - $id = preg_replace('/[^0-9\.\-_]/', '', $id); + // $id = preg_replace('/[^0-9\.\-_]/', '', $id); + // + // According to the PDF specs (https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf, page 238) + // "The font resource name presented to the Tf operator is arbitrary, as are the names for all kinds of resources" + // Instead, we search for the unfiltered name first and then do this cleaning as a fallback, so all tests still pass. if (isset($fonts[$id])) { return $fonts[$id]; + } else { + $id = preg_replace('/[^0-9\.\-_]/', '', $id); + if (isset($fonts[$id])) { + return $fonts[$id]; + } } return null; From 6c744598d514b73b35de29f877467dab36829c24 Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 15:38:45 +0200 Subject: [PATCH 19/31] added unit test for #202 bugfix, code linting --- samples/bugs/Issue202.pdf | Bin 0 -> 1138 bytes src/Smalot/PdfParser/Page.php | 2 +- tests/Integration/ParserTest.php | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 samples/bugs/Issue202.pdf diff --git a/samples/bugs/Issue202.pdf b/samples/bugs/Issue202.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fada3cf6cfaa4d948737157a40997b01a19df4e1 GIT binary patch literal 1138 zcma)5&2G~`5cYx7DkqfQheK#lX?Fdyv5le%($o@aL!-0;L6n0VZ-T4DTiF{aRN@JM zH|UAC;DUt2jaEXrbK(_p24-D{^arV|{IfIr?d;4q-&WeqV8g7s!~_QN@QBpwKo8y= z3!qz}3P*BC=-xz);zVR%A*MrUI~<~6YXdeniAW;7Q7>K%@OK~Gl9NQ?`Vy^oUq$Cp z3EhdK47xQPob*Vs(gIi-TqAw#s z=&neH>NU8Q<}*`R>6lDUe_G#d#@dhXzngtJZIs`)=B3hk`E28SzI*m?rO_$Rf0R~A zALgZUV^%JI$<8YD}fi-OYQlFzhIh}V49KX5j~j$Fez{AN7Pu`}0jt`_^kr_wMU zi4-q4vJ;;OEQ5BWRG@D?-sq>vK!Vn`o;SPosOC7f8wu0q-k|2$k>fCS81l$rootDir.'/samples/bugs/Issue202.pdf'; + + $document = $this->fixture->parseFile($filename); + + $this->assertEquals('„fööbär“', $document->getText()); + } + /** * Test that issue related pdf can now be parsed * From 4f8e812495fec5cd31870e52dc2b62f448ccf4f5 Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 18:15:32 +0200 Subject: [PATCH 20/31] fallback for decoding single-byte ANSI characters that are not in the lookup table --- src/Smalot/PdfParser/Font.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index ec1a791c..e86c90ae 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -99,7 +99,13 @@ public function translateChar($char, $use_default = true) return $this->table[$dec]; } - return $use_default ? self::MISSING : $char; + // fallback for decoding single-byte ANSI characters that are not in the lookup table + $fallbackDecoded = $char; + if (\strlen($char) < 2 && $this->has('Encoding') && $this->get('Encoding')->__toString() === 'WinAnsiEncoding') { + $fallbackDecoded = self::uchr($dec); + } + + return $use_default ? self::MISSING : $fallbackDecoded; } /** @@ -109,7 +115,9 @@ public function translateChar($char, $use_default = true) */ public static function uchr($code) { - return html_entity_decode('&#'.((int) $code).';', ENT_NOQUOTES, 'UTF-8'); + // html_entity_decode() will not work with UTF-16 or UTF-32 char entities, + // therefore, we use mb_convert_encoding() instead + return mb_convert_encoding('&#'.((int) $code).';', 'UTF-8', 'HTML-ENTITIES'); } /** From d9b1c1c3558fed205518f037577a52c64c48731a Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 18:15:54 +0200 Subject: [PATCH 21/31] added test file and unit test for international unicode characters --- samples/InternationalChars.pdf | Bin 0 -> 152991 bytes tests/Integration/ParserTest.php | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 samples/InternationalChars.pdf diff --git a/samples/InternationalChars.pdf b/samples/InternationalChars.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fd5eb6672990e31173637a16afb3bbe8a2eb4e7f GIT binary patch literal 152991 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

Ho8P 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 ScOWk}Kkt?;`W6QKy#E7=4zP3p literal 0 HcmV?d00001 diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index 65f754f8..1807c829 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -77,6 +77,31 @@ public function testParseFile() } } + /** + * Properly decode international unicode characters + */ + public function testUnicodeDecoding() + { + $filename = $this->rootDir.'/samples/InternationalChars.pdf'; + + $document = $this->fixture->parseFile($filename); + + $testString_cyrillic = "Лорем ипсум долор сит амет, еу сед либрис долорем инцоррупте. Ут лорем долоре граеце хис, модо \nаппареат сапиентем ут мел. Хис ат лаборе омнесяуе сигниферумяуе, тале анциллае ан еум, ех сед синт \nнобис. Сед модус вивендо цопиосае еа, сапиентем цонцептам хис не, яуандо сплендиде еум те."; + $testString_greek = "Λορεμ ιπσθμ δολορ σιτ αμετ, τατιον cονστιτθαμ ομιτταντθρ εα σεα, αθδιαμ μανδαμθσ μελ τε. Διcο μθτατ \nινδοcτθμ εοσ ει, ει vιξ σονετ παρτιενδο ινcορρθπτε. Επιcθρι αντιοπαμ εθ νεc, ναμ λεγιμθσ γθβεργρεν ιν. \nVιξ σολετ ρεcτεqθε εα, ηασ νο αλιqθαμ μινιμθμ. Ιδ προ περcιπιτ περιcθλισ δετερρθισσετ, ιν νεc αππετερε \nομιτταντθρ ελοqθεντιαμ, ορατιο δοcτθσ ναμ αδ. Ετ σιτ σολθμ ρεcθσαβο, vιξ θτ λοβορτισ σπλενδιδε \nρεπθδιανδαε."; + $testString_armenian = "լոռեմ իպսում դոլոռ սիթ ամեթ վիս ին իմպեդիթ ադմոդում ծու ապպառեաթ սծռիպսեռիթ մել մել եթ \nդոմինգ ծոնսեքուունթուռ ծիվիբուս վիվենդում պռոդեսսեթ ադ մեի թիբիքուե ապպառեաթ սիմիլիքուե թե \nվիմ վիխ ծասե սեմպեռ դոլոռեմ եխ եամ եա սթեթ մեդիոծռեմ ծոնսեթեթուռ ռաթիոնիբուս ինթելլեգամ \nմել թե"; + $testString_georgean = "ლორემ იფსუმ დოლორ სით ამეთ ესთ ეთ სონეთ ზრილ მელიუს ელიგენდი თორყუათოს \nელოყუენთიამ ესთ ეხ უსუ ფალლი ალთერა ცეთეროს ინ ეთ ომითთამ თრაცთათოს ჰის ეუ ველ \nალთერუმ ვოლუფთათუმ მაზიმ ფერთინახ ჰენდრერით ინ ფრი ნეც ინ თემფორ ფეთენთიუმ ვერო \nფოსთულანთ ელოყუენთიამ უსუ ნე ან ყუი ლიბერ ეფიცური ასსუევერით იდ ნიბჰ ყუას ჰაბემუს სეა"; + $testString_korean = "그 임기는 4년으로 하며. 이 경우 그 명령에 의하여 개정 또는 폐지되었던 법률은 그 명령이 승인을 얻지 못한 때부터 당연히 효력을 \n회복한다. 가부동수인 때에는 부결된 것으로 본다. 법률과 적법한 절차에 의하지 아니하고는 처벌·보안처분 또는 강제노역을 받지 \n아니한다."; + $testString_western = "ÄÖÜöäüßẞ Ññ¡¿ øÅå"; + // @todo the other languages in the test document need work because of issues with UTF-16 decoding (Chinese, Japanese) and missing right-to-left language support + + $this->assertStringContainsString($testString_cyrillic, $document->getText()); + $this->assertStringContainsString($testString_greek, $document->getText()); + $this->assertStringContainsString($testString_armenian, $document->getText()); + $this->assertStringContainsString($testString_georgean, $document->getText()); + $this->assertStringContainsString($testString_korean, $document->getText()); + $this->assertStringContainsString($testString_western, $document->getText()); + } + /** * Properly decode ANSI encodings without producing scrambled UTF-8 characters * From 9811faca70130d36bb480c74068d2c433dd883da Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 20:42:22 +0200 Subject: [PATCH 22/31] don't double-encode strings already in UTF-8 --- src/Smalot/PdfParser/Font.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index e86c90ae..85324200 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -483,7 +483,7 @@ public function decodeContent($text) // mb_convert_encoding does not support MacRoman/macintosh, // so we use iconv() here $text = iconv('macintosh', 'UTF-8', $text); - } else { + } elseif (!mb_check_encoding($text, 'UTF-8')) { // don't double-encode strings already in UTF-8 $text = mb_convert_encoding($text, 'UTF-8', 'Windows-1252'); } From 7203d42f729417a62efb758882acb81ca696fb61 Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 20:42:50 +0200 Subject: [PATCH 23/31] code linting --- src/Smalot/PdfParser/Font.php | 2 +- tests/Integration/ParserTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index 85324200..709e7efb 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -101,7 +101,7 @@ public function translateChar($char, $use_default = true) // fallback for decoding single-byte ANSI characters that are not in the lookup table $fallbackDecoded = $char; - if (\strlen($char) < 2 && $this->has('Encoding') && $this->get('Encoding')->__toString() === 'WinAnsiEncoding') { + if (\strlen($char) < 2 && $this->has('Encoding') && 'WinAnsiEncoding' === $this->get('Encoding')->__toString()) { $fallbackDecoded = self::uchr($dec); } diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index 1807c829..70ada0ea 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -91,7 +91,7 @@ public function testUnicodeDecoding() $testString_armenian = "լոռեմ իպսում դոլոռ սիթ ամեթ վիս ին իմպեդիթ ադմոդում ծու ապպառեաթ սծռիպսեռիթ մել մել եթ \nդոմինգ ծոնսեքուունթուռ ծիվիբուս վիվենդում պռոդեսսեթ ադ մեի թիբիքուե ապպառեաթ սիմիլիքուե թե \nվիմ վիխ ծասե սեմպեռ դոլոռեմ եխ եամ եա սթեթ մեդիոծռեմ ծոնսեթեթուռ ռաթիոնիբուս ինթելլեգամ \nմել թե"; $testString_georgean = "ლორემ იფსუმ დოლორ სით ამეთ ესთ ეთ სონეთ ზრილ მელიუს ელიგენდი თორყუათოს \nელოყუენთიამ ესთ ეხ უსუ ფალლი ალთერა ცეთეროს ინ ეთ ომითთამ თრაცთათოს ჰის ეუ ველ \nალთერუმ ვოლუფთათუმ მაზიმ ფერთინახ ჰენდრერით ინ ფრი ნეც ინ თემფორ ფეთენთიუმ ვერო \nფოსთულანთ ელოყუენთიამ უსუ ნე ან ყუი ლიბერ ეფიცური ასსუევერით იდ ნიბჰ ყუას ჰაბემუს სეა"; $testString_korean = "그 임기는 4년으로 하며. 이 경우 그 명령에 의하여 개정 또는 폐지되었던 법률은 그 명령이 승인을 얻지 못한 때부터 당연히 효력을 \n회복한다. 가부동수인 때에는 부결된 것으로 본다. 법률과 적법한 절차에 의하지 아니하고는 처벌·보안처분 또는 강제노역을 받지 \n아니한다."; - $testString_western = "ÄÖÜöäüßẞ Ññ¡¿ øÅå"; + $testString_western = 'ÄÖÜöäüßẞ Ññ¡¿ øÅå'; // @todo the other languages in the test document need work because of issues with UTF-16 decoding (Chinese, Japanese) and missing right-to-left language support $this->assertStringContainsString($testString_cyrillic, $document->getText()); From 1c0208d05ead4db75293e2d4b59b958ebecc87c9 Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 20:55:03 +0200 Subject: [PATCH 24/31] removed remnants from old decodeContent() function signature --- src/Smalot/PdfParser/Page.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Smalot/PdfParser/Page.php b/src/Smalot/PdfParser/Page.php index 007ae4f8..1457b25e 100644 --- a/src/Smalot/PdfParser/Page.php +++ b/src/Smalot/PdfParser/Page.php @@ -335,7 +335,6 @@ public function extractDecodedRawData($extractedRawData = null) if (!isset($extractedRawData) or !$extractedRawData) { $extractedRawData = $this->extractRawData(); } - $unicode = true; $currentFont = null; foreach ($extractedRawData as &$command) { if ('Tj' == $command['o'] or 'TJ' == $command['o']) { @@ -353,7 +352,7 @@ public function extractDecodedRawData($extractedRawData = null) ); $tmpText = utf8_encode($tmpText); if (isset($currentFont)) { - $tmpText = $currentFont->decodeContent($tmpText, $unicode); + $tmpText = $currentFont->decodeContent($tmpText); } $command['c'] = $tmpText; continue; @@ -376,7 +375,7 @@ public function extractDecodedRawData($extractedRawData = null) ); $decodedText = utf8_encode($decodedText); if (isset($currentFont)) { - $decodedText = $currentFont->decodeContent($decodedText, $unicode); + $decodedText = $currentFont->decodeContent($decodedText); } $command['c'][$i]['c'] = $decodedText; continue; From c620aeb7bbe62b97c35af3d48882bea228e9dbe7 Mon Sep 17 00:00:00 2001 From: Connum Date: Wed, 30 Sep 2020 20:56:40 +0200 Subject: [PATCH 25/31] parseHeaderElement() should not return a PDFObject --- src/Smalot/PdfParser/Parser.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Parser.php b/src/Smalot/PdfParser/Parser.php index a777ecda..1aefca1a 100644 --- a/src/Smalot/PdfParser/Parser.php +++ b/src/Smalot/PdfParser/Parser.php @@ -272,8 +272,9 @@ protected function parseHeaderElement($type, $value, $document) case '<<': case '>>': $header = $this->parseHeader($value, $document); + PDFObject::factory($document, $header, null); - return PDFObject::factory($document, $header, null); + return $header; case 'numeric': return new ElementNumeric($value); From 795762494d1a60426385b913b01f6320d27e035d Mon Sep 17 00:00:00 2001 From: Connum Date: Thu, 1 Oct 2020 18:32:45 +0200 Subject: [PATCH 26/31] some minor changes as requested by the review --- src/Smalot/PdfParser/Font.php | 5 +++-- src/Smalot/PdfParser/Page.php | 2 -- tests/Integration/ParserTest.php | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index 709e7efb..c48c608f 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -117,7 +117,7 @@ public static function uchr($code) { // html_entity_decode() will not work with UTF-16 or UTF-32 char entities, // therefore, we use mb_convert_encoding() instead - return mb_convert_encoding('&#'.((int) $code).';', 'UTF-8', 'HTML-ENTITIES'); + return mb_convert_encoding('&#'.((int) $code).';', 'UTF-8', 'HTML-ENTITIES'); } /** @@ -483,7 +483,8 @@ public function decodeContent($text) // mb_convert_encoding does not support MacRoman/macintosh, // so we use iconv() here $text = iconv('macintosh', 'UTF-8', $text); - } elseif (!mb_check_encoding($text, 'UTF-8')) { // don't double-encode strings already in UTF-8 + } elseif (!mb_check_encoding($text, 'UTF-8')) { + // don't double-encode strings already in UTF-8 $text = mb_convert_encoding($text, 'UTF-8', 'Windows-1252'); } diff --git a/src/Smalot/PdfParser/Page.php b/src/Smalot/PdfParser/Page.php index 1457b25e..1b859e0a 100644 --- a/src/Smalot/PdfParser/Page.php +++ b/src/Smalot/PdfParser/Page.php @@ -107,8 +107,6 @@ public function getFont($id) return $fonts[$id]; } - // $id = preg_replace('/[^0-9\.\-_]/', '', $id); - // // According to the PDF specs (https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf, page 238) // "The font resource name presented to the Tf operator is arbitrary, as are the names for all kinds of resources" // Instead, we search for the unfiltered name first and then do this cleaning as a fallback, so all tests still pass. diff --git a/tests/Integration/ParserTest.php b/tests/Integration/ParserTest.php index 70ada0ea..ffb1b96d 100644 --- a/tests/Integration/ParserTest.php +++ b/tests/Integration/ParserTest.php @@ -79,6 +79,8 @@ public function testParseFile() /** * Properly decode international unicode characters + * + * @todo the other languages in the test document need work because of issues with UTF-16 decoding (Chinese, Japanese) and missing right-to-left language support */ public function testUnicodeDecoding() { @@ -92,7 +94,6 @@ public function testUnicodeDecoding() $testString_georgean = "ლორემ იფსუმ დოლორ სით ამეთ ესთ ეთ სონეთ ზრილ მელიუს ელიგენდი თორყუათოს \nელოყუენთიამ ესთ ეხ უსუ ფალლი ალთერა ცეთეროს ინ ეთ ომითთამ თრაცთათოს ჰის ეუ ველ \nალთერუმ ვოლუფთათუმ მაზიმ ფერთინახ ჰენდრერით ინ ფრი ნეც ინ თემფორ ფეთენთიუმ ვერო \nფოსთულანთ ელოყუენთიამ უსუ ნე ან ყუი ლიბერ ეფიცური ასსუევერით იდ ნიბჰ ყუას ჰაბემუს სეა"; $testString_korean = "그 임기는 4년으로 하며. 이 경우 그 명령에 의하여 개정 또는 폐지되었던 법률은 그 명령이 승인을 얻지 못한 때부터 당연히 효력을 \n회복한다. 가부동수인 때에는 부결된 것으로 본다. 법률과 적법한 절차에 의하지 아니하고는 처벌·보안처분 또는 강제노역을 받지 \n아니한다."; $testString_western = 'ÄÖÜöäüßẞ Ññ¡¿ øÅå'; - // @todo the other languages in the test document need work because of issues with UTF-16 decoding (Chinese, Japanese) and missing right-to-left language support $this->assertStringContainsString($testString_cyrillic, $document->getText()); $this->assertStringContainsString($testString_greek, $document->getText()); From 1f41ccc059c6814b8c52d0ce770415c1a24133bb Mon Sep 17 00:00:00 2001 From: Connum Date: Sat, 3 Oct 2020 17:56:44 +0200 Subject: [PATCH 27/31] keep $unicode as deprecated parameter in decodeContent function signature --- src/Smalot/PdfParser/Font.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index c48c608f..21600844 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -403,9 +403,11 @@ public function decodeText($commands) /** * @param string $text * + * @deprecated Usage of second parameter $unicode is deprecated. It might be removed in a future release. + * * @return string */ - public function decodeContent($text) + public function decodeContent($text, &$unicode) { if ($this->has('ToUnicode')) { $bytes = $this->tableSizes['from']; From c8e05fc2abe83cf14ca903a84fa207d22fa06aed Mon Sep 17 00:00:00 2001 From: Connum Date: Sat, 3 Oct 2020 18:02:49 +0200 Subject: [PATCH 28/31] forgot to add default value for $unicode to make it optional --- src/Smalot/PdfParser/Font.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index 21600844..7e0db6e1 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -407,7 +407,7 @@ public function decodeText($commands) * * @return string */ - public function decodeContent($text, &$unicode) + public function decodeContent($text, &$unicode = null) { if ($this->has('ToUnicode')) { $bytes = $this->tableSizes['from']; From 9e41fbb49222f60a92cf94cb699e482f0a617218 Mon Sep 17 00:00:00 2001 From: Connum Date: Sat, 3 Oct 2020 18:40:13 +0200 Subject: [PATCH 29/31] added proper doc blocks to PostScriptGlyphs.php --- .../PdfParser/Encoding/PostScriptGlyphs.php | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php index 82b624e4..2e54ccc1 100644 --- a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php +++ b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php @@ -1,13 +1,48 @@ + * @date 2019-09-17 + * + * @license LGPLv3 + * @url + * + * PdfParser is a pdf library written in PHP, extraction oriented. + * Copyright (C) 2017 - Sébastien MALOT + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. + * If not, see . + */ namespace Smalot\PdfParser\Encoding; +/** + * Class PostScriptGlyphs + */ class PostScriptGlyphs { private static $glyphs = null; + /** + * @return array + * + * The mapping tables have been converted from https://github.com/OpenPrinting/cups-filters/blob/master/fontembed/aglfn13.c, + * part of the OpenPrinting/cups-filters package, which itself is licensed under the MIT license and lists this specific code part as: + * Copyright 2008,2012 Tobias Hoffmann under the Expat license (https://www.gnu.org/licenses/license-list.html#Expat) + */ public static function getGlyphs() { if (null === self::$glyphs) { From a9c33b43de02ebd4270fac27581c616b161ccfab Mon Sep 17 00:00:00 2001 From: Connum Date: Sat, 3 Oct 2020 18:41:20 +0200 Subject: [PATCH 30/31] return array from PostScriptGlyphs::getGlyphs() directly instead of using and parsing JSON --- .../PdfParser/Encoding/PostScriptGlyphs.json | 1041 ---------------- .../PdfParser/Encoding/PostScriptGlyphs.php | 1048 ++++++++++++++++- 2 files changed, 1041 insertions(+), 1048 deletions(-) delete mode 100644 src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json diff --git a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json deleted file mode 100644 index cf6dea47..00000000 --- a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.json +++ /dev/null @@ -1,1041 +0,0 @@ -{ - "space": "0x00a0", - "exclam": "0x0021", - "quotedbl": "0x0022", - "numbersign": "0x0023", - "dollar": "0x0024", - "percent": "0x0025", - "ampersand": "0x0026", - "quotesingle": "0x0027", - "parenleft": "0x0028", - "parenright": "0x0029", - "asterisk": "0x002a", - "plus": "0x002b", - "comma": "0x002c", - "hyphen": "0x002d", - "period": "0x002e", - "slash": "0x002f", - "zero": "0x0030", - "one": "0x0031", - "two": "0x0032", - "three": "0x0033", - "four": "0x0034", - "five": "0x0035", - "six": "0x0036", - "seven": "0x0037", - "eight": "0x0038", - "nine": "0x0039", - "colon": "0x003a", - "semicolon": "0x003b", - "less": "0x003c", - "equal": "0x003d", - "greater": "0x003e", - "question": "0x003f", - "at": "0x0040", - "A": "0x0041", - "B": "0x0042", - "C": "0x0043", - "D": "0x0044", - "E": "0x0045", - "F": "0x0046", - "G": "0x0047", - "H": "0x0048", - "I": "0x0049", - "J": "0x004a", - "K": "0x004b", - "L": "0x004c", - "M": "0x004d", - "N": "0x004e", - "O": "0x004f", - "P": "0x0050", - "Q": "0x0051", - "R": "0x0052", - "S": "0x0053", - "T": "0x0054", - "U": "0x0055", - "V": "0x0056", - "W": "0x0057", - "X": "0x0058", - "Y": "0x0059", - "Z": "0x005a", - "bracketleft": "0x005b", - "backslash": "0x005c", - "bracketright": "0x005d", - "asciicircum": "0x005e", - "underscore": "0x005f", - "grave": "0x0060", - "a": "0x0061", - "b": "0x0062", - "c": "0x0063", - "d": "0x0064", - "e": "0x0065", - "f": "0x0066", - "g": "0x0067", - "h": "0x0068", - "i": "0x0069", - "j": "0x006a", - "k": "0x006b", - "l": "0x006c", - "m": "0x006d", - "n": "0x006e", - "o": "0x006f", - "p": "0x0070", - "q": "0x0071", - "r": "0x0072", - "s": "0x0073", - "t": "0x0074", - "u": "0x0075", - "v": "0x0076", - "w": "0x0077", - "x": "0x0078", - "y": "0x0079", - "z": "0x007a", - "braceleft": "0x007b", - "bar": "0x007c", - "braceright": "0x007d", - "asciitilde": "0x007e", - "exclamdown": "0x00a1", - "cent": "0x00a2", - "sterling": "0x00a3", - "currency": "0x00a4", - "yen": "0x00a5", - "brokenbar": "0x00a6", - "section": "0x00a7", - "dieresis": "0x00a8", - "copyright": "0x00a9", - "ordfeminine": "0x00aa", - "guillemotleft": "0x00ab", - "logicalnot": "0x00ac", - "minus": "0x2212", - "registered": "0x00ae", - "macron": "0x02c9", - "degree": "0x00b0", - "plusminus": "0x00b1", - "twosuperior": "0x00b2", - "threesuperior": "0x00b3", - "acute": "0x00b4", - "mu": "0x03bc", - "paragraph": "0x00b6", - "periodcentered": "0x2219", - "cedilla": "0x00b8", - "onesuperior": "0x00b9", - "ordmasculine": "0x00ba", - "guillemotright": "0x00bb", - "onequarter": "0x00bc", - "onehalf": "0x00bd", - "threequarters": "0x00be", - "questiondown": "0x00bf", - "Agrave": "0x00c0", - "Aacute": "0x00c1", - "Acircumflex": "0x00c2", - "Atilde": "0x00c3", - "Adieresis": "0x00c4", - "Aring": "0x00c5", - "AE": "0x00c6", - "Ccedilla": "0x00c7", - "Egrave": "0x00c8", - "Eacute": "0x00c9", - "Ecircumflex": "0x00ca", - "Edieresis": "0x00cb", - "Igrave": "0x00cc", - "Iacute": "0x00cd", - "Icircumflex": "0x00ce", - "Idieresis": "0x00cf", - "Eth": "0x00d0", - "Ntilde": "0x00d1", - "Ograve": "0x00d2", - "Oacute": "0x00d3", - "Ocircumflex": "0x00d4", - "Otilde": "0x00d5", - "Odieresis": "0x00d6", - "multiply": "0x00d7", - "Oslash": "0x00d8", - "Ugrave": "0x00d9", - "Uacute": "0x00da", - "Ucircumflex": "0x00db", - "Udieresis": "0x00dc", - "Yacute": "0x00dd", - "Thorn": "0x00de", - "germandbls": "0x00df", - "agrave": "0x00e0", - "aacute": "0x00e1", - "acircumflex": "0x00e2", - "atilde": "0x00e3", - "adieresis": "0x00e4", - "aring": "0x00e5", - "ae": "0x00e6", - "ccedilla": "0x00e7", - "egrave": "0x00e8", - "eacute": "0x00e9", - "ecircumflex": "0x00ea", - "edieresis": "0x00eb", - "igrave": "0x00ec", - "iacute": "0x00ed", - "icircumflex": "0x00ee", - "idieresis": "0x00ef", - "eth": "0x00f0", - "ntilde": "0x00f1", - "ograve": "0x00f2", - "oacute": "0x00f3", - "ocircumflex": "0x00f4", - "otilde": "0x00f5", - "odieresis": "0x00f6", - "divide": "0x00f7", - "oslash": "0x00f8", - "ugrave": "0x00f9", - "uacute": "0x00fa", - "ucircumflex": "0x00fb", - "udieresis": "0x00fc", - "yacute": "0x00fd", - "thorn": "0x00fe", - "ydieresis": "0x00ff", - "Amacron": "0x0100", - "amacron": "0x0101", - "Abreve": "0x0102", - "abreve": "0x0103", - "Aogonek": "0x0104", - "aogonek": "0x0105", - "Cacute": "0x0106", - "cacute": "0x0107", - "Ccircumflex": "0x0108", - "ccircumflex": "0x0109", - "Cdotaccent": "0x010a", - "cdotaccent": "0x010b", - "Ccaron": "0x010c", - "ccaron": "0x010d", - "Dcaron": "0x010e", - "dcaron": "0x010f", - "Dcroat": "0x0110", - "dcroat": "0x0111", - "Emacron": "0x0112", - "emacron": "0x0113", - "Ebreve": "0x0114", - "ebreve": "0x0115", - "Edotaccent": "0x0116", - "edotaccent": "0x0117", - "Eogonek": "0x0118", - "eogonek": "0x0119", - "Ecaron": "0x011a", - "ecaron": "0x011b", - "Gcircumflex": "0x011c", - "gcircumflex": "0x011d", - "Gbreve": "0x011e", - "gbreve": "0x011f", - "Gdotaccent": "0x0120", - "gdotaccent": "0x0121", - "Gcommaaccent": "0x0122", - "gcommaaccent": "0x0123", - "Hcircumflex": "0x0124", - "hcircumflex": "0x0125", - "Hbar": "0x0126", - "hbar": "0x0127", - "Itilde": "0x0128", - "itilde": "0x0129", - "Imacron": "0x012a", - "imacron": "0x012b", - "Ibreve": "0x012c", - "ibreve": "0x012d", - "Iogonek": "0x012e", - "iogonek": "0x012f", - "Idotaccent": "0x0130", - "dotlessi": "0x0131", - "IJ": "0x0132", - "ij": "0x0133", - "Jcircumflex": "0x0134", - "jcircumflex": "0x0135", - "Kcommaaccent": "0x0136", - "kcommaaccent": "0x0137", - "kgreenlandic": "0x0138", - "Lacute": "0x0139", - "lacute": "0x013a", - "Lcommaaccent": "0x013b", - "lcommaaccent": "0x013c", - "Lcaron": "0x013d", - "lcaron": "0x013e", - "Ldot": "0x013f", - "ldot": "0x0140", - "Lslash": "0x0141", - "lslash": "0x0142", - "Nacute": "0x0143", - "nacute": "0x0144", - "Ncommaaccent": "0x0145", - "ncommaaccent": "0x0146", - "Ncaron": "0x0147", - "ncaron": "0x0148", - "napostrophe": "0x0149", - "Eng": "0x014a", - "eng": "0x014b", - "Omacron": "0x014c", - "omacron": "0x014d", - "Obreve": "0x014e", - "obreve": "0x014f", - "Ohungarumlaut": "0x0150", - "ohungarumlaut": "0x0151", - "OE": "0x0152", - "oe": "0x0153", - "Racute": "0x0154", - "racute": "0x0155", - "Rcommaaccent": "0x0156", - "rcommaaccent": "0x0157", - "Rcaron": "0x0158", - "rcaron": "0x0159", - "Sacute": "0x015a", - "sacute": "0x015b", - "Scircumflex": "0x015c", - "scircumflex": "0x015d", - "Scedilla": "0xf6c1", - "scedilla": "0xf6c2", - "Scaron": "0x0160", - "scaron": "0x0161", - "Tcommaaccent": "0x021a", - "tcommaaccent": "0x021b", - "Tcaron": "0x0164", - "tcaron": "0x0165", - "Tbar": "0x0166", - "tbar": "0x0167", - "Utilde": "0x0168", - "utilde": "0x0169", - "Umacron": "0x016a", - "umacron": "0x016b", - "Ubreve": "0x016c", - "ubreve": "0x016d", - "Uring": "0x016e", - "uring": "0x016f", - "Uhungarumlaut": "0x0170", - "uhungarumlaut": "0x0171", - "Uogonek": "0x0172", - "uogonek": "0x0173", - "Wcircumflex": "0x0174", - "wcircumflex": "0x0175", - "Ycircumflex": "0x0176", - "ycircumflex": "0x0177", - "Ydieresis": "0x0178", - "Zacute": "0x0179", - "zacute": "0x017a", - "Zdotaccent": "0x017b", - "zdotaccent": "0x017c", - "Zcaron": "0x017d", - "zcaron": "0x017e", - "longs": "0x017f", - "florin": "0x0192", - "Ohorn": "0x01a0", - "ohorn": "0x01a1", - "Uhorn": "0x01af", - "uhorn": "0x01b0", - "Gcaron": "0x01e6", - "gcaron": "0x01e7", - "Aringacute": "0x01fa", - "aringacute": "0x01fb", - "AEacute": "0x01fc", - "aeacute": "0x01fd", - "Oslashacute": "0x01fe", - "oslashacute": "0x01ff", - "Scommaaccent": "0x0218", - "scommaaccent": "0x0219", - "afii57929": "0x02bc", - "afii64937": "0x02bd", - "circumflex": "0x02c6", - "caron": "0x02c7", - "breve": "0x02d8", - "dotaccent": "0x02d9", - "ring": "0x02da", - "ogonek": "0x02db", - "tilde": "0x02dc", - "hungarumlaut": "0x02dd", - "gravecomb": "0x0300", - "acutecomb": "0x0301", - "tildecomb": "0x0303", - "hookabovecomb": "0x0309", - "dotbelowcomb": "0x0323", - "tonos": "0x0384", - "dieresistonos": "0x0385", - "Alphatonos": "0x0386", - "anoteleia": "0x0387", - "Epsilontonos": "0x0388", - "Etatonos": "0x0389", - "Iotatonos": "0x038a", - "Omicrontonos": "0x038c", - "Upsilontonos": "0x038e", - "Omegatonos": "0x038f", - "iotadieresistonos": "0x0390", - "Alpha": "0x0391", - "Beta": "0x0392", - "Gamma": "0x0393", - "Delta": "0x2206", - "Epsilon": "0x0395", - "Zeta": "0x0396", - "Eta": "0x0397", - "Theta": "0x0398", - "Iota": "0x0399", - "Kappa": "0x039a", - "Lambda": "0x039b", - "Mu": "0x039c", - "Nu": "0x039d", - "Xi": "0x039e", - "Omicron": "0x039f", - "Pi": "0x03a0", - "Rho": "0x03a1", - "Sigma": "0x03a3", - "Tau": "0x03a4", - "Upsilon": "0x03a5", - "Phi": "0x03a6", - "Chi": "0x03a7", - "Psi": "0x03a8", - "Omega": "0x2126", - "Iotadieresis": "0x03aa", - "Upsilondieresis": "0x03ab", - "alphatonos": "0x03ac", - "epsilontonos": "0x03ad", - "etatonos": "0x03ae", - "iotatonos": "0x03af", - "upsilondieresistonos": "0x03b0", - "alpha": "0x03b1", - "beta": "0x03b2", - "gamma": "0x03b3", - "delta": "0x03b4", - "epsilon": "0x03b5", - "zeta": "0x03b6", - "eta": "0x03b7", - "theta": "0x03b8", - "iota": "0x03b9", - "kappa": "0x03ba", - "lambda": "0x03bb", - "nu": "0x03bd", - "xi": "0x03be", - "omicron": "0x03bf", - "pi": "0x03c0", - "rho": "0x03c1", - "sigma1": "0x03c2", - "sigma": "0x03c3", - "tau": "0x03c4", - "upsilon": "0x03c5", - "phi": "0x03c6", - "chi": "0x03c7", - "psi": "0x03c8", - "omega": "0x03c9", - "iotadieresis": "0x03ca", - "upsilondieresis": "0x03cb", - "omicrontonos": "0x03cc", - "upsilontonos": "0x03cd", - "omegatonos": "0x03ce", - "theta1": "0x03d1", - "Upsilon1": "0x03d2", - "phi1": "0x03d5", - "omega1": "0x03d6", - "afii10023": "0x0401", - "afii10051": "0x0402", - "afii10052": "0x0403", - "afii10053": "0x0404", - "afii10054": "0x0405", - "afii10055": "0x0406", - "afii10056": "0x0407", - "afii10057": "0x0408", - "afii10058": "0x0409", - "afii10059": "0x040a", - "afii10060": "0x040b", - "afii10061": "0x040c", - "afii10062": "0x040e", - "afii10145": "0x040f", - "afii10017": "0x0410", - "afii10018": "0x0411", - "afii10019": "0x0412", - "afii10020": "0x0413", - "afii10021": "0x0414", - "afii10022": "0x0415", - "afii10024": "0x0416", - "afii10025": "0x0417", - "afii10026": "0x0418", - "afii10027": "0x0419", - "afii10028": "0x041a", - "afii10029": "0x041b", - "afii10030": "0x041c", - "afii10031": "0x041d", - "afii10032": "0x041e", - "afii10033": "0x041f", - "afii10034": "0x0420", - "afii10035": "0x0421", - "afii10036": "0x0422", - "afii10037": "0x0423", - "afii10038": "0x0424", - "afii10039": "0x0425", - "afii10040": "0x0426", - "afii10041": "0x0427", - "afii10042": "0x0428", - "afii10043": "0x0429", - "afii10044": "0x042a", - "afii10045": "0x042b", - "afii10046": "0x042c", - "afii10047": "0x042d", - "afii10048": "0x042e", - "afii10049": "0x042f", - "afii10065": "0x0430", - "afii10066": "0x0431", - "afii10067": "0x0432", - "afii10068": "0x0433", - "afii10069": "0x0434", - "afii10070": "0x0435", - "afii10072": "0x0436", - "afii10073": "0x0437", - "afii10074": "0x0438", - "afii10075": "0x0439", - "afii10076": "0x043a", - "afii10077": "0x043b", - "afii10078": "0x043c", - "afii10079": "0x043d", - "afii10080": "0x043e", - "afii10081": "0x043f", - "afii10082": "0x0440", - "afii10083": "0x0441", - "afii10084": "0x0442", - "afii10085": "0x0443", - "afii10086": "0x0444", - "afii10087": "0x0445", - "afii10088": "0x0446", - "afii10089": "0x0447", - "afii10090": "0x0448", - "afii10091": "0x0449", - "afii10092": "0x044a", - "afii10093": "0x044b", - "afii10094": "0x044c", - "afii10095": "0x044d", - "afii10096": "0x044e", - "afii10097": "0x044f", - "afii10071": "0x0451", - "afii10099": "0x0452", - "afii10100": "0x0453", - "afii10101": "0x0454", - "afii10102": "0x0455", - "afii10103": "0x0456", - "afii10104": "0x0457", - "afii10105": "0x0458", - "afii10106": "0x0459", - "afii10107": "0x045a", - "afii10108": "0x045b", - "afii10109": "0x045c", - "afii10110": "0x045e", - "afii10193": "0x045f", - "afii10146": "0x0462", - "afii10194": "0x0463", - "afii10147": "0x0472", - "afii10195": "0x0473", - "afii10148": "0x0474", - "afii10196": "0x0475", - "afii10050": "0x0490", - "afii10098": "0x0491", - "afii10846": "0x04d9", - "afii57799": "0x05b0", - "afii57801": "0x05b1", - "afii57800": "0x05b2", - "afii57802": "0x05b3", - "afii57793": "0x05b4", - "afii57794": "0x05b5", - "afii57795": "0x05b6", - "afii57798": "0x05b7", - "afii57797": "0x05b8", - "afii57806": "0x05b9", - "afii57796": "0x05bb", - "afii57807": "0x05bc", - "afii57839": "0x05bd", - "afii57645": "0x05be", - "afii57841": "0x05bf", - "afii57842": "0x05c0", - "afii57804": "0x05c1", - "afii57803": "0x05c2", - "afii57658": "0x05c3", - "afii57664": "0x05d0", - "afii57665": "0x05d1", - "afii57666": "0x05d2", - "afii57667": "0x05d3", - "afii57668": "0x05d4", - "afii57669": "0x05d5", - "afii57670": "0x05d6", - "afii57671": "0x05d7", - "afii57672": "0x05d8", - "afii57673": "0x05d9", - "afii57674": "0x05da", - "afii57675": "0x05db", - "afii57676": "0x05dc", - "afii57677": "0x05dd", - "afii57678": "0x05de", - "afii57679": "0x05df", - "afii57680": "0x05e0", - "afii57681": "0x05e1", - "afii57682": "0x05e2", - "afii57683": "0x05e3", - "afii57684": "0x05e4", - "afii57685": "0x05e5", - "afii57686": "0x05e6", - "afii57687": "0x05e7", - "afii57688": "0x05e8", - "afii57689": "0x05e9", - "afii57690": "0x05ea", - "afii57716": "0x05f0", - "afii57717": "0x05f1", - "afii57718": "0x05f2", - "afii57388": "0x060c", - "afii57403": "0x061b", - "afii57407": "0x061f", - "afii57409": "0x0621", - "afii57410": "0x0622", - "afii57411": "0x0623", - "afii57412": "0x0624", - "afii57413": "0x0625", - "afii57414": "0x0626", - "afii57415": "0x0627", - "afii57416": "0x0628", - "afii57417": "0x0629", - "afii57418": "0x062a", - "afii57419": "0x062b", - "afii57420": "0x062c", - "afii57421": "0x062d", - "afii57422": "0x062e", - "afii57423": "0x062f", - "afii57424": "0x0630", - "afii57425": "0x0631", - "afii57426": "0x0632", - "afii57427": "0x0633", - "afii57428": "0x0634", - "afii57429": "0x0635", - "afii57430": "0x0636", - "afii57431": "0x0637", - "afii57432": "0x0638", - "afii57433": "0x0639", - "afii57434": "0x063a", - "afii57440": "0x0640", - "afii57441": "0x0641", - "afii57442": "0x0642", - "afii57443": "0x0643", - "afii57444": "0x0644", - "afii57445": "0x0645", - "afii57446": "0x0646", - "afii57470": "0x0647", - "afii57448": "0x0648", - "afii57449": "0x0649", - "afii57450": "0x064a", - "afii57451": "0x064b", - "afii57452": "0x064c", - "afii57453": "0x064d", - "afii57454": "0x064e", - "afii57455": "0x064f", - "afii57456": "0x0650", - "afii57457": "0x0651", - "afii57458": "0x0652", - "afii57392": "0x0660", - "afii57393": "0x0661", - "afii57394": "0x0662", - "afii57395": "0x0663", - "afii57396": "0x0664", - "afii57397": "0x0665", - "afii57398": "0x0666", - "afii57399": "0x0667", - "afii57400": "0x0668", - "afii57401": "0x0669", - "afii57381": "0x066a", - "afii63167": "0x066d", - "afii57511": "0x0679", - "afii57506": "0x067e", - "afii57507": "0x0686", - "afii57512": "0x0688", - "afii57513": "0x0691", - "afii57508": "0x0698", - "afii57505": "0x06a4", - "afii57509": "0x06af", - "afii57514": "0x06ba", - "afii57519": "0x06d2", - "afii57534": "0x06d5", - "Wgrave": "0x1e80", - "wgrave": "0x1e81", - "Wacute": "0x1e82", - "wacute": "0x1e83", - "Wdieresis": "0x1e84", - "wdieresis": "0x1e85", - "Ygrave": "0x1ef2", - "ygrave": "0x1ef3", - "afii61664": "0x200c", - "afii301": "0x200d", - "afii299": "0x200e", - "afii300": "0x200f", - "figuredash": "0x2012", - "endash": "0x2013", - "emdash": "0x2014", - "afii00208": "0x2015", - "underscoredbl": "0x2017", - "quoteleft": "0x2018", - "quoteright": "0x2019", - "quotesinglbase": "0x201a", - "quotereversed": "0x201b", - "quotedblleft": "0x201c", - "quotedblright": "0x201d", - "quotedblbase": "0x201e", - "dagger": "0x2020", - "daggerdbl": "0x2021", - "bullet": "0x2022", - "onedotenleader": "0x2024", - "twodotenleader": "0x2025", - "ellipsis": "0x2026", - "afii61573": "0x202c", - "afii61574": "0x202d", - "afii61575": "0x202e", - "perthousand": "0x2030", - "minute": "0x2032", - "second": "0x2033", - "guilsinglleft": "0x2039", - "guilsinglright": "0x203a", - "exclamdbl": "0x203c", - "fraction": "0x2215", - "zerosuperior": "0x2070", - "foursuperior": "0x2074", - "fivesuperior": "0x2075", - "sixsuperior": "0x2076", - "sevensuperior": "0x2077", - "eightsuperior": "0x2078", - "ninesuperior": "0x2079", - "parenleftsuperior": "0x207d", - "parenrightsuperior": "0x207e", - "nsuperior": "0x207f", - "zeroinferior": "0x2080", - "oneinferior": "0x2081", - "twoinferior": "0x2082", - "threeinferior": "0x2083", - "fourinferior": "0x2084", - "fiveinferior": "0x2085", - "sixinferior": "0x2086", - "seveninferior": "0x2087", - "eightinferior": "0x2088", - "nineinferior": "0x2089", - "parenleftinferior": "0x208d", - "parenrightinferior": "0x208e", - "colonmonetary": "0x20a1", - "franc": "0x20a3", - "lira": "0x20a4", - "peseta": "0x20a7", - "afii57636": "0x20aa", - "dong": "0x20ab", - "Euro": "0x20ac", - "afii61248": "0x2105", - "Ifraktur": "0x2111", - "afii61289": "0x2113", - "afii61352": "0x2116", - "weierstrass": "0x2118", - "Rfraktur": "0x211c", - "prescription": "0x211e", - "trademark": "0x2122", - "estimated": "0x212e", - "aleph": "0x2135", - "onethird": "0x2153", - "twothirds": "0x2154", - "oneeighth": "0x215b", - "threeeighths": "0x215c", - "fiveeighths": "0x215d", - "seveneighths": "0x215e", - "arrowleft": "0x2190", - "arrowup": "0x2191", - "arrowright": "0x2192", - "arrowdown": "0x2193", - "arrowboth": "0x2194", - "arrowupdn": "0x2195", - "arrowupdnbse": "0x21a8", - "carriagereturn": "0x21b5", - "arrowdblleft": "0x21d0", - "arrowdblup": "0x21d1", - "arrowdblright": "0x21d2", - "arrowdbldown": "0x21d3", - "arrowdblboth": "0x21d4", - "universal": "0x2200", - "partialdiff": "0x2202", - "existential": "0x2203", - "emptyset": "0x2205", - "gradient": "0x2207", - "element": "0x2208", - "notelement": "0x2209", - "suchthat": "0x220b", - "product": "0x220f", - "summation": "0x2211", - "asteriskmath": "0x2217", - "radical": "0x221a", - "proportional": "0x221d", - "infinity": "0x221e", - "orthogonal": "0x221f", - "angle": "0x2220", - "logicaland": "0x2227", - "logicalor": "0x2228", - "intersection": "0x2229", - "union": "0x222a", - "integral": "0x222b", - "therefore": "0x2234", - "similar": "0x223c", - "congruent": "0x2245", - "approxequal": "0x2248", - "notequal": "0x2260", - "equivalence": "0x2261", - "lessequal": "0x2264", - "greaterequal": "0x2265", - "propersubset": "0x2282", - "propersuperset": "0x2283", - "notsubset": "0x2284", - "reflexsubset": "0x2286", - "reflexsuperset": "0x2287", - "circleplus": "0x2295", - "circlemultiply": "0x2297", - "perpendicular": "0x22a5", - "dotmath": "0x22c5", - "house": "0x2302", - "revlogicalnot": "0x2310", - "integraltp": "0x2320", - "integralbt": "0x2321", - "angleleft": "0x2329", - "angleright": "0x232a", - "SF100000": "0x2500", - "SF110000": "0x2502", - "SF010000": "0x250c", - "SF030000": "0x2510", - "SF020000": "0x2514", - "SF040000": "0x2518", - "SF080000": "0x251c", - "SF090000": "0x2524", - "SF060000": "0x252c", - "SF070000": "0x2534", - "SF050000": "0x253c", - "SF430000": "0x2550", - "SF240000": "0x2551", - "SF510000": "0x2552", - "SF520000": "0x2553", - "SF390000": "0x2554", - "SF220000": "0x2555", - "SF210000": "0x2556", - "SF250000": "0x2557", - "SF500000": "0x2558", - "SF490000": "0x2559", - "SF380000": "0x255a", - "SF280000": "0x255b", - "SF270000": "0x255c", - "SF260000": "0x255d", - "SF360000": "0x255e", - "SF370000": "0x255f", - "SF420000": "0x2560", - "SF190000": "0x2561", - "SF200000": "0x2562", - "SF230000": "0x2563", - "SF470000": "0x2564", - "SF480000": "0x2565", - "SF410000": "0x2566", - "SF450000": "0x2567", - "SF460000": "0x2568", - "SF400000": "0x2569", - "SF540000": "0x256a", - "SF530000": "0x256b", - "SF440000": "0x256c", - "upblock": "0x2580", - "dnblock": "0x2584", - "block": "0x2588", - "lfblock": "0x258c", - "rtblock": "0x2590", - "ltshade": "0x2591", - "shade": "0x2592", - "dkshade": "0x2593", - "filledbox": "0x25a0", - "H22073": "0x25a1", - "H18543": "0x25aa", - "H18551": "0x25ab", - "filledrect": "0x25ac", - "triagup": "0x25b2", - "triagrt": "0x25ba", - "triagdn": "0x25bc", - "triaglf": "0x25c4", - "lozenge": "0x25ca", - "circle": "0x25cb", - "H18533": "0x25cf", - "invbullet": "0x25d8", - "invcircle": "0x25d9", - "openbullet": "0x25e6", - "smileface": "0x263a", - "invsmileface": "0x263b", - "sun": "0x263c", - "female": "0x2640", - "male": "0x2642", - "spade": "0x2660", - "club": "0x2663", - "heart": "0x2665", - "diamond": "0x2666", - "musicalnote": "0x266a", - "musicalnotedbl": "0x266b", - "dotlessj": "0xf6be", - "LL": "0xf6bf", - "ll": "0xf6c0", - "commaaccent": "0xf6c3", - "afii10063": "0xf6c4", - "afii10064": "0xf6c5", - "afii10192": "0xf6c6", - "afii10831": "0xf6c7", - "afii10832": "0xf6c8", - "Acute": "0xf6c9", - "Caron": "0xf6ca", - "Dieresis": "0xf6cb", - "DieresisAcute": "0xf6cc", - "DieresisGrave": "0xf6cd", - "Grave": "0xf6ce", - "Hungarumlaut": "0xf6cf", - "Macron": "0xf6d0", - "cyrBreve": "0xf6d1", - "cyrFlex": "0xf6d2", - "dblGrave": "0xf6d3", - "cyrbreve": "0xf6d4", - "cyrflex": "0xf6d5", - "dblgrave": "0xf6d6", - "dieresisacute": "0xf6d7", - "dieresisgrave": "0xf6d8", - "copyrightserif": "0xf6d9", - "registerserif": "0xf6da", - "trademarkserif": "0xf6db", - "onefitted": "0xf6dc", - "rupiah": "0xf6dd", - "threequartersemdash": "0xf6de", - "centinferior": "0xf6df", - "centsuperior": "0xf6e0", - "commainferior": "0xf6e1", - "commasuperior": "0xf6e2", - "dollarinferior": "0xf6e3", - "dollarsuperior": "0xf6e4", - "hypheninferior": "0xf6e5", - "hyphensuperior": "0xf6e6", - "periodinferior": "0xf6e7", - "periodsuperior": "0xf6e8", - "asuperior": "0xf6e9", - "bsuperior": "0xf6ea", - "dsuperior": "0xf6eb", - "esuperior": "0xf6ec", - "isuperior": "0xf6ed", - "lsuperior": "0xf6ee", - "msuperior": "0xf6ef", - "osuperior": "0xf6f0", - "rsuperior": "0xf6f1", - "ssuperior": "0xf6f2", - "tsuperior": "0xf6f3", - "Brevesmall": "0xf6f4", - "Caronsmall": "0xf6f5", - "Circumflexsmall": "0xf6f6", - "Dotaccentsmall": "0xf6f7", - "Hungarumlautsmall": "0xf6f8", - "Lslashsmall": "0xf6f9", - "OEsmall": "0xf6fa", - "Ogoneksmall": "0xf6fb", - "Ringsmall": "0xf6fc", - "Scaronsmall": "0xf6fd", - "Tildesmall": "0xf6fe", - "Zcaronsmall": "0xf6ff", - "exclamsmall": "0xf721", - "dollaroldstyle": "0xf724", - "ampersandsmall": "0xf726", - "zerooldstyle": "0xf730", - "oneoldstyle": "0xf731", - "twooldstyle": "0xf732", - "threeoldstyle": "0xf733", - "fouroldstyle": "0xf734", - "fiveoldstyle": "0xf735", - "sixoldstyle": "0xf736", - "sevenoldstyle": "0xf737", - "eightoldstyle": "0xf738", - "nineoldstyle": "0xf739", - "questionsmall": "0xf73f", - "Gravesmall": "0xf760", - "Asmall": "0xf761", - "Bsmall": "0xf762", - "Csmall": "0xf763", - "Dsmall": "0xf764", - "Esmall": "0xf765", - "Fsmall": "0xf766", - "Gsmall": "0xf767", - "Hsmall": "0xf768", - "Ismall": "0xf769", - "Jsmall": "0xf76a", - "Ksmall": "0xf76b", - "Lsmall": "0xf76c", - "Msmall": "0xf76d", - "Nsmall": "0xf76e", - "Osmall": "0xf76f", - "Psmall": "0xf770", - "Qsmall": "0xf771", - "Rsmall": "0xf772", - "Ssmall": "0xf773", - "Tsmall": "0xf774", - "Usmall": "0xf775", - "Vsmall": "0xf776", - "Wsmall": "0xf777", - "Xsmall": "0xf778", - "Ysmall": "0xf779", - "Zsmall": "0xf77a", - "exclamdownsmall": "0xf7a1", - "centoldstyle": "0xf7a2", - "Dieresissmall": "0xf7a8", - "Macronsmall": "0xf7af", - "Acutesmall": "0xf7b4", - "Cedillasmall": "0xf7b8", - "questiondownsmall": "0xf7bf", - "Agravesmall": "0xf7e0", - "Aacutesmall": "0xf7e1", - "Acircumflexsmall": "0xf7e2", - "Atildesmall": "0xf7e3", - "Adieresissmall": "0xf7e4", - "Aringsmall": "0xf7e5", - "AEsmall": "0xf7e6", - "Ccedillasmall": "0xf7e7", - "Egravesmall": "0xf7e8", - "Eacutesmall": "0xf7e9", - "Ecircumflexsmall": "0xf7ea", - "Edieresissmall": "0xf7eb", - "Igravesmall": "0xf7ec", - "Iacutesmall": "0xf7ed", - "Icircumflexsmall": "0xf7ee", - "Idieresissmall": "0xf7ef", - "Ethsmall": "0xf7f0", - "Ntildesmall": "0xf7f1", - "Ogravesmall": "0xf7f2", - "Oacutesmall": "0xf7f3", - "Ocircumflexsmall": "0xf7f4", - "Otildesmall": "0xf7f5", - "Odieresissmall": "0xf7f6", - "Oslashsmall": "0xf7f8", - "Ugravesmall": "0xf7f9", - "Uacutesmall": "0xf7fa", - "Ucircumflexsmall": "0xf7fb", - "Udieresissmall": "0xf7fc", - "Yacutesmall": "0xf7fd", - "Thornsmall": "0xf7fe", - "Ydieresissmall": "0xf7ff", - "radicalex": "0xf8e5", - "arrowvertex": "0xf8e6", - "arrowhorizex": "0xf8e7", - "registersans": "0xf8e8", - "copyrightsans": "0xf8e9", - "trademarksans": "0xf8ea", - "parenlefttp": "0xf8eb", - "parenleftex": "0xf8ec", - "parenleftbt": "0xf8ed", - "bracketlefttp": "0xf8ee", - "bracketleftex": "0xf8ef", - "bracketleftbt": "0xf8f0", - "bracelefttp": "0xf8f1", - "braceleftmid": "0xf8f2", - "braceleftbt": "0xf8f3", - "braceex": "0xf8f4", - "integralex": "0xf8f5", - "parenrighttp": "0xf8f6", - "parenrightex": "0xf8f7", - "parenrightbt": "0xf8f8", - "bracketrighttp": "0xf8f9", - "bracketrightex": "0xf8fa", - "bracketrightbt": "0xf8fb", - "bracerighttp": "0xf8fc", - "bracerightmid": "0xf8fd", - "bracerightbt": "0xf8fe", - "ff": "0xfb00", - "fi": "0xfb01", - "fl": "0xfb02", - "ffi": "0xfb03", - "ffl": "0xfb04", - "afii57705": "0xfb1f", - "afii57694": "0xfb2a", - "afii57695": "0xfb2b", - "afii57723": "0xfb35", - "afii57700": "0xfb4b" -} diff --git a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php index 2e54ccc1..90e49eb9 100644 --- a/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php +++ b/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php @@ -34,8 +34,6 @@ */ class PostScriptGlyphs { - private static $glyphs = null; - /** * @return array * @@ -45,11 +43,1047 @@ class PostScriptGlyphs */ public static function getGlyphs() { - if (null === self::$glyphs) { - self::$glyphs = json_decode(file_get_contents(__DIR__.'/PostScriptGlyphs.json'), true); - } - - return self::$glyphs; + return [ + 'space' => '0x00a0', + 'exclam' => '0x0021', + 'quotedbl' => '0x0022', + 'numbersign' => '0x0023', + 'dollar' => '0x0024', + 'percent' => '0x0025', + 'ampersand' => '0x0026', + 'quotesingle' => '0x0027', + 'parenleft' => '0x0028', + 'parenright' => '0x0029', + 'asterisk' => '0x002a', + 'plus' => '0x002b', + 'comma' => '0x002c', + 'hyphen' => '0x002d', + 'period' => '0x002e', + 'slash' => '0x002f', + 'zero' => '0x0030', + 'one' => '0x0031', + 'two' => '0x0032', + 'three' => '0x0033', + 'four' => '0x0034', + 'five' => '0x0035', + 'six' => '0x0036', + 'seven' => '0x0037', + 'eight' => '0x0038', + 'nine' => '0x0039', + 'colon' => '0x003a', + 'semicolon' => '0x003b', + 'less' => '0x003c', + 'equal' => '0x003d', + 'greater' => '0x003e', + 'question' => '0x003f', + 'at' => '0x0040', + 'A' => '0x0041', + 'B' => '0x0042', + 'C' => '0x0043', + 'D' => '0x0044', + 'E' => '0x0045', + 'F' => '0x0046', + 'G' => '0x0047', + 'H' => '0x0048', + 'I' => '0x0049', + 'J' => '0x004a', + 'K' => '0x004b', + 'L' => '0x004c', + 'M' => '0x004d', + 'N' => '0x004e', + 'O' => '0x004f', + 'P' => '0x0050', + 'Q' => '0x0051', + 'R' => '0x0052', + 'S' => '0x0053', + 'T' => '0x0054', + 'U' => '0x0055', + 'V' => '0x0056', + 'W' => '0x0057', + 'X' => '0x0058', + 'Y' => '0x0059', + 'Z' => '0x005a', + 'bracketleft' => '0x005b', + 'backslash' => '0x005c', + 'bracketright' => '0x005d', + 'asciicircum' => '0x005e', + 'underscore' => '0x005f', + 'grave' => '0x0060', + 'a' => '0x0061', + 'b' => '0x0062', + 'c' => '0x0063', + 'd' => '0x0064', + 'e' => '0x0065', + 'f' => '0x0066', + 'g' => '0x0067', + 'h' => '0x0068', + 'i' => '0x0069', + 'j' => '0x006a', + 'k' => '0x006b', + 'l' => '0x006c', + 'm' => '0x006d', + 'n' => '0x006e', + 'o' => '0x006f', + 'p' => '0x0070', + 'q' => '0x0071', + 'r' => '0x0072', + 's' => '0x0073', + 't' => '0x0074', + 'u' => '0x0075', + 'v' => '0x0076', + 'w' => '0x0077', + 'x' => '0x0078', + 'y' => '0x0079', + 'z' => '0x007a', + 'braceleft' => '0x007b', + 'bar' => '0x007c', + 'braceright' => '0x007d', + 'asciitilde' => '0x007e', + 'exclamdown' => '0x00a1', + 'cent' => '0x00a2', + 'sterling' => '0x00a3', + 'currency' => '0x00a4', + 'yen' => '0x00a5', + 'brokenbar' => '0x00a6', + 'section' => '0x00a7', + 'dieresis' => '0x00a8', + 'copyright' => '0x00a9', + 'ordfeminine' => '0x00aa', + 'guillemotleft' => '0x00ab', + 'logicalnot' => '0x00ac', + 'minus' => '0x2212', + 'registered' => '0x00ae', + 'macron' => '0x02c9', + 'degree' => '0x00b0', + 'plusminus' => '0x00b1', + 'twosuperior' => '0x00b2', + 'threesuperior' => '0x00b3', + 'acute' => '0x00b4', + 'mu' => '0x03bc', + 'paragraph' => '0x00b6', + 'periodcentered' => '0x2219', + 'cedilla' => '0x00b8', + 'onesuperior' => '0x00b9', + 'ordmasculine' => '0x00ba', + 'guillemotright' => '0x00bb', + 'onequarter' => '0x00bc', + 'onehalf' => '0x00bd', + 'threequarters' => '0x00be', + 'questiondown' => '0x00bf', + 'Agrave' => '0x00c0', + 'Aacute' => '0x00c1', + 'Acircumflex' => '0x00c2', + 'Atilde' => '0x00c3', + 'Adieresis' => '0x00c4', + 'Aring' => '0x00c5', + 'AE' => '0x00c6', + 'Ccedilla' => '0x00c7', + 'Egrave' => '0x00c8', + 'Eacute' => '0x00c9', + 'Ecircumflex' => '0x00ca', + 'Edieresis' => '0x00cb', + 'Igrave' => '0x00cc', + 'Iacute' => '0x00cd', + 'Icircumflex' => '0x00ce', + 'Idieresis' => '0x00cf', + 'Eth' => '0x00d0', + 'Ntilde' => '0x00d1', + 'Ograve' => '0x00d2', + 'Oacute' => '0x00d3', + 'Ocircumflex' => '0x00d4', + 'Otilde' => '0x00d5', + 'Odieresis' => '0x00d6', + 'multiply' => '0x00d7', + 'Oslash' => '0x00d8', + 'Ugrave' => '0x00d9', + 'Uacute' => '0x00da', + 'Ucircumflex' => '0x00db', + 'Udieresis' => '0x00dc', + 'Yacute' => '0x00dd', + 'Thorn' => '0x00de', + 'germandbls' => '0x00df', + 'agrave' => '0x00e0', + 'aacute' => '0x00e1', + 'acircumflex' => '0x00e2', + 'atilde' => '0x00e3', + 'adieresis' => '0x00e4', + 'aring' => '0x00e5', + 'ae' => '0x00e6', + 'ccedilla' => '0x00e7', + 'egrave' => '0x00e8', + 'eacute' => '0x00e9', + 'ecircumflex' => '0x00ea', + 'edieresis' => '0x00eb', + 'igrave' => '0x00ec', + 'iacute' => '0x00ed', + 'icircumflex' => '0x00ee', + 'idieresis' => '0x00ef', + 'eth' => '0x00f0', + 'ntilde' => '0x00f1', + 'ograve' => '0x00f2', + 'oacute' => '0x00f3', + 'ocircumflex' => '0x00f4', + 'otilde' => '0x00f5', + 'odieresis' => '0x00f6', + 'divide' => '0x00f7', + 'oslash' => '0x00f8', + 'ugrave' => '0x00f9', + 'uacute' => '0x00fa', + 'ucircumflex' => '0x00fb', + 'udieresis' => '0x00fc', + 'yacute' => '0x00fd', + 'thorn' => '0x00fe', + 'ydieresis' => '0x00ff', + 'Amacron' => '0x0100', + 'amacron' => '0x0101', + 'Abreve' => '0x0102', + 'abreve' => '0x0103', + 'Aogonek' => '0x0104', + 'aogonek' => '0x0105', + 'Cacute' => '0x0106', + 'cacute' => '0x0107', + 'Ccircumflex' => '0x0108', + 'ccircumflex' => '0x0109', + 'Cdotaccent' => '0x010a', + 'cdotaccent' => '0x010b', + 'Ccaron' => '0x010c', + 'ccaron' => '0x010d', + 'Dcaron' => '0x010e', + 'dcaron' => '0x010f', + 'Dcroat' => '0x0110', + 'dcroat' => '0x0111', + 'Emacron' => '0x0112', + 'emacron' => '0x0113', + 'Ebreve' => '0x0114', + 'ebreve' => '0x0115', + 'Edotaccent' => '0x0116', + 'edotaccent' => '0x0117', + 'Eogonek' => '0x0118', + 'eogonek' => '0x0119', + 'Ecaron' => '0x011a', + 'ecaron' => '0x011b', + 'Gcircumflex' => '0x011c', + 'gcircumflex' => '0x011d', + 'Gbreve' => '0x011e', + 'gbreve' => '0x011f', + 'Gdotaccent' => '0x0120', + 'gdotaccent' => '0x0121', + 'Gcommaaccent' => '0x0122', + 'gcommaaccent' => '0x0123', + 'Hcircumflex' => '0x0124', + 'hcircumflex' => '0x0125', + 'Hbar' => '0x0126', + 'hbar' => '0x0127', + 'Itilde' => '0x0128', + 'itilde' => '0x0129', + 'Imacron' => '0x012a', + 'imacron' => '0x012b', + 'Ibreve' => '0x012c', + 'ibreve' => '0x012d', + 'Iogonek' => '0x012e', + 'iogonek' => '0x012f', + 'Idotaccent' => '0x0130', + 'dotlessi' => '0x0131', + 'IJ' => '0x0132', + 'ij' => '0x0133', + 'Jcircumflex' => '0x0134', + 'jcircumflex' => '0x0135', + 'Kcommaaccent' => '0x0136', + 'kcommaaccent' => '0x0137', + 'kgreenlandic' => '0x0138', + 'Lacute' => '0x0139', + 'lacute' => '0x013a', + 'Lcommaaccent' => '0x013b', + 'lcommaaccent' => '0x013c', + 'Lcaron' => '0x013d', + 'lcaron' => '0x013e', + 'Ldot' => '0x013f', + 'ldot' => '0x0140', + 'Lslash' => '0x0141', + 'lslash' => '0x0142', + 'Nacute' => '0x0143', + 'nacute' => '0x0144', + 'Ncommaaccent' => '0x0145', + 'ncommaaccent' => '0x0146', + 'Ncaron' => '0x0147', + 'ncaron' => '0x0148', + 'napostrophe' => '0x0149', + 'Eng' => '0x014a', + 'eng' => '0x014b', + 'Omacron' => '0x014c', + 'omacron' => '0x014d', + 'Obreve' => '0x014e', + 'obreve' => '0x014f', + 'Ohungarumlaut' => '0x0150', + 'ohungarumlaut' => '0x0151', + 'OE' => '0x0152', + 'oe' => '0x0153', + 'Racute' => '0x0154', + 'racute' => '0x0155', + 'Rcommaaccent' => '0x0156', + 'rcommaaccent' => '0x0157', + 'Rcaron' => '0x0158', + 'rcaron' => '0x0159', + 'Sacute' => '0x015a', + 'sacute' => '0x015b', + 'Scircumflex' => '0x015c', + 'scircumflex' => '0x015d', + 'Scedilla' => '0xf6c1', + 'scedilla' => '0xf6c2', + 'Scaron' => '0x0160', + 'scaron' => '0x0161', + 'Tcommaaccent' => '0x021a', + 'tcommaaccent' => '0x021b', + 'Tcaron' => '0x0164', + 'tcaron' => '0x0165', + 'Tbar' => '0x0166', + 'tbar' => '0x0167', + 'Utilde' => '0x0168', + 'utilde' => '0x0169', + 'Umacron' => '0x016a', + 'umacron' => '0x016b', + 'Ubreve' => '0x016c', + 'ubreve' => '0x016d', + 'Uring' => '0x016e', + 'uring' => '0x016f', + 'Uhungarumlaut' => '0x0170', + 'uhungarumlaut' => '0x0171', + 'Uogonek' => '0x0172', + 'uogonek' => '0x0173', + 'Wcircumflex' => '0x0174', + 'wcircumflex' => '0x0175', + 'Ycircumflex' => '0x0176', + 'ycircumflex' => '0x0177', + 'Ydieresis' => '0x0178', + 'Zacute' => '0x0179', + 'zacute' => '0x017a', + 'Zdotaccent' => '0x017b', + 'zdotaccent' => '0x017c', + 'Zcaron' => '0x017d', + 'zcaron' => '0x017e', + 'longs' => '0x017f', + 'florin' => '0x0192', + 'Ohorn' => '0x01a0', + 'ohorn' => '0x01a1', + 'Uhorn' => '0x01af', + 'uhorn' => '0x01b0', + 'Gcaron' => '0x01e6', + 'gcaron' => '0x01e7', + 'Aringacute' => '0x01fa', + 'aringacute' => '0x01fb', + 'AEacute' => '0x01fc', + 'aeacute' => '0x01fd', + 'Oslashacute' => '0x01fe', + 'oslashacute' => '0x01ff', + 'Scommaaccent' => '0x0218', + 'scommaaccent' => '0x0219', + 'afii57929' => '0x02bc', + 'afii64937' => '0x02bd', + 'circumflex' => '0x02c6', + 'caron' => '0x02c7', + 'breve' => '0x02d8', + 'dotaccent' => '0x02d9', + 'ring' => '0x02da', + 'ogonek' => '0x02db', + 'tilde' => '0x02dc', + 'hungarumlaut' => '0x02dd', + 'gravecomb' => '0x0300', + 'acutecomb' => '0x0301', + 'tildecomb' => '0x0303', + 'hookabovecomb' => '0x0309', + 'dotbelowcomb' => '0x0323', + 'tonos' => '0x0384', + 'dieresistonos' => '0x0385', + 'Alphatonos' => '0x0386', + 'anoteleia' => '0x0387', + 'Epsilontonos' => '0x0388', + 'Etatonos' => '0x0389', + 'Iotatonos' => '0x038a', + 'Omicrontonos' => '0x038c', + 'Upsilontonos' => '0x038e', + 'Omegatonos' => '0x038f', + 'iotadieresistonos' => '0x0390', + 'Alpha' => '0x0391', + 'Beta' => '0x0392', + 'Gamma' => '0x0393', + 'Delta' => '0x2206', + 'Epsilon' => '0x0395', + 'Zeta' => '0x0396', + 'Eta' => '0x0397', + 'Theta' => '0x0398', + 'Iota' => '0x0399', + 'Kappa' => '0x039a', + 'Lambda' => '0x039b', + 'Mu' => '0x039c', + 'Nu' => '0x039d', + 'Xi' => '0x039e', + 'Omicron' => '0x039f', + 'Pi' => '0x03a0', + 'Rho' => '0x03a1', + 'Sigma' => '0x03a3', + 'Tau' => '0x03a4', + 'Upsilon' => '0x03a5', + 'Phi' => '0x03a6', + 'Chi' => '0x03a7', + 'Psi' => '0x03a8', + 'Omega' => '0x2126', + 'Iotadieresis' => '0x03aa', + 'Upsilondieresis' => '0x03ab', + 'alphatonos' => '0x03ac', + 'epsilontonos' => '0x03ad', + 'etatonos' => '0x03ae', + 'iotatonos' => '0x03af', + 'upsilondieresistonos' => '0x03b0', + 'alpha' => '0x03b1', + 'beta' => '0x03b2', + 'gamma' => '0x03b3', + 'delta' => '0x03b4', + 'epsilon' => '0x03b5', + 'zeta' => '0x03b6', + 'eta' => '0x03b7', + 'theta' => '0x03b8', + 'iota' => '0x03b9', + 'kappa' => '0x03ba', + 'lambda' => '0x03bb', + 'nu' => '0x03bd', + 'xi' => '0x03be', + 'omicron' => '0x03bf', + 'pi' => '0x03c0', + 'rho' => '0x03c1', + 'sigma1' => '0x03c2', + 'sigma' => '0x03c3', + 'tau' => '0x03c4', + 'upsilon' => '0x03c5', + 'phi' => '0x03c6', + 'chi' => '0x03c7', + 'psi' => '0x03c8', + 'omega' => '0x03c9', + 'iotadieresis' => '0x03ca', + 'upsilondieresis' => '0x03cb', + 'omicrontonos' => '0x03cc', + 'upsilontonos' => '0x03cd', + 'omegatonos' => '0x03ce', + 'theta1' => '0x03d1', + 'Upsilon1' => '0x03d2', + 'phi1' => '0x03d5', + 'omega1' => '0x03d6', + 'afii10023' => '0x0401', + 'afii10051' => '0x0402', + 'afii10052' => '0x0403', + 'afii10053' => '0x0404', + 'afii10054' => '0x0405', + 'afii10055' => '0x0406', + 'afii10056' => '0x0407', + 'afii10057' => '0x0408', + 'afii10058' => '0x0409', + 'afii10059' => '0x040a', + 'afii10060' => '0x040b', + 'afii10061' => '0x040c', + 'afii10062' => '0x040e', + 'afii10145' => '0x040f', + 'afii10017' => '0x0410', + 'afii10018' => '0x0411', + 'afii10019' => '0x0412', + 'afii10020' => '0x0413', + 'afii10021' => '0x0414', + 'afii10022' => '0x0415', + 'afii10024' => '0x0416', + 'afii10025' => '0x0417', + 'afii10026' => '0x0418', + 'afii10027' => '0x0419', + 'afii10028' => '0x041a', + 'afii10029' => '0x041b', + 'afii10030' => '0x041c', + 'afii10031' => '0x041d', + 'afii10032' => '0x041e', + 'afii10033' => '0x041f', + 'afii10034' => '0x0420', + 'afii10035' => '0x0421', + 'afii10036' => '0x0422', + 'afii10037' => '0x0423', + 'afii10038' => '0x0424', + 'afii10039' => '0x0425', + 'afii10040' => '0x0426', + 'afii10041' => '0x0427', + 'afii10042' => '0x0428', + 'afii10043' => '0x0429', + 'afii10044' => '0x042a', + 'afii10045' => '0x042b', + 'afii10046' => '0x042c', + 'afii10047' => '0x042d', + 'afii10048' => '0x042e', + 'afii10049' => '0x042f', + 'afii10065' => '0x0430', + 'afii10066' => '0x0431', + 'afii10067' => '0x0432', + 'afii10068' => '0x0433', + 'afii10069' => '0x0434', + 'afii10070' => '0x0435', + 'afii10072' => '0x0436', + 'afii10073' => '0x0437', + 'afii10074' => '0x0438', + 'afii10075' => '0x0439', + 'afii10076' => '0x043a', + 'afii10077' => '0x043b', + 'afii10078' => '0x043c', + 'afii10079' => '0x043d', + 'afii10080' => '0x043e', + 'afii10081' => '0x043f', + 'afii10082' => '0x0440', + 'afii10083' => '0x0441', + 'afii10084' => '0x0442', + 'afii10085' => '0x0443', + 'afii10086' => '0x0444', + 'afii10087' => '0x0445', + 'afii10088' => '0x0446', + 'afii10089' => '0x0447', + 'afii10090' => '0x0448', + 'afii10091' => '0x0449', + 'afii10092' => '0x044a', + 'afii10093' => '0x044b', + 'afii10094' => '0x044c', + 'afii10095' => '0x044d', + 'afii10096' => '0x044e', + 'afii10097' => '0x044f', + 'afii10071' => '0x0451', + 'afii10099' => '0x0452', + 'afii10100' => '0x0453', + 'afii10101' => '0x0454', + 'afii10102' => '0x0455', + 'afii10103' => '0x0456', + 'afii10104' => '0x0457', + 'afii10105' => '0x0458', + 'afii10106' => '0x0459', + 'afii10107' => '0x045a', + 'afii10108' => '0x045b', + 'afii10109' => '0x045c', + 'afii10110' => '0x045e', + 'afii10193' => '0x045f', + 'afii10146' => '0x0462', + 'afii10194' => '0x0463', + 'afii10147' => '0x0472', + 'afii10195' => '0x0473', + 'afii10148' => '0x0474', + 'afii10196' => '0x0475', + 'afii10050' => '0x0490', + 'afii10098' => '0x0491', + 'afii10846' => '0x04d9', + 'afii57799' => '0x05b0', + 'afii57801' => '0x05b1', + 'afii57800' => '0x05b2', + 'afii57802' => '0x05b3', + 'afii57793' => '0x05b4', + 'afii57794' => '0x05b5', + 'afii57795' => '0x05b6', + 'afii57798' => '0x05b7', + 'afii57797' => '0x05b8', + 'afii57806' => '0x05b9', + 'afii57796' => '0x05bb', + 'afii57807' => '0x05bc', + 'afii57839' => '0x05bd', + 'afii57645' => '0x05be', + 'afii57841' => '0x05bf', + 'afii57842' => '0x05c0', + 'afii57804' => '0x05c1', + 'afii57803' => '0x05c2', + 'afii57658' => '0x05c3', + 'afii57664' => '0x05d0', + 'afii57665' => '0x05d1', + 'afii57666' => '0x05d2', + 'afii57667' => '0x05d3', + 'afii57668' => '0x05d4', + 'afii57669' => '0x05d5', + 'afii57670' => '0x05d6', + 'afii57671' => '0x05d7', + 'afii57672' => '0x05d8', + 'afii57673' => '0x05d9', + 'afii57674' => '0x05da', + 'afii57675' => '0x05db', + 'afii57676' => '0x05dc', + 'afii57677' => '0x05dd', + 'afii57678' => '0x05de', + 'afii57679' => '0x05df', + 'afii57680' => '0x05e0', + 'afii57681' => '0x05e1', + 'afii57682' => '0x05e2', + 'afii57683' => '0x05e3', + 'afii57684' => '0x05e4', + 'afii57685' => '0x05e5', + 'afii57686' => '0x05e6', + 'afii57687' => '0x05e7', + 'afii57688' => '0x05e8', + 'afii57689' => '0x05e9', + 'afii57690' => '0x05ea', + 'afii57716' => '0x05f0', + 'afii57717' => '0x05f1', + 'afii57718' => '0x05f2', + 'afii57388' => '0x060c', + 'afii57403' => '0x061b', + 'afii57407' => '0x061f', + 'afii57409' => '0x0621', + 'afii57410' => '0x0622', + 'afii57411' => '0x0623', + 'afii57412' => '0x0624', + 'afii57413' => '0x0625', + 'afii57414' => '0x0626', + 'afii57415' => '0x0627', + 'afii57416' => '0x0628', + 'afii57417' => '0x0629', + 'afii57418' => '0x062a', + 'afii57419' => '0x062b', + 'afii57420' => '0x062c', + 'afii57421' => '0x062d', + 'afii57422' => '0x062e', + 'afii57423' => '0x062f', + 'afii57424' => '0x0630', + 'afii57425' => '0x0631', + 'afii57426' => '0x0632', + 'afii57427' => '0x0633', + 'afii57428' => '0x0634', + 'afii57429' => '0x0635', + 'afii57430' => '0x0636', + 'afii57431' => '0x0637', + 'afii57432' => '0x0638', + 'afii57433' => '0x0639', + 'afii57434' => '0x063a', + 'afii57440' => '0x0640', + 'afii57441' => '0x0641', + 'afii57442' => '0x0642', + 'afii57443' => '0x0643', + 'afii57444' => '0x0644', + 'afii57445' => '0x0645', + 'afii57446' => '0x0646', + 'afii57470' => '0x0647', + 'afii57448' => '0x0648', + 'afii57449' => '0x0649', + 'afii57450' => '0x064a', + 'afii57451' => '0x064b', + 'afii57452' => '0x064c', + 'afii57453' => '0x064d', + 'afii57454' => '0x064e', + 'afii57455' => '0x064f', + 'afii57456' => '0x0650', + 'afii57457' => '0x0651', + 'afii57458' => '0x0652', + 'afii57392' => '0x0660', + 'afii57393' => '0x0661', + 'afii57394' => '0x0662', + 'afii57395' => '0x0663', + 'afii57396' => '0x0664', + 'afii57397' => '0x0665', + 'afii57398' => '0x0666', + 'afii57399' => '0x0667', + 'afii57400' => '0x0668', + 'afii57401' => '0x0669', + 'afii57381' => '0x066a', + 'afii63167' => '0x066d', + 'afii57511' => '0x0679', + 'afii57506' => '0x067e', + 'afii57507' => '0x0686', + 'afii57512' => '0x0688', + 'afii57513' => '0x0691', + 'afii57508' => '0x0698', + 'afii57505' => '0x06a4', + 'afii57509' => '0x06af', + 'afii57514' => '0x06ba', + 'afii57519' => '0x06d2', + 'afii57534' => '0x06d5', + 'Wgrave' => '0x1e80', + 'wgrave' => '0x1e81', + 'Wacute' => '0x1e82', + 'wacute' => '0x1e83', + 'Wdieresis' => '0x1e84', + 'wdieresis' => '0x1e85', + 'Ygrave' => '0x1ef2', + 'ygrave' => '0x1ef3', + 'afii61664' => '0x200c', + 'afii301' => '0x200d', + 'afii299' => '0x200e', + 'afii300' => '0x200f', + 'figuredash' => '0x2012', + 'endash' => '0x2013', + 'emdash' => '0x2014', + 'afii00208' => '0x2015', + 'underscoredbl' => '0x2017', + 'quoteleft' => '0x2018', + 'quoteright' => '0x2019', + 'quotesinglbase' => '0x201a', + 'quotereversed' => '0x201b', + 'quotedblleft' => '0x201c', + 'quotedblright' => '0x201d', + 'quotedblbase' => '0x201e', + 'dagger' => '0x2020', + 'daggerdbl' => '0x2021', + 'bullet' => '0x2022', + 'onedotenleader' => '0x2024', + 'twodotenleader' => '0x2025', + 'ellipsis' => '0x2026', + 'afii61573' => '0x202c', + 'afii61574' => '0x202d', + 'afii61575' => '0x202e', + 'perthousand' => '0x2030', + 'minute' => '0x2032', + 'second' => '0x2033', + 'guilsinglleft' => '0x2039', + 'guilsinglright' => '0x203a', + 'exclamdbl' => '0x203c', + 'fraction' => '0x2215', + 'zerosuperior' => '0x2070', + 'foursuperior' => '0x2074', + 'fivesuperior' => '0x2075', + 'sixsuperior' => '0x2076', + 'sevensuperior' => '0x2077', + 'eightsuperior' => '0x2078', + 'ninesuperior' => '0x2079', + 'parenleftsuperior' => '0x207d', + 'parenrightsuperior' => '0x207e', + 'nsuperior' => '0x207f', + 'zeroinferior' => '0x2080', + 'oneinferior' => '0x2081', + 'twoinferior' => '0x2082', + 'threeinferior' => '0x2083', + 'fourinferior' => '0x2084', + 'fiveinferior' => '0x2085', + 'sixinferior' => '0x2086', + 'seveninferior' => '0x2087', + 'eightinferior' => '0x2088', + 'nineinferior' => '0x2089', + 'parenleftinferior' => '0x208d', + 'parenrightinferior' => '0x208e', + 'colonmonetary' => '0x20a1', + 'franc' => '0x20a3', + 'lira' => '0x20a4', + 'peseta' => '0x20a7', + 'afii57636' => '0x20aa', + 'dong' => '0x20ab', + 'Euro' => '0x20ac', + 'afii61248' => '0x2105', + 'Ifraktur' => '0x2111', + 'afii61289' => '0x2113', + 'afii61352' => '0x2116', + 'weierstrass' => '0x2118', + 'Rfraktur' => '0x211c', + 'prescription' => '0x211e', + 'trademark' => '0x2122', + 'estimated' => '0x212e', + 'aleph' => '0x2135', + 'onethird' => '0x2153', + 'twothirds' => '0x2154', + 'oneeighth' => '0x215b', + 'threeeighths' => '0x215c', + 'fiveeighths' => '0x215d', + 'seveneighths' => '0x215e', + 'arrowleft' => '0x2190', + 'arrowup' => '0x2191', + 'arrowright' => '0x2192', + 'arrowdown' => '0x2193', + 'arrowboth' => '0x2194', + 'arrowupdn' => '0x2195', + 'arrowupdnbse' => '0x21a8', + 'carriagereturn' => '0x21b5', + 'arrowdblleft' => '0x21d0', + 'arrowdblup' => '0x21d1', + 'arrowdblright' => '0x21d2', + 'arrowdbldown' => '0x21d3', + 'arrowdblboth' => '0x21d4', + 'universal' => '0x2200', + 'partialdiff' => '0x2202', + 'existential' => '0x2203', + 'emptyset' => '0x2205', + 'gradient' => '0x2207', + 'element' => '0x2208', + 'notelement' => '0x2209', + 'suchthat' => '0x220b', + 'product' => '0x220f', + 'summation' => '0x2211', + 'asteriskmath' => '0x2217', + 'radical' => '0x221a', + 'proportional' => '0x221d', + 'infinity' => '0x221e', + 'orthogonal' => '0x221f', + 'angle' => '0x2220', + 'logicaland' => '0x2227', + 'logicalor' => '0x2228', + 'intersection' => '0x2229', + 'union' => '0x222a', + 'integral' => '0x222b', + 'therefore' => '0x2234', + 'similar' => '0x223c', + 'congruent' => '0x2245', + 'approxequal' => '0x2248', + 'notequal' => '0x2260', + 'equivalence' => '0x2261', + 'lessequal' => '0x2264', + 'greaterequal' => '0x2265', + 'propersubset' => '0x2282', + 'propersuperset' => '0x2283', + 'notsubset' => '0x2284', + 'reflexsubset' => '0x2286', + 'reflexsuperset' => '0x2287', + 'circleplus' => '0x2295', + 'circlemultiply' => '0x2297', + 'perpendicular' => '0x22a5', + 'dotmath' => '0x22c5', + 'house' => '0x2302', + 'revlogicalnot' => '0x2310', + 'integraltp' => '0x2320', + 'integralbt' => '0x2321', + 'angleleft' => '0x2329', + 'angleright' => '0x232a', + 'SF100000' => '0x2500', + 'SF110000' => '0x2502', + 'SF010000' => '0x250c', + 'SF030000' => '0x2510', + 'SF020000' => '0x2514', + 'SF040000' => '0x2518', + 'SF080000' => '0x251c', + 'SF090000' => '0x2524', + 'SF060000' => '0x252c', + 'SF070000' => '0x2534', + 'SF050000' => '0x253c', + 'SF430000' => '0x2550', + 'SF240000' => '0x2551', + 'SF510000' => '0x2552', + 'SF520000' => '0x2553', + 'SF390000' => '0x2554', + 'SF220000' => '0x2555', + 'SF210000' => '0x2556', + 'SF250000' => '0x2557', + 'SF500000' => '0x2558', + 'SF490000' => '0x2559', + 'SF380000' => '0x255a', + 'SF280000' => '0x255b', + 'SF270000' => '0x255c', + 'SF260000' => '0x255d', + 'SF360000' => '0x255e', + 'SF370000' => '0x255f', + 'SF420000' => '0x2560', + 'SF190000' => '0x2561', + 'SF200000' => '0x2562', + 'SF230000' => '0x2563', + 'SF470000' => '0x2564', + 'SF480000' => '0x2565', + 'SF410000' => '0x2566', + 'SF450000' => '0x2567', + 'SF460000' => '0x2568', + 'SF400000' => '0x2569', + 'SF540000' => '0x256a', + 'SF530000' => '0x256b', + 'SF440000' => '0x256c', + 'upblock' => '0x2580', + 'dnblock' => '0x2584', + 'block' => '0x2588', + 'lfblock' => '0x258c', + 'rtblock' => '0x2590', + 'ltshade' => '0x2591', + 'shade' => '0x2592', + 'dkshade' => '0x2593', + 'filledbox' => '0x25a0', + 'H22073' => '0x25a1', + 'H18543' => '0x25aa', + 'H18551' => '0x25ab', + 'filledrect' => '0x25ac', + 'triagup' => '0x25b2', + 'triagrt' => '0x25ba', + 'triagdn' => '0x25bc', + 'triaglf' => '0x25c4', + 'lozenge' => '0x25ca', + 'circle' => '0x25cb', + 'H18533' => '0x25cf', + 'invbullet' => '0x25d8', + 'invcircle' => '0x25d9', + 'openbullet' => '0x25e6', + 'smileface' => '0x263a', + 'invsmileface' => '0x263b', + 'sun' => '0x263c', + 'female' => '0x2640', + 'male' => '0x2642', + 'spade' => '0x2660', + 'club' => '0x2663', + 'heart' => '0x2665', + 'diamond' => '0x2666', + 'musicalnote' => '0x266a', + 'musicalnotedbl' => '0x266b', + 'dotlessj' => '0xf6be', + 'LL' => '0xf6bf', + 'll' => '0xf6c0', + 'commaaccent' => '0xf6c3', + 'afii10063' => '0xf6c4', + 'afii10064' => '0xf6c5', + 'afii10192' => '0xf6c6', + 'afii10831' => '0xf6c7', + 'afii10832' => '0xf6c8', + 'Acute' => '0xf6c9', + 'Caron' => '0xf6ca', + 'Dieresis' => '0xf6cb', + 'DieresisAcute' => '0xf6cc', + 'DieresisGrave' => '0xf6cd', + 'Grave' => '0xf6ce', + 'Hungarumlaut' => '0xf6cf', + 'Macron' => '0xf6d0', + 'cyrBreve' => '0xf6d1', + 'cyrFlex' => '0xf6d2', + 'dblGrave' => '0xf6d3', + 'cyrbreve' => '0xf6d4', + 'cyrflex' => '0xf6d5', + 'dblgrave' => '0xf6d6', + 'dieresisacute' => '0xf6d7', + 'dieresisgrave' => '0xf6d8', + 'copyrightserif' => '0xf6d9', + 'registerserif' => '0xf6da', + 'trademarkserif' => '0xf6db', + 'onefitted' => '0xf6dc', + 'rupiah' => '0xf6dd', + 'threequartersemdash' => '0xf6de', + 'centinferior' => '0xf6df', + 'centsuperior' => '0xf6e0', + 'commainferior' => '0xf6e1', + 'commasuperior' => '0xf6e2', + 'dollarinferior' => '0xf6e3', + 'dollarsuperior' => '0xf6e4', + 'hypheninferior' => '0xf6e5', + 'hyphensuperior' => '0xf6e6', + 'periodinferior' => '0xf6e7', + 'periodsuperior' => '0xf6e8', + 'asuperior' => '0xf6e9', + 'bsuperior' => '0xf6ea', + 'dsuperior' => '0xf6eb', + 'esuperior' => '0xf6ec', + 'isuperior' => '0xf6ed', + 'lsuperior' => '0xf6ee', + 'msuperior' => '0xf6ef', + 'osuperior' => '0xf6f0', + 'rsuperior' => '0xf6f1', + 'ssuperior' => '0xf6f2', + 'tsuperior' => '0xf6f3', + 'Brevesmall' => '0xf6f4', + 'Caronsmall' => '0xf6f5', + 'Circumflexsmall' => '0xf6f6', + 'Dotaccentsmall' => '0xf6f7', + 'Hungarumlautsmall' => '0xf6f8', + 'Lslashsmall' => '0xf6f9', + 'OEsmall' => '0xf6fa', + 'Ogoneksmall' => '0xf6fb', + 'Ringsmall' => '0xf6fc', + 'Scaronsmall' => '0xf6fd', + 'Tildesmall' => '0xf6fe', + 'Zcaronsmall' => '0xf6ff', + 'exclamsmall' => '0xf721', + 'dollaroldstyle' => '0xf724', + 'ampersandsmall' => '0xf726', + 'zerooldstyle' => '0xf730', + 'oneoldstyle' => '0xf731', + 'twooldstyle' => '0xf732', + 'threeoldstyle' => '0xf733', + 'fouroldstyle' => '0xf734', + 'fiveoldstyle' => '0xf735', + 'sixoldstyle' => '0xf736', + 'sevenoldstyle' => '0xf737', + 'eightoldstyle' => '0xf738', + 'nineoldstyle' => '0xf739', + 'questionsmall' => '0xf73f', + 'Gravesmall' => '0xf760', + 'Asmall' => '0xf761', + 'Bsmall' => '0xf762', + 'Csmall' => '0xf763', + 'Dsmall' => '0xf764', + 'Esmall' => '0xf765', + 'Fsmall' => '0xf766', + 'Gsmall' => '0xf767', + 'Hsmall' => '0xf768', + 'Ismall' => '0xf769', + 'Jsmall' => '0xf76a', + 'Ksmall' => '0xf76b', + 'Lsmall' => '0xf76c', + 'Msmall' => '0xf76d', + 'Nsmall' => '0xf76e', + 'Osmall' => '0xf76f', + 'Psmall' => '0xf770', + 'Qsmall' => '0xf771', + 'Rsmall' => '0xf772', + 'Ssmall' => '0xf773', + 'Tsmall' => '0xf774', + 'Usmall' => '0xf775', + 'Vsmall' => '0xf776', + 'Wsmall' => '0xf777', + 'Xsmall' => '0xf778', + 'Ysmall' => '0xf779', + 'Zsmall' => '0xf77a', + 'exclamdownsmall' => '0xf7a1', + 'centoldstyle' => '0xf7a2', + 'Dieresissmall' => '0xf7a8', + 'Macronsmall' => '0xf7af', + 'Acutesmall' => '0xf7b4', + 'Cedillasmall' => '0xf7b8', + 'questiondownsmall' => '0xf7bf', + 'Agravesmall' => '0xf7e0', + 'Aacutesmall' => '0xf7e1', + 'Acircumflexsmall' => '0xf7e2', + 'Atildesmall' => '0xf7e3', + 'Adieresissmall' => '0xf7e4', + 'Aringsmall' => '0xf7e5', + 'AEsmall' => '0xf7e6', + 'Ccedillasmall' => '0xf7e7', + 'Egravesmall' => '0xf7e8', + 'Eacutesmall' => '0xf7e9', + 'Ecircumflexsmall' => '0xf7ea', + 'Edieresissmall' => '0xf7eb', + 'Igravesmall' => '0xf7ec', + 'Iacutesmall' => '0xf7ed', + 'Icircumflexsmall' => '0xf7ee', + 'Idieresissmall' => '0xf7ef', + 'Ethsmall' => '0xf7f0', + 'Ntildesmall' => '0xf7f1', + 'Ogravesmall' => '0xf7f2', + 'Oacutesmall' => '0xf7f3', + 'Ocircumflexsmall' => '0xf7f4', + 'Otildesmall' => '0xf7f5', + 'Odieresissmall' => '0xf7f6', + 'Oslashsmall' => '0xf7f8', + 'Ugravesmall' => '0xf7f9', + 'Uacutesmall' => '0xf7fa', + 'Ucircumflexsmall' => '0xf7fb', + 'Udieresissmall' => '0xf7fc', + 'Yacutesmall' => '0xf7fd', + 'Thornsmall' => '0xf7fe', + 'Ydieresissmall' => '0xf7ff', + 'radicalex' => '0xf8e5', + 'arrowvertex' => '0xf8e6', + 'arrowhorizex' => '0xf8e7', + 'registersans' => '0xf8e8', + 'copyrightsans' => '0xf8e9', + 'trademarksans' => '0xf8ea', + 'parenlefttp' => '0xf8eb', + 'parenleftex' => '0xf8ec', + 'parenleftbt' => '0xf8ed', + 'bracketlefttp' => '0xf8ee', + 'bracketleftex' => '0xf8ef', + 'bracketleftbt' => '0xf8f0', + 'bracelefttp' => '0xf8f1', + 'braceleftmid' => '0xf8f2', + 'braceleftbt' => '0xf8f3', + 'braceex' => '0xf8f4', + 'integralex' => '0xf8f5', + 'parenrighttp' => '0xf8f6', + 'parenrightex' => '0xf8f7', + 'parenrightbt' => '0xf8f8', + 'bracketrighttp' => '0xf8f9', + 'bracketrightex' => '0xf8fa', + 'bracketrightbt' => '0xf8fb', + 'bracerighttp' => '0xf8fc', + 'bracerightmid' => '0xf8fd', + 'bracerightbt' => '0xf8fe', + 'ff' => '0xfb00', + 'fi' => '0xfb01', + 'fl' => '0xfb02', + 'ffi' => '0xfb03', + 'ffl' => '0xfb04', + 'afii57705' => '0xfb1f', + 'afii57694' => '0xfb2a', + 'afii57695' => '0xfb2b', + 'afii57723' => '0xfb35', + 'afii57700' => '0xfb4b', + ]; } public static function getCodePoint($glyph) From 09d718d30f61b8672e178ada874bdc5a8b78bd83 Mon Sep 17 00:00:00 2001 From: Connum Date: Sat, 3 Oct 2020 23:36:43 +0200 Subject: [PATCH 31/31] changed @deprecated to parameter description --- src/Smalot/PdfParser/Font.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Smalot/PdfParser/Font.php b/src/Smalot/PdfParser/Font.php index 7e0db6e1..dfdda01d 100644 --- a/src/Smalot/PdfParser/Font.php +++ b/src/Smalot/PdfParser/Font.php @@ -402,8 +402,7 @@ public function decodeText($commands) /** * @param string $text - * - * @deprecated Usage of second parameter $unicode is deprecated. It might be removed in a future release. + * @param bool $unicode This parameter is deprecated and might be removed in a future release * * @return string */