Reputation: 21
I have pdf files that are using Almohanad font (found here). I'm using Python's Tika to extract the text in these pdfs. The extraction works fine. For some characters, however, the result gets messed up. To elaborate more, these are the characters that are composed from two Arabic characters concatenated to each others (e.g. في result in to be يف and لم result in to be مل)
I check the cmap (ToUnicode) of all characters and it seems to be correct:
'0628': 'ب',
'062A': 'ت',
'062B': 'ث',
'062C': 'ج',
'062D': 'ح',
'062E': 'خ',
'0633': 'س',
'0634': 'ش',
'0637': 'ط',
'0638': 'ظ',
'0639': 'ع',
'063A': 'غ',
'0641': 'ف',
'0642': 'ق',
'0643': 'ك',
'0644': 'ل',
'0645': 'م',
'0641064A': 'في',
'0646': 'ن',
'0647': 'ه',
'064A': 'ي',
'0626': 'ئ',
'062A062C': 'تج',
'0646062C': 'نج',
'062A062D': 'تح',
'0644062C': 'لج',
'0644062D': 'لح',
'0644062E': 'لخ',
'06440645': 'لم',
'062A0645': 'تم',
'064A0645': 'يم',
'06460645': 'نم',
'06280645': 'بم',
'06450645': 'مم',
'06440645062D': 'لمح',
So not sure why these characters get flipped. This is a sample from the pdf files mentioned above.
And the Tika's extraction code:
import requests
import codecs
from tika import parser
from_path = "./doc.pdf"
to_path = "./doc.txt"
rawText = parser.from_file(from_path)
rawList = rawText['content'].splitlines()
with open(to_path,'w') as f:
for line in rawList:
f.write(line)
f.close()
EDIT 1:
My pdf is actually readable using Tika, the only issue is the flipped characters. See a sample from the output:
وبعــض الشــركات وقــد قــررت كليــة املذكــورة الشــركة علــى احلكــم أطلــب لــذا ذكرتــه مــا التقنيــة بإبدالــي ســيارة نفــس النــوع مــن ذلــك النــوع مــن نفــس املوديــل وإذا تعــذر توجيــه ميــن االســتظهار للمدعــى عليــه على أن العيــب املذكور يف دعواه لــم يكــن بســبب ســوء اســتخدامه فــأدى اليمــن طبــق مــا طلــب منــه - قضــت احملكمــة بإلــزام الشــركة املدعــى عليهــا أن تســلم املدعــي ثمــن الســيارة وصرفــت النظــر عمــا يطالــب بــه املدعــي زيــادة علــى ذلــك- قنــع املدعــي باحلكــم وعارضــت عليــه املدعــى عليهــا - قــررت محكمــة االســتئناف املصادقــة علــى احلكــم .29ذلــك إلزامهــم بإعــادة القيمــة وقيمتهــا قدرهــا مائــة وثمانــون ألــف ريــال هــذه دعــواي وبســؤال املدعــى عليــه أجــاب بقولــه أطلــب مهلــة لإلجابــة مفصلة يف اجللســة القادمة. ويف جلســة أخرى يوم األحد 1432/4/29هـ افتتحــت اجللســة لــدى فضيلــة الشــيخ )....( وفيهــا حضــر املدعــي وحضــر حلضــوره)....( ســعودي بالســجل املدنــي رقــم )....( الوكيــل الشــرعي مــن الصــادرة الوكالــة للســيارات احملــدودة مبوجــب )....( لشــركة الثانيــة برقــم 29151 يف 1427/5/14هـــ جلــد كتابــة عــدل الدمــام 5765 وبســؤال املدعــى عليــه وكالــة عــن جوابــه علــى الدعــوى قــال: أطلــب إمهالــي للجــواب عنــا لدعــوى ورفعــت اجللســة. ويف جلســة أخــرى يــوم االثنــن 1432/6/20هـــ افتتحــت اجللســة وفيهــا حضــر )....( وحضــر )....( عــن الشــرعي الوكيــل )....( رقــم مدنــي ســجل )....( حلضــوره املديريــن مجلــس رئيــس نائــب بصفتــه عــن)....( الشــرعي الوكيــل ــة ــة واملرافعــة واملدافع ــه حــق اإلجاب ــة ل لشــركة )....( للســيارات املخولواإلقــرار واإلنــكار الصــادرة مــن كتابــة عــدل الدمــام الثانيــة رقــم 14416 يف 1432/03/24هـــ وبســؤاله عــن جوابــه عــن الدعــوى قــال: )....( شــركة مطبوعــات علــى محــررًا جوابــي لفضيلتكــم أقــدم ونــص 2011/05/23م املوافــق 1432/6/20هـــ بتاريــخ للســيارات املقصــود مــن الــرد أن مــا تضمنتــه الئحــة املدعــي بــأن الســيارة مــن نــوع )....( موديــل )....( بــأن بهــا خلــًا مصنعيــًا وأنــه كان ملتــزم بجميــع بزيــت اخلاصــة الدوريــة التغييــرات وكذلــك الدوريــة التشــييكات ــح ــر صحي ــأن مــا ذكــره املدعــي غي ــد فضيلتكــم ب احملــرك بهــذا نفيوأنــه يخالــف ويناقــض املســتندات )الفواتيــر( التــي تقــدم بهــا للمحكمــة والتــي تثبــت أن مــا ذكــره املدعــي غيــر صحيــح لــم يكــن منتظمــًا يف 30تغييــر الزيــت فاملدعــي قــدم خمســة فواتيــر أقدمهــا تاريخــًا هــو أول تغييــر للزيــت يف الســيارة منــذ اســتامها كان بتاريــخ 2006/10/31م وحينهــا كانــت الســيارة قــدم شــيت مســافة 16000 كيلــو متــرًا أي أنــه مت تغييــر الزيــت بعــد أن قطعــت الســيارة 7500كيلــو متــرًا والفاتــورة الســيارة كانــت وعندهــا 2007/4/21 بتاريــخ كانــت تليهــا التــي حســب البيانــات املســجلة علــى الفاتــورة قــد مشــيت مســافة 13984 ويف هــذا ياحــظ تناقــض واضــح بــن الفاتورتــن وســوف نناقشــها يف فقــرة ــة والفاتــورة التاليــة لهــا كانــت بتاريــخ 2008/1/13م وعندهــا منفصلكانــت الســيارة قــد قطعــت 30000 كيلــو متــرًا أي بعــد أن مشــيت الســيارة مســافة 14000 كيلــو متــرًا والفاتــورة األخيــرة كانــت بتاريــخ 2008/4/27موعندهــا كانــت الســيارة قــد قطعــت مســافة 47229 كيلومتــرًا أي بعــد أن قطعــت الســيارة بعــد آخــر تغييــر للزيــت مســافة 17229 كيلومتــرًا فــا يخفــى علــى فضيلتكــم أن املدعــي كان غيــر ــر الزيــت حســب تعليمــات ــا تغيي منتظــٍم بقواعــد ســامة الســيارة ومنهالوكيــل فهــو كان يتجــاوز املســافة التــي يتوجــب عليهــا تغييــر الزيــت بأضعافهــا وأحيانــًا إلــى ثاثــة أضعــاف كمــا يف التغييــر األخيــر إن هــذه املعلومــات واحلقائــق والتناقضــات املأخــوذة مــن الفواتيــر التــي قدمهــا املدعــي بنفســه كبينــة لــه يجــب أن تنقلــب إلــى ضــده لتكــون بينــة عليــه لألســباب التاليــة: أ- عــدم التــزام املدعــي بالتعليمــات اخلاصــة بســامة محــرك الســيارة ومنهــا تغييــر الزيــت عنــد كل 5000كيلومتــر تقطعهــا الســيارة فكمــا أســلفنا أن الفواتيــر التــي قدمهــا املدعــي كبينــة علــى أنــه كان يقــوم بتغييــر زيــت محــرك الســيارة بانتظــام تثبــت أنــه كان يتجــاوز املســافة احملــددة إلــى أكثــر مــن ثاثــة أضعافهــا أحيانــا ب- إن 31أن تثبــت والتــي والثالثــة الثانيــة الفاتورتــن بــن املوجــود التضــارب الســيارة كانــت قــد قطعــت يف تاريــخ 2007/01/23ممســافة 16000 كيلومتــرًا بينمــا يف 2007/04/21م تناقصــت املســافة التــي قطعتهــا الســيارة إلــى 13984 فهــذا التناقــض العجيــب ليــس لــه تفســير ســوى أن املدعــي كان يتاعــب بعــداد الســيارة اخلاصــة باملســافة التــي تقطعهــا الســيارة إمــا إلخفــاء حقيقــة أنــه كان يتجــاوز املســافة التــي كانــت تقطعهــا الســيارة بــن كل تغييــر لزيــت احملــرك إلخفــاء جتــاوزه املســافة املســموح بهــا أو لزيــادة فتــرة الضمــان املمنوحــة لهــا بإنقــاص املســافة التــي قطعتهــا الســيارة وهــذا يجعلنــا نشــك يف مصداقيــة املدعــي ويلقــي بظــال كثيفــة علــى كل أقوالــه وادعاءاتــه يف الدعــوى األمــر الــذي يســتلزم علــى احملكمــة أن تضــع يف االعتبــار هــذه احلقائــق والتناقضــات عنــد احلكــم يف الدعــوى ولــكل مــا تقــدم نلتمــس مــن فضيلتكــم رد الدعــوى لعــدم صحــة ادعــاء املدعــي ولعــدم اســتنادها إلــى بينــات تثبــت صحــة دعــواه الوكيــل الشــرعي )....( توقيعــه وبــرد مــا جــاء يف املذكــرة
EDIT 2: An example to show what I meant by flipped and why this is an issue:
This is how the segment of text looks like in the PDF: enter image description here
The following is the correct text enclosed in the image: (copied from the pdf, and this is the result I want Tika to output)
الحمــد لله وحــده وبعــد لــدي أنــا (....) القاضي بالمحكمــة العامة بالدمام بنــاءً علــى مــا وردنــا مــن فضيلــة الرئيــس برقــم 808في 1431/01/25هـــ
احلمــد هلل وحــده وبعــد لــدي أنــا )....( القاضي باحملكمــة العامة بالدمام بنــاًء علــى مــا وردنــا مــن فضيلــة الرئيــس برقــم 808يف 1431/01/25هـــ
Upvotes: 2
Views: 1115
Reputation: 635
If you're getting the same (wrong) order of characters from PDFBox directly, please open an issue on their JIRA.
See diagnosing PDF text problems for how to check if the problem is at the Tika level or the PDFBox level, in short: java -jar pdfbox-app.X.Y.jar ExtractText problematicPDF.pdf
Upvotes: 1
Reputation: 31
Try our new package: pdftextract. it's light very fast & effecient (without the need to lunch a server) and also tested on arabic pdf documents.
Example: to extract all the text a pdf file in save it to file 'arabic.txt'
from pdftextract import XPdf
pdf_file = "arabic.pdf"
pdf = XPdf(pdf_file)
pdf.to_text("arabic.txt")
Upvotes: 0
Reputation: 169
Highly recommend u to use tesseract
import os
import io
from PIL import Image
import pytesseract
from wand.image import Image as wi
import gc
pdf=wi(filename=pdf_path,resolution=300)
pdfImg=pdf.convert('jpeg')
imgBlobs=[]
extracted_text=[]
def Get_text_from_image(pdf_path):
pdf=wi(filename=pdf_path,resolution=300)
pdfImg=pdf.convert('jpeg')
imgBlobs=[]
extracted_text=[]
for img in pdfImg.sequence:
page=wi(image=img)
imgBlobs.append(page.make_blob('jpeg'))
for imgBlob in imgBlobs:
im=Image.open(io.BytesIO(imgBlob))
text=pytesseract.image_to_string(im,lang='ara')
extracted_text.append(text)
return (extracted_text)
edit1: If u want to use tika, should add it:
headers = {
"X-Tika-OCRLanguage": "eng+nor"
}
parsed = parser.from_file(path, headers=headers)
edit2: Your pdf as text: For read your pdf as text just download it and try to read with text reader, like cat or nano, its look like it:
%PDF-1.4
%����
3686 0 obj
<</Linearized 1/L 5322782/O 3688/E 595795/N 324/T 5248940/H [ 858 2919]>>
endobj
xref
3686 27
0000000016 00000 n
0000004019 00000 n
0000004170 00000 n
0000004616 00000 n
0000004736 00000 n
0000004786 00000 n
0000004901 00000 n
0000005199 00000 n
0000005342 00000 n
0000005371 00000 n
0000006407 00000 n
0000276107 00000 n
0000276487 00000 n
0000276558 00000 n
0000276678 00000 n
0000301118 00000 n
0000301396 00000 n
0000302395 00000 n
0000333139 00000 n
0000447783 00000 n
0000479016 00000 n
0000479073 00000 n
0000482486 00000 n
0000485899 00000 n
0000575516 00000 n
0000003777 00000 n
0000000858 00000 n
trailer
<</Size 3713/Root 3687 0 R/Info 869 0 R/ID[<8FD045A06A03F645BB465C04A9009139><3B44FF5F89DB394EAB6167FD3C788C77>]/Prev 5248927/XRefStm 3777>>
startxref
0
%%EOF
3712 0 obj
<</C 12880/Filter/FlateDecode/I 12916/Length 2822/S 12585>>stream
h��[^K\TU^Z��^@3�^P^FD@B�&M4�I]#�^Z��%3�G��
�^B���(Ԣ^NoP�^A�x�^E�U�;l��6�J��^[RX�ϵ� S�^Z%7^_[����^NQ
�C����������w���o^N^W^@b��^EvD��^K��^K$��^VTu�^B�2 _g{^Gle^X�/�^Ty�戃lVeT�^V�^G'�J�?e^@��^_6^O��^S�c^P^L^Z�E8��\4X�I_^V^T+'6�0�K�Fj B����b^Y���rʀMJ: :5]�J�q�:^Y�^Z�
6
X���"_I�@����d5�^G�,}^Y�^[���j�ǣJ�\D�^�^]�z�^X^E,^]��r& E^\�?�7���rz^^X�@^U�)
*d�7t:f^Y�e��Qc`�^Q����2Ke�\f��^D5���`�a䫙&Dr��Щ��
c��,5^C�,͢�����d����R:Dk�F��HW�U^]ӈB��^YT@�#^V^ES�x��Y��ff^P֩�?`g0�6Vr�Kة��Q��W��@'b^K�$�
���^Z
It was at first pdf header, format and binary image of it, so i think you need to OCR it, like u do with Tika.
Tika read PDF with OCR too, anyway you can disable it on options, try it and if u r right, you will 100% read text from PDF context
edit3: Look like you are right and PDF can be read on text context, but not all PDFs, and yours dont look like readable PDF PDFminer only works if PDF is manually made searchable
edit4: Ok, assumming that equal to ubuntu, u cant take it out cause path should be same like all your programs, /usr/bin/, so you ve to options: 1)rename bin of tesseract for rename u need to find binary and rename with sudo, on ubuntu its just
which tesseract
sudo mv path/tesseract path/tessesract-renamed
2)uninstall tesseract
try to conver to Image and use tesseract, then compare it to your output Should be similar, then u can perform your image to easier OCR: https://docparser.com/blog/improve-ocr-accuracy/ https://tesseract-ocr.github.io/tessdoc/ImproveQuality
Upvotes: 0