27672


英語PDFのOCRをPythonで行おうと考えており、tesseract (ターミナル上では動きます) と textract
([こちら](http://www.tysonmaly.com/installing-textract-for-python-3/)の手順に沿って)
のインストールは正常に行えました。

しかし、以下のコードを実行した場合にエラーが出て文字を抽出できません。

[code]

    text = textract.process(
        '/Users/Text/en.pdf',
        method='tesseract',
        language='eng',
    )
    
[/code]

エラー:

[code]

    /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
    
[/code]

`pdf_parser.py`の修正を試みましたが、どれも失敗しました。

  1. `return b''.join(contents)`と書き換える
  2. Insert `contents = [str(item) for item in contents]` を `return`の前に
  3. Insert `contents = [item.decode("utf-8") for item in contents]` を `return`の前に

＊こちらの質問は、[stackoverflow](https://stackoverflow.com/questions/38340049/using-
tesseract-in-python3-textract-
library)のポストを訳したものです。どちらかで回答が得られた場合は、質問者が責任をもってもう片方に掲載します。よろしくお願い致します。


CC BY-SA 3.0
2016-07-13T04:04:34.817
27591
2016-07-16T16:01:58.577
2017-05-23T12:38:55.307
-1
12704
question
python tesseract
Python3でtesseractを用いたOCR時のエラー


### `str`の`join`メソッド一般の話

`str`の`join`メソッドに渡したシーケンスに、`bytes`が含まれていると質問のエラーが出ます。

[code]

    >>> "".join([b"abc", b"def"])
    Traceback (most recent call last):
      File "<ipython-input-8-b6a19bdaade9>", line 1, in <module>
        "".join([b"abc", b"def"])
    TypeError: sequence item 0: expected str instance, bytes found
    
[/code]

質問中にある 3. の方法で、`bytes`を`str`にしてしまえば、このエラーは消えます。  
(1. の方法でもよいですが以下は 3. を使います)

[code]

    >>> "".join(item.decode("utf-8") for item in [b"abc", b"def"])
    'abcdef'
    
[/code]

ただし、シーケンスに`str`が含まれていると、今度はそちらがエラーを生みます。

[code]

    >>> "".join(item.decode("utf-8") for item in [b"abc", b"def", "あいう"])
    Traceback (most recent call last):
      File "<ipython-input-16-db83cb004c11>", line 1, in <module>
        "".join(item.decode("utf-8") for item in [b"abc", b"def", "あいう"])
      File "<ipython-input-16-db83cb004c11>", line 1, in <genexpr>
        "".join(item.decode("utf-8") for item in [b"abc", b"def", "あいう"])
    AttributeError: 'str' object has no attribute 'decode'
    
[/code]

metropolisさんのコメントの方法で、`bytes`のみ`decode`するようにすれば、このエラーも消えます。

[code]

    >>> "".join(item.decode('utf-8') if isinstance(item, bytes) else item for item in [b"abc", b"def", "あいう"])
    'abcdefあいう'
    
[/code]

### textractの話

textractを正しくPython3に移植するには、手間も必要と思いますが、とりあえず質問のエラーを消すには、上記の方法で`decode`してしまえばよいでしょう。

pdf_parser.py 64行目`return ''.join(contents)`を

[code]

    return "".join(item.decode('utf-8') if isinstance(item, bytes) else item
                        for item in contents)
    
[/code]

とします。これでエラーは別の箇所の

> NameError: name 'unicode' is not defined

になります。`unicode`はPython3にはないので、とりあえず`str`にでもして置くとして、  
utils.py 54行目`if isinstance(text, unicode):`...を

[code]

    if isinstance(text, str):
        return text
    
[/code]

とします。  
適当ではありますが、これで英語のみのPDFは処理出来ました。


CC BY-SA 3.0
2016-07-16T15:54:20.163
27672
2016-07-16T16:01:58.577
2016-07-16T16:01:58.577
3054
3054
27591
answer