Как получить код символа (Unicode) составного глифа из файла шрифта?
Это мой первый опыт работы со шрифтами, поэтому, пожалуйста, имейте в виду жаргон.
Что я делаю: мне нужно извлечь текст из PDF-файлов, содержащих многоязычные символы (гуджарати, в данном контексте), для которых я использую Python PDFMiner.
Где я застрял: PDFMiner делает большую работу по извлечению большинства символов, однако для каждого символа, который он не может извлечь, он дает CID этого символа. (Файл шрифта, используемый в PDF - Shruti.ttf)
Например: для текста પર્િસિદ્ધની તારીખ он дает પર્િસિ(cid:263)ની તારીખ. Здесь દ્ધ отсутствует, чей CID равен 263, а имя глифа в файле шрифта -.notdeF#134.
Я извлек все таблицы из файла Shruti.ttf, используя Python TTX/FontTools для проверки символа в индексе 263. По-видимому, это тот составной глиф и простые глифы, из которых он состоит, не упомянуты в таблице "глиф", скорее его контур упоминается там..
<TTGlyph name=".notdef#134" xMin="11" yMin="-76" xMax="1285" yMax="1352">
<contour>
<pt x="844" y="515" on="0"/>
<pt x="898" y="579" on="1"/>
<pt x="843" y="624" on="0"/>
<pt x="843" y="691" on="1"/>
<pt x="843" y="745" on="0"/>
<pt x="924" y="828" on="0"/>
<pt x="977" y="828" on="1"/>
<pt x="1034" y="828" on="0"/>
<pt x="1125" y="746" on="0"/>
<pt x="1125" y="690" on="1"/>
<pt x="1125" y="594" on="0"/>
<pt x="1061" y="521" on="1"/>
<pt x="1285" y="79" on="1"/>
<pt x="1171" y="0" on="1"/>
<pt x="1014" y="289" on="0"/>
<pt x="951" y="422" on="1"/>
<pt x="951" y="226" on="0"/>
<pt x="850" y="84" on="1"/>
<pt x="737" y="-76" on="0"/>
<pt x="548" y="-76" on="1"/>
<pt x="423" y="-76" on="0"/>
<pt x="338" y="2" on="1"/>
<pt x="249" y="82" on="0"/>
<pt x="249" y="206" on="1"/>
<pt x="11" y="306" on="0"/>
<pt x="11" y="655" on="1"/>
<pt x="143" y="655" on="1"/>
<pt x="140" y="325" on="0"/>
<pt x="331" y="325" on="1"/>
<pt x="376" y="325" on="0"/>
<pt x="389" y="378" on="1"/>
<pt x="500" y="311" on="1"/>
<pt x="465" y="233" on="0"/>
<pt x="385" y="206" on="1"/>
<pt x="385" y="136" on="0"/>
<pt x="435" y="95" on="1"/>
<pt x="480" y="58" on="0"/>
<pt x="552" y="58" on="1"/>
<pt x="668" y="58" on="0"/>
<pt x="743" y="157" on="1"/>
<pt x="811" y="247" on="0"/>
<pt x="813" y="367" on="1"/>
<pt x="599" y="356" on="0"/>
<pt x="445" y="463" on="1"/>
<pt x="276" y="581" on="0"/>
<pt x="276" y="790" on="1"/>
<pt x="276" y="988" on="0"/>
<pt x="404" y="1065" on="1"/>
<pt x="425" y="1078" on="0"/>
<pt x="640" y="1142" on="1"/>
<pt x="768" y="1180" on="0"/>
<pt x="768" y="1282" on="1"/>
<pt x="768" y="1352" on="1"/>
<pt x="929" y="1352" on="1"/>
<pt x="929" y="1280" on="1"/>
<pt x="929" y="1107" on="0"/>
<pt x="802" y="1048" on="1"/>
<pt x="684" y="1014" on="0"/>
<pt x="566" y="980" on="1"/>
<pt x="439" y="930" on="0"/>
<pt x="439" y="779" on="1"/>
<pt x="439" y="649" on="0"/>
<pt x="526" y="579" on="1"/>
<pt x="605" y="515" on="0"/>
<pt x="738" y="515" on="1"/>
</contour>
<instructions><assembly>
NPUSHB[ ] /* 135 values pushed */
71 62 1 153 59 1 104 59 1 107 46 155 46 2 89 39 1 118 27 134 27 150 27 3 118
18 1 57 14 73 14 2 25 12 57 12 73 12 3 52 4 53 13 153 12 1 12 9 30 26
0 31 32 31 48 31 64 31 160 31 5 31 31 33 41 16 11 9 1 15 15 47 3 63 3
2 3 9 66 26 16 25 33 16 0 23 16 23 32 23 160 23 4 23 23 0 25 16 25 32
25 160 25 4 25 60 4 15 45 31 45 47 45 3 45 15 41 64 58 5 49 31 33 30 26
28 5 23 33 33 37 1 11 26 6
PUSHW[ ] /* 1 value pushed */
-64
PUSHB[ ] /* 4 values pushed */
15 18 72 6
PUSHW[ ] /* 1 value pushed */
-64
NPUSHB[ ] /* 24 values pushed */
9 12 72 49 6 26 26 6 49 3 52 64 5 41 41 37 52 0 19 5 37 12 13 2
SVTCA[0]
MIAP[1]
SHP[1]
MDRP[10100]
MIRP[01101]
MIAP[1]
SRP2[ ]
IP[ ]
MDAP[1]
MIRP[01101]
SRP1[ ]
SLOOP[ ]
IP[ ]
MDAP[1]
MDAP[1]
MDAP[1]
CALL[ ]
CALL[ ]
SRP1[ ]
IP[ ]
IP[ ]
SRP2[ ]
IP[ ]
MDAP[1]
MDRP[00000]
MIRP[01101]
SRP1[ ]
IP[ ]
SRP1[ ]
IP[ ]
SRP0[ ]
MIRP[01101]
SRP1[ ]
SRP2[ ]
IP[ ]
SVTCA[1]
MDAP[1]
DELTAP1[ ]
MIRP[01101]
MDRP[01110]
DELTAP1[ ]
IP[ ]
MDAP[1]
DELTAP1[ ]
MIRP[01101]
SRP0[ ]
MIRP[01101]
SRP0[ ]
MDRP[10110]
MDRP[01101]
DELTAP1[ ]
IP[ ]
MDAP[1]
IP[ ]
SRP2[ ]
IP[ ]
MIRP[01101]
SRP1[ ]
IP[ ]
MDAP[1]
DELTAP1[ ]
SRP2[ ]
IP[ ]
SRP0[ ]
MDRP[00110]
DELTAP1[ ]
SHP[0]
MDRP[10100]
MIRP[01101]
IUP[1]
IUP[0]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
DELTAP1[ ]
</assembly></instructions>
</TTGlyph>
Мне нужно знать, во-первых, правильный ли мой подход или есть ли лучший способ добиться этого, во-вторых, учитывая CID составного глифа, как мне получить Unicode из его составных глифов.
Благодарю.