问题
I have many pdfs, which when copied render incorrect text, due to bad
fontmap to unicodemapping
Something like this : Original - निर्वाचक
Rendered when copied : ननरररचक
I have gone through various answers :
Unable to copy exact hindi content from pdf
Read PDF using itextsharp where PDF language is non-English
Parsing a pdf(Devanagari script) using PDFminer gives incorrect output [duplicate]
I followed this answer and used qpdf
to get the desired pagecontentstream
, and I got the cmaps
, when read using Vim
.
But, now I'm facing the problem that every pdf has its own different /font to /toUnicode map, and I would like to have something like a global map for the cmap for a particular script( such as devanagari).
I am also thinking of replacing the stream of !&#
characters which map to unicode
in a global way.
Would love some ideas on how to solve this problem.
Cmaps for two different pdfs is given below:
For 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
For 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
I've also seen questions/answers such as :
Extract toUnicode map from One PDF and use in another
PDF text extraction returns wrong characters due to ToUnicode map
Also, the byte content stream for the pdfs are something like this:
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@@@
来源:https://stackoverflow.com/questions/57952798/different-cmaps-for-different-pdfs-how-to-make-a-global-cmap-so-as-to-process