Python 3.x 在python3textract库中使用tesseract

Python 3.x 在python3textract库中使用tesseract,python-3.x,tesseract,python-tesseract,Python 3.x,Tesseract,Python Tesseract,我想从PDF文件中提取文本。我可以成功地安装tesseract(它在终端中工作)和textract(按照说明) 然而,当我运行代码时,我得到了一个错误 text = textract.process( '/Users/Text/en.pdf', method='tesseract', language='eng', ) 错误是: /usr/local/lib/python3.4/site-packages/textract-1.4.0-py3.4.egg/textrac

我想从PDF文件中提取文本。我可以成功地安装tesseract(它在终端中工作)和textract(按照说明)

然而,当我运行代码时,我得到了一个错误

text = textract.process(
    '/Users/Text/en.pdf',
    method='tesseract',
    language='eng',
)
错误是:

/usr/local/lib/python3.4/site-packages/textract-1.4.0-py3.4.egg/textract/parsers/pdf_parser.py in extract_tesseract(self, filename, **kwargs)
     62                 page_content = TesseractParser().extract(page_path, **kwargs)
     63                 contents.append(page_content)
---> 64             return ''.join(contents)
     65         finally:
     66             shutil.rmtree(temp_dir)

TypeError: sequence item 0: expected str instance, bytes found
我尝试了几次修改,但都不起作用,我也犯了同样的错误

  • 返回b“”。加入(内容)
  • 在返回之前插入
    contents=[str(item)for item in contents]
  • 返回之前插入
    contents=[内容中的项目解码(“utf-8”)

  • 事实上,我也问了同样的问题,得到了答案。以下是我翻译的核心部分。(谢谢,@mjy)

    注意:此修改至少适用于英语

  • 在pdf_parser.py的第64行 更改
    返回“”。将(内容)
    加入到

    return "".join(item.decode('utf-8') if isinstance(item, bytes) else item for item in contents)
    
    if isinstance(text, str):
        return text
    
  • 但是,出现了另一个错误

    name错误:未定义名称“unicode”

  • utils.py
    的第54行中,将
    如果是instance(文本,unicode):(…cont…)
    更改为

    return "".join(item.decode('utf-8') if isinstance(item, bytes) else item for item in contents)
    
    if isinstance(text, str):
        return text
    

  • 你是绝对正确的-我道歉。我不知怎么错过了你修改的那一行。我在Slackware Linux系统上测试了您的示例tesseract 3.03和leptonica 1.70,它似乎在命令行中运行没有问题。你试过了吗
    tesseract test_text.png out
    BTW,为了避免混淆,我删除了我的回复…@jcoppens感谢您的检查。实际上,我也在命令行中尝试过。但是,由于提取后我需要用Python编辑文本,最方便的方法是用Python完成所有工作。我相信我曾经尝试过使用tesseract包装器,但无法使其正常工作。在这个回答中,我从程序中“手动”调用了tesseract,然后在Python中处理其输出。不要惊慌——代码很长,因为它还包括GUI代码。呼叫在第一类(识别数字)-以
    out
    开头的两行代码中。