Различные cmap для разных pdf-файлов, как сделать глобальный cmap, чтобы обрабатывать много pdf-файлов с одной и той же картой шрифтов в /toUnicodemap

У меня есть много PDF-файлов, которые при копировании рендерят неправильный текст из-за плохого

отображение шрифта в unicode

Примерно так: Оригинал - निर्वाचक

Отрисовывается при копировании: ननरररचक

Я прошел через различные ответы:

Не удалось скопировать точное содержание хинди из pdf

Чтение PDF с помощью itextsharp, где язык PDF не английский< /а>

Анализ файла pdf (скрипт деванагари) с использованием PDFminer дает неправильный вывод [дубликат ]

Я последовал этому ответу и использовал qpdf, чтобы получить желаемое pagecontentstream, и я получил cmaps при чтении с использованием Vim.

Но теперь я столкнулся с проблемой, что каждый pdf имеет свою собственную карту /font to/toUnicode, и я хотел бы иметь что-то вроде глобального map для cmap для определенного сценария (например, деванагари).

Я также думаю о замене потока символов !&#, которые глобально отображаются на unicode.

Хотелось бы несколько идей, как решить эту проблему.

Cmaps для двух разных PDF-файлов приведены ниже:

Для pdf 1:

/CIDInit/ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo<<
/Registry (Adobe)
/Ordering (UCS)
/Supplement 0
>> def
/CMapName/Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<00> <FF>
endcodespacerange
68 beginbfchar
<01> <096D>
<02> <0967>
<03> <0917>
<04> <091C>
<05> <091C093E>
<06> <0928>
<07> <0020>
<08> <0938>
<09> <0935>
<0A> <091C>
<0B> <092E>
<0C> <0932>
<0D> <0915>
<0E> <092A>
<0F> <092A0942>
<10> <0930>
<11> <092A094D0930>
<12> <092E0941>
<13> <0916>
<14> <092A>
<15> <091A>
<16> <0924>
<17> <0925>
<18> <0928094D>
<19> <092F>
<1A> <0926>
<1B> <0921>
<1C> <0927>
<1D> <0927093F>
<1E> <0930>
<1F> <002E>
<20> <092B>
<21> <092B>
<22> <0915>
<23> <002F>
<24> <0968>
<25> <0966>
<26> <096E>
<27> <0928>
<28> <0936>
<29> <0923>
<2A> <0906>
<2B> <09260947>
<2C> <092A094B>
<2D> <0938094D>
<2E> <091F>
<2F> <0905>
<30> <002C>
<31> <0939>
<32> <0028>
<33> <0029>
<34> <002D>
<35> <0927094D>
<36> <091D>
<37> <0932094D>
<38> <0924094D>
<39> <09300941>
<3A> <0915094D0937>
<3B> <092D>
<3C> <0924>
<3D> <0915094D0924>
<3E> <0923094D>
<3F> <092C>
<40> <0926094D0926>
<41> <092A094D0924>
<42> <0936>
<43> <2013>
<44> <096A>
endbfchar
endcmap
CMapName currentdict /CMap defineresource pop
end
end
endstream
endobj

Для pdf 2:

/CIDInit/ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo<<
/Registry (Adobe)
/Ordering (UCS)
/Supplement 0
>> def
/CMapName/Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<00> <FF>
endcodespacerange
100 beginbfchar
<01> <0020>
<02> <0938>
<03> <002E>
<04> <092B>
<05> <092B>
<06> <0916>
<07> <0915>
<08> <0915>
<09> <096F>
<0A> <096C>
<0B> <0967>
<0C> <002F>
<0D> <0968>
<0E> <0966>
<0F> <096D>
<10> <0928>
<11> <0928>
<12> <0932>
<13> <0917>
<14> <0924>
<15> <0928094D>
<16> <092F>
<17> <092F093E>
<18> <0930>
<19> <0930>
<1A> <0028>
<1B> <0918>
<1C> <0918094B>
<1D> <0937093F>
<1E> <0926093F>
<1F> <0915>
<20> <002D>
<21> <0029>
<22> <0930>
<23> <092A>
<24> <0915>
<25> <091A094D>
<26> <0906>
<27> <09320947>
<28> <0932094D>
<29> <092A0941>
<2A> <0935094D>
<2B> <0935>
<2C> <09300941>
<2D> <09320940>
<2E> <092E>
<2F> <0926>
<30> <0905>
<31> <0930>
<32> <0909>
<33> <0938>
<34> <0938>
<35> <091D>
<36> <0924094D>
<37> <091A>
<38> <0939>
<39> <0937094D>
<3A> <092A094D0930>
<3B> <096E>
<3C> <091C>
<3D> <0924>
<3E> <0921>
<3F> <0926094D092F>
<40> <092C094D>
<41> <091F>
<42> <092E094D>
<43> <090F>
<44> <0969>
<45> <0927>
<46> <0930>
<47> <002C>
<48> <092D093F>
<49> <0936>
<4A> <092C>
<4B> <003F>
<4C> <0933>
<4D> <0917094D0930>
<4E> <0936094D>
<4F> <0927094D>
<50> <0915>
<51> <096A>
<52> <0920093F>
<53> <0923094D>
<54> <091C>
<55> <092A>
<56> <0930094D0926094B>
<57> <096B>
<58> <091C>
<59> <0908>
<5A> <0910>
<5B> <0922>
<5C> <0930>
<5D> <09150940>
<5E> <0936>
<5F> <0927094B0902>
<60> <0917094D>
<61> <09350948>
<62> <0915>
<63> <091C094D>
<64> <092C094D0930093F>
endbfchar
13 beginbfchar
<65> <0905>
<66> <0926>
<67> <0907>
<68> <0915094D>
<69> <091F>
<6A> <09150949>
<6B> <0916094D>
<6C> <0924093E0903>
<6D> <0924094D0924>
<6E> <0930094D09250940>
<6F> <0027>
<70> <2013>
<71> <0939>
endbfchar
endcmap
CMapName currentdict /CMap defineresource pop
end
end
endstream
endobj

Я также видел такие вопросы/ответы, как:

Извлечь карту toUnicode из одного PDF-файла и использовать в другом

Извлечение текста PDF возвращает неправильные символы из-за карты ToUnicode

Кроме того, байтовый поток содержимого для PDF-файлов выглядит примерно так:

stream
true^@^L^@<80>^@^C^@@cmapFgVB^@^@^@Ì^@^@^A^Rcvt <8c>C<84>^G^@^@^Aà^@^@^A$fpgm<98>\Ü¢^@^@^C^D^@^@^@dglyfÍ<92>3²^@^@^Ch^@^@'<84>head©Ò('^@^@*ì^@^@^@6hheaCþ
^D^@^@+$^@^@^@$hmtxNé(y^@^@+H^@^@^A^TlocaóLÛ5^@^@,\^@^@^@<8c>maxpö^@Î^@^@^@,è^@^@^@ nameÆîN~^@^@-^H^@^@^K£post^Z^@gþ^@^@8¬^@^@^@ prep^@_1R^@^@8Ì^@^@^@^K^@^@^@^A^@^A^@^@^@^@^@^L^@^@^A^F^@^@^@^A^B^C^D^E^F^G^H  
^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ !"#$%&'()*+,-./0123456789:;<=>?@ABCD^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@2^B¼ÿÎ^@d^B+^Aó^B<91>ÿÿ^Aö^Bvÿ´^B!^B*ÿö^B£ÿ[^Bì^A[^Aï^@^O^@Kÿ<9c>^A^S^@Ü^B<99>ÿy^B^H^B^X^B"^@^Eÿõ^B^Q^Am^A@^Aä^@^N^AE^@s^BS^B^_ÿÐ^BÆÿ8^Bbÿ<9f>^Ai^@hÿ;ÿ^H^BLÿn^Bîÿ^K^Bfÿ<88>^A2^@È^B\ÿ¢^A¤^@F^AÛ^@^T^Bé^B:^B·^Bq^A<9a>^@Pÿ¡^@
^@^YÿÝ^B^Cÿìÿû^Aþ^@7ÿñÿçÿº^Aê^@^D^@^^ÿ3^@#ÿB^B5^Bä^AùÿÉÿ.^@^Vþ<9d>þ}^A©^B^M^B^Rÿ<92>^B^Wÿ¿ÿ<83>^@û^@ÿ^@Ò^Bl^A³^B{^@-^@<96>ÿØ^@ª^@U^@ZÿGÿL^@}ÿt^@¯^@<9b>^@_^BË^@n^@<91>^@¾^@(^BÐ^BÁ^BÚÿ^Aÿ^FÿÓÿ^Zþ÷ÿ°ÿ¦ÿ<97>ÿ~ÿ<8d>ÿ`ÿÄÿ«ÿµÿ÷@^E^E^D^C^B^@,vE °^C%E#ah^X#h`D-,E °^C%E#ah#h`D-,  ¸ÿÀ8^R±@^A68-,  °@8^R°^A6¸ÿÀ8-,^A°Fv Gh^X#Fah X °^C%#8°^B%^R°^A6e8Y-^@^B^@<85>^@^@^C¤^C¤^@^D^@   ^@oA$^@^G^@^F^@^D^@^C^@^B^@^C^@ ^@^H^@^B^@^E^@^B^@^D^@^A^@^B^@^@^@^E^@^H^@^G^@^D^@^B^@^A^@^C^@  ^@^F^@^B^@^E^@^B^@^D^@^C^@^B^@^@^@^A^@F^@^A^@^@^@Fv/7^Xv^@?^W<ý^W<?<ý<^A?^W<ý^W<?<ý<10º^@
^@^@^@^E+3^Q!^Q!7!^Q!^Q<85>^C^_üáC^B<9a>ýf^C¤ü\C^C^_üá^@^B^@W^@^@^BC^B ^@^\^@)^@/A^L^@^G^@[^@^\^@^[^@^A^@^C^@^@^@^A^@F^@^A^@^A^@Fv/7^Xv^@?^W<?^A10º^@*^@^A^@^E+!"&546?^A^N^A^U^T^V3267"&54632^V^U^T^F#7>^A54&#"^F^U^T^V3^ATj<93>        ^KI^N^MmN,Q^USuS9@Y<82>m<9f>^G^G3$!/Y@Î<93>!x^?'K Ty¬I<<81>[Pq<8c>d¦Èð%@^YKiO6He^@^@^B^@<99>ÿß^B^A^B»^@^O^@^\^@5A^N^@^O^@^N^@^B^@^@^@Q^@^K^@
^@^B^@  ^@b^@F^@^A^@^A^@Fv/7^Xv^@?^W<?^W<^A10º^@^]^@^A^@^E+^E^Q^N^A#"&54632^V^U^Q#^C2654&#"^F^U^T^V3^A¾^W>#HeeHUfCx/BB/,>>,!^A£^V^XiJKim[ýì^A°G14KK41G^@^@^@^Aÿó^@^@^B^S^B<9a>^@^X^@)A  ^@^F^@^E^@^A^@^B^@^A^@F^@^A^@^A^@Fv/7^Xv^@/<?<^A10º^@^Y^@^A^@^E+^C5!^U#^Q#^Q#^Q^T^F#"&546;^A26=^A#^M^B qB§^T^M^Yl^P
/^K^P<84>^B^<<ý¢^B^þº^P^X}^\
^P^T^N<99>^@^@^Aÿó^@^@^Bæ^B<9a>^@^^^@)A ^@^V^@^U^@^A^@^R^@^Q^@F^@^A^@^A^@Fv/7^Xv^@/<?<^A10º^@^_^@^A^@^E+%"&'7^^^A32654&'!5!5!^U#^Q#^Q#^^^A^U^T^F#^A5H<9c>:<3|3!/;6^A^^ýÁ^BóqC ^[^ZU=PÁ ^Z<8e>«3$9y7<8c><<ý¢^A<8f>%U,@Y^@^@^Aÿó^@^@^A^X^B<9a>^@^H^@)A    ^@^F^@^E^@^A^@^B^@^A^@F^@^A^@^A^@Fv/7^Xv^@/<?<^A10º^@   ^@^A^@^E+^C5!^U#^Q#^Q#^M^A%rBq^B^<<ý¢^B^^@^@^@^Aÿó^@^@^BW^B<9a>^@^X^@)A ^@^L^@^K^@^A^@^H^@^G^@F^@^A^@^D^@Fv/7^Xv^@/<?<^A10º^@^Y^@^D^@^E+^S463!5!5!^U#^Q#^Q#"^F^]^A^T^F#"&5^T^\^S^A`þP^BdqCÁ^P^X^T^M^Wn^A<8f>^N^T­<<ý¢^An^P
C^P^X<8b>^[^@^Aÿóÿù^BÓ^B<9a>^@^_^@.A^K^@^U^@M^@^F^@^E^@^A^@^B^@^A^@F^@^A^@^A^@Fv/7^Xv^@/<?<?^A10º^@ ^@^A^@^E+^C5!^U#^Q#^Q#'35#^U^T^F#"&'^S^G^A7^^^A326=^A!^M^BàqC³"ÕéB/^H^O^DÈ5þÔ6^U9^\^\'þÿ^B^<<ý¢^A@BÜ´4J^D^Bþé"^Aª(-6&^\´^@^Aÿó^@^@^B-^B<9a>^@"^@)A  ^@^F^@^E^@^A^@^B^@^A^@F^@^A^@^A^@Fv/7^Xv^@/<?<^A10º^@#^@^A^@^E+^C5!^U#^Q#5^N^A#"&54632^V^W^G.^A#"^F^U^T^V3267^Q!^M^B:rB^[I(SuuS^X,^S"^L^Z^O7NN7'J^[þz^B^<<ý¢Õ #jJKi^M^N5        ^KF2.C5/^A%^@^Aÿ$^@^@^A^X^C±^@^\^@=A^Q^@^S^@^R^@^B^@^Q^@+^@^Z^@^Y^@^A^@^V^@^U^@^B^@^C^@^A^@F^@^A^@^G^@Fv/7^Xv^@/^W<?<?^W<^A10º^@^]^@^G^@^E+^C53.^A#"^F^U^T^V^W#.^A54632^V^W3^U#^Q#^Q#^Mq^Q[4'6^\^YI^W^X]CM<80>^UrrBq^B^<`|3$ ?^Y^W>#=U<9e>y<ý¢^B^^@^@^Bÿó^@^@^BQ^B<9a>^@^U^@^Z^@)A      ^@^F^@^E^@^A^@^B^@^A^@F^@^A^@^A^@Fv/7^Xv^@/<?<^A10º^@^[^@^A^@^E+^C5!^U#^Q#^Q#^U^T^F#"&546;^A5#^W35#^U^M^B^rBð^L^H^Wn^T^M6xºðð^B^<<ý¢^A@/^P^Xd^T^M^TÜÜÜÜ^@^Aÿóÿù^Bä^B<9a>^@&^@.A^K^@^X^@M^@^F^@^E^@^A^@^B^@^A^@F^@^A^@^A^@Fv/7^Xv^@/<?<?^A10º^@'^@^A^@^E+^C5!^U#^Q#^Q"^F^G'>^A7.^A#"^F^U^T^V^W^G.^A54632^V^W>^A35!^M^BñqB:d^V@@@   


person aspiring1    schedule 16.09.2019    source источник
comment
Мне просто интересно, в чем преимущество такой глобальной карты? Потому что рассматриваемые PDF-файлы должны быть сильно изменены (внутри).   -  person mkl    schedule 16.09.2019
comment
@mkl: я просто думаю, что если потоки байтов изменены с использованием глобального преобразования glyph в Unicode, что-то вроде (!) --> <01> -- > <0020>, то я могу изменить byte encoded words and sentences и получить правильный PDF. Это будет намного быстрее, чем ocr, чтобы получить правильный текст.   -  person aspiring1    schedule 16.09.2019
comment
Но чтобы успешно заменить текущие кодировки и сопоставления на ваши глобальные, вам нужна правильная и достаточная информация о том, какие глифы сопоставляются с каким кодом юникода для начала. Если у вас есть эта информация, вы можете получить правильный PDF-файл намного проще, просто восстановив существующие карты ToUnicode на основе этой информации. Не нужно баловаться с потоками контента.   -  person mkl    schedule 16.09.2019
comment
@mkl: Проблема в том, что для каждого PDF-файла отображение меняется, единственные сопоставленные glyphs - это те, которые появляются в конкретном документе, и свободно следуют за тем, какие glyph находятся вверху, а затем по порядку.   -  person aspiring1    schedule 17.09.2019
comment
@mkl: Кроме того, есть ли способ получить текст из инструкций по рисованию в формате PDF, как вы упомянули здесь.   -  person aspiring1    schedule 17.09.2019
comment
Я не уверен, что вы имеете в виду в этом моем ответе; в самом ответе я указал на ocr, а в комментарии я говорил только об обновлении сопоставлений ToUnicode после того, как ОП указал, что он вручную определит правильное сопоставление.   -  person mkl    schedule 17.09.2019
comment
@mkl: Вы написали, что Причина в том, что PDF как формат не содержит текста как такового. Он содержит указатели (прямые или через сопоставления) на инструкции по рисованию глифов во встроенных программах шрифтов. С помощью этих указателей PDF отрисовывается так, как вы ожидаете. Можем ли мы рисовать глифы в текстовых файлах с помощью этих указателей. - Не знаю, возможно ли это, но как раз думал об этом.   -  person aspiring1    schedule 17.09.2019
comment
Можем ли мы рисовать глифы в текстовых файлах, используя эти указатели. - Я не знаю, возможно ли это, но просто подумал об этом. - Ну, вы можете получить инструкцию по рисованию глифа. т.е. что-то вроде заполнения многоугольника углами по следующим координатам. Но распознавание персонажа из того, что нарисовано по этим инструкциям, — это разновидность OCR. Однако вы можете просмотреть все глифы шрифта в PDF-файле, нарисовать их с достаточно высоким разрешением, позволить программе OCR (или человеку) распознать этот глиф и создать ToUnicode< /b> карта из распознанных символов.   -  person mkl    schedule 17.09.2019
comment
@mkl: Можете ли вы объяснить подробнее об этом, я не понял, что делать дальше после получения сопоставления glyph с ToUnicode.   -  person aspiring1    schedule 17.09.2019
comment
После того как вы определили (с помощью программы OCR или человеком) коды Unicode для всех отдельных глифов вашего шрифта, вы можете построить карту ToUnicode на основе этой информации и заменить существующую карту для этого шрифта на Это. Сделав это для всех шрифтов, PDF-файл должен обеспечить правильное извлечение текста.   -  person mkl    schedule 17.09.2019
comment
@mkl : В настоящее время, как вы можете видеть, моя карта ToUnicode выглядит примерно так <01> <0020> <02> <0938> <03> <002E> <04> <092B> <05> <092B> <06> <0916> <07> <0915> <08> <0915> , как также показано выше - как я могу напрямую сопоставить глиф с юникодом в pdf-документ . Если это можно сделать, пожалуйста, сделайте из этого ответ. Спасибо   -  person aspiring1    schedule 17.09.2019
comment
как я могу напрямую сопоставить глиф с юникодом в документе pdf - что вы имеете в виду? Карта ToUnicode является частью PDF-файла, так что она настолько прямолинейна, насколько это возможно, не так ли?   -  person mkl    schedule 17.09.2019
comment
@mkl: но для каждого PDF-файла, как показано выше, отображение меняется, например, для одного <01> <096D> и для другого <01> <0020>   -  person aspiring1    schedule 17.09.2019
comment
Даже разные шрифты в одном PDF-файле могут иметь разные карты ToUnicode.   -  person mkl    schedule 17.09.2019
comment
@mkl: Итак, есть ли какое-нибудь решение?   -  person aspiring1    schedule 17.09.2019
comment
Различные карты ToUnicode в файле PDF не являются проблемой, поэтому они не требуют решения. Дефектные карты ToUnicode в файле PDF представляют собой проблему, которую можно попытаться решить, как указано выше, т.е. распознавать глифы каждого шрифта в PDF один за другим и перестроить карты ToUnicode для каждого из них.   -  person mkl    schedule 17.09.2019
comment
@mkl: я думал об использовании cmaps для исправления нескольких PDF-файлов в порядке 1000s вместо использования tesseract, что довольно медленно, но я думаю, что это единственно возможное решение ocr   -  person aspiring1    schedule 17.09.2019
comment
Даже для одного и того же шрифта (по имени шрифта) в разных объектах шрифта PDF могут быть разные карты ToUnicode. С одной стороны, может использоваться другое кодирование, с другой стороны, если подмножества шрифтов встроены, создание подмножеств может привести к смещению идентификаторов глифов.   -  person mkl    schedule 17.09.2019
comment
@mkl: в моем случае проблема заключается в том, что подмножества шрифтов встраиваются в каждый pdf-файл, а не в общую карту шрифтов.   -  person aspiring1    schedule 17.09.2019
comment
В этом случае забудьте глобальную карту. Вместо этого исправьте каждый шрифт отдельно.   -  person mkl    schedule 18.09.2019
comment
@mkl : Но сопоставление карты ToUnicode в моем случае имеет только символы, которые используются в pdf, другие символы шрифта не отображаются, если в пдф их нет.   -  person aspiring1    schedule 18.09.2019
comment
И это совершенно нормально. Вот что такое подмножества шрифтов, включая только то, что необходимо в PDF.   -  person mkl    schedule 18.09.2019
comment
@mkl: Итак, кажется, я могу использовать только OCR, но OCR работает очень медленно, по крайней мере, с tesseract, даже с multiprocessing.   -  person aspiring1    schedule 18.09.2019