微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PDF 到文本问题 - Python Tika - 阿拉伯字符在某些位置被翻转

如何解决PDF 到文本问题 - Python Tika - 阿拉伯字符在某些位置被翻转

我有使用 Almohanad 字体的 pdf 文件(找到 here)。我正在使用 Python 的 Tika 来提取这些 pdf 中的文本。提取工作正常。但是,对于某些字符,结果会变得一团糟。更详细地说,这些是由两个相互连接的阿拉伯字符组成的字符(例如,في 导致为 يف 和 لم 导致为 مل)

我检查了所有字符的 cmap (ToUnicode),它似乎是正确的:

 '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': 'لمح',
  • 这是其中的一部分

所以不确定为什么这些字符会被翻转。 This 是上述 pdf 文件的示例。

还有提卡的提取码:

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()

编辑 1:

我的 pdf 实际上可以使用 Tika 阅读,唯一的问题是翻转的字符。查看输出示例:

وبعــض الشــركات وقــد قــررت كليــة املذكــورة  الشــركة  علــى  احلكــم  أطلــب  لــذا  ذكرتــه  مــا  التقنيــة بإبدالــي ســيارة نفــس النــوع مــن ذلــك النــوع مــن نفــس املوديــل وإذا تعــذر توجيــه ميــن االســتظهار للمدعــى عليــه على أن العيــب املذكور يف دعواه لــم يكــن بســبب ســوء اســتخدامه فــأدى اليمــن طبــق مــا طلــب منــه - قضــت احملكمــة بإلــزام الشــركة املدعــى عليهــا أن تســلم املدعــي ثمــن الســيارة وصرفــت النظــر عمــا يطالــب بــه املدعــي زيــادة علــى ذلــك- قنــع املدعــي باحلكــم وعارضــت عليــه املدعــى عليهــا - قــررت محكمــة االســتئناف املصادقــة علــى احلكــم .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 فهــذا التناقــض العجيــب ليــس لــه تفســير ســوى أن املدعــي كان يتاعــب بعــداد الســيارة اخلاصــة باملســافة التــي تقطعهــا الســيارة إمــا إلخفــاء حقيقــة أنــه كان يتجــاوز املســافة التــي كانــت تقطعهــا الســيارة بــن كل تغييــر لزيــت احملــرك إلخفــاء جتــاوزه املســافة املســموح بهــا أو لزيــادة فتــرة الضمــان املمنوحــة لهــا بإنقــاص املســافة التــي قطعتهــا الســيارة وهــذا يجعلنــا نشــك يف مصداقيــة املدعــي ويلقــي بظــال كثيفــة علــى كل أقوالــه وادعاءاتــه يف الدعــوى األمــر الــذي يســتلزم علــى احملكمــة أن تضــع يف االعتبــار هــذه احلقائــق والتناقضــات عنــد احلكــم يف الدعــوى ولــكل مــا تقــدم نلتمــس مــن فضيلتكــم رد الدعــوى لعــدم صحــة ادعــاء املدعــي ولعــدم اســتنادها إلــى بينــات تثبــت صحــة دعــواه الوكيــل الشــرعي )....( توقيعــه وبــرد مــا جــاء يف املذكــرة

编辑 2:一个例子来说明我所说的翻转是什么意思以及为什么这是一个问题:

  1. PDF 中的文本段如下所示: enter image description here

  2. 以下是图片中包含的正确文本:(从pdf中复制,这是我希望Tika输出的结果)

الحمــد لله وحــده وبعــد لــدي أنــا (....) القاضي بالمحكمــة العامة بالدمام بنــاءً علــى مــا وردنــا مــن فضيلــة الرئيــس برقــم 808في 1431/01/25هـــ 
  1. 这是 Tika 的输出
احلمــد هلل وحــده وبعــد لــدي أنــا )....( القاضي باحملكمــة العامة بالدمام بنــاًء علــى مــا وردنــا مــن فضيلــة الرئيــس برقــم 808يف 1431/01/25هـــ

解决方法

如果您直接从 PDFBox 获得相同(错误)的字符顺序,请在其 JIRA 上打开一个问题。

有关如何检查问题是在 Tika 级别还是 PDFBox 级别,请参阅 diagnosing PDF text problems,简而言之:java -jar pdfbox-app.X.Y.jar ExtractText problematicPDF.pdf

,

强烈推荐你使用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)

编辑1: 如果你想使用 tika,应该添加它:

headers = {
    "X-Tika-OCRLanguage": "eng+nor"
}
parsed = parser.from_file(path,headers=headers)

编辑2: 您的 pdf 作为文本: 要将您的 pdf 作为文本阅读,只需下载它并尝试使用文本阅读器(如 cat 或 nano)阅读,它看起来像这样:

%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

起初是它的 pdf 标题、格式和二进制图像,所以我认为你需要对它进行 OCR,就像你对 Tika 所做的一样。

https://tika.apache.org/

Tika 也用 OCR 阅读 PDF,无论如何你可以在选项中禁用它,试试看,如果你是对的,你将 100% 从 PDF 上下文中读取文本

编辑3: 看起来你是对的,PDF 可以在文本上下文中阅读,但不是所有的 PDF,你的看起来不像可读的 PDF PDFminer only works if PDF is manually made searchable

编辑4: 好吧,假设等于 ubuntu,你不能把它去掉,因为路径应该和你所有的程序一样,/usr/bin/,所以你必须选择: 1)重命名tesseract的bin 重命名你需要找到二进制文件并用sudo重命名,在ubuntu上它只是

which tesseract
sudo mv path/tesseract path/tessesract-renamed

2)卸载tesseract

尝试转换为图像并使用tesseract,然后将其与您的输出进行比较 应该是相似的,然后您可以执行您的图像以更轻松地进行 OCR: https://docparser.com/blog/improve-ocr-accuracy/ https://tesseract-ocr.github.io/tessdoc/ImproveQuality

,

试试我们的新包:pdftextract。它非常快速且高效(无需为服务器提供午餐),并且还在阿拉伯语 pdf 文档上进行了测试。

示例:提取pdf文件中的所有文本并将其保存到文件'arabic.txt'

from pdftextract import XPdf

pdf_file = "arabic.pdf"

pdf = XPdf(pdf_file)

pdf.to_text("arabic.txt")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。