66333


Windows
10、Anacondaの仮想環境（Python3.6）にてJupterlabを起動し、PDFファイルに文字データを埋め込むためにTesseractをつかってOCRをしようと試みています。  
（[【Python】pdfファイルから文字起こしをしてテキストに変換する方法（tesseract-
OCR、pyocr、pdf2image、poppler）](https://punhundon-
lifeshift.com/tesseract_ocr_pdf)を参考にしました）

以下のコードを試し、一つのpdfファイルをTesseractで処理可能なpngファイルにするところまではできたのですが、あるディレクトリにある複数のpngファイルをまとめて処理することができません。

出力されるpdfファイルは0byteとなってしまいます。

コマンドラインとして実行しているTesseract部分にforループで生成した変数名を組み込むことは可能でしょうか？

また、そもそもコマンドラインとして実行すべきではないでそうか？(初心者なものでいろいろ混乱しておりすみません)

狙いとしては!tessractの部分でpngファイルと同じ名前のpdfファイルを生成し、それらを1つのpdfファイルにまとめるという形にしたかったのですが、うまくいきませんでした。

[code]

    from PIL import Image
    import sys
    import os
    import pyocr
    import pyocr.builders
    import shutil
    from pdf2image import convert_from_path
    import re
    from pathlib import Path
    
    #pyocrで使われるファイルのパス
    poppler_path = 'C:\\Users\\ilab2\\poppler-0.68.0\\bin'
    
    #処理ファイルの入力
    input_file = input('ファイルのパスを入力してください。')
    
    names = []
    os.environ["PATH"] += os.pathsep + poppler_path
    pdf_path = Path(input_file)
    pages = convert_from_path(input_file)
    
    for page in pages:
        pdf_path = Path(input_file)
        file_name = pdf_path.stem + "_{:02d}".format(pages.index(page)) + ".png"
        # pngで保存
        page.save(str(file_name), "png")
        names.append(str(file_name))
        print(file_name)
        !tesseract filename filename_{:02d}".format(pages.index(page)) -l eng pdf
    
[/code]

出力は以下のようになりまして、pngファイルはうまく生成され、0byteのpdfファイルが生成されます。

[code]

    ファイルのパスを入力してください。 test.pdf
    test_00.png
    Warning: Parameter not found: enable_new_segsearch
    Tesseract Open Source OCR Engine v4.1.1 with Leptonica
    Error, cannot read input file filename: No such file or directory
    Error during processing.
    test_01.png
    Warning: Parameter not found: enable_new_segsearch
    Tesseract Open Source OCR Engine v4.1.1 with Leptonica
    Error, cannot read input file filename: No such file or directory
    Error during processing.
    test_02.png
    Warning: Parameter not found: enable_new_segsearch
    Tesseract Open Source OCR Engine v4.1.1 with Leptonica
    Error, cannot read input file filename: No such file or directory
    Error during processing.
    test_03.png
    Warning: Parameter not found: enable_new_segsearch
    Tesseract Open Source OCR Engine v4.1.1 with Leptonica
    Error, cannot read input file filename: No such file or directory
    Error during processing.
    test_04.png
    Warning: Parameter not found: enable_new_segsearch
    Tesseract Open Source OCR Engine v4.1.1 with Leptonica
    Error, cannot read input file filename: No such file or directory
    Error during processing.
    test_05.png
    Warning: Parameter not found: enable_new_segsearch
    Tesseract Open Source OCR Engine v4.1.1 with Leptonica
    Error, cannot read input file filename: No such file or directory
    Error during processing.
    
[/code]


CC BY-SA 4.0
2020-05-05T08:48:16.860
66319
2020-05-06T00:06:54.253
2020-05-05T12:25:43.323
26370
39973
question
tesseract
Tesseractによる複数pngファイルのOCRテキストのpdf埋め込み出力


**コマンドラインとして実行しているTesseract部分にforループで生成した変数名を組み込むことは可能でしょうか？**

pythonの変数を`!`コマンドに渡す時は`{ }`で囲めば良いでしょう。

[Passing Values to and from the
Shell](https://jakevdp.github.io/PythonDataScienceHandbook/01.05-ipython-and-
shell-commands.html#Passing-Values-to-and-from-the-Shell)

> Communication in the other direction–passing Python variables into the
> shell–is possible using the `{varname}` syntax:  
>  他の方向での通信、つまりPython変数をシェルに渡すには、次の{varname}構文を使用します。
[code]

>     In [9]: message = "hello from Python"
>  
>     In [10]: !echo {message}
>     hello from Python
>  
[/code]

>
> The curly braces contain the variable name, which is replaced by the
> variable's contents in the shell command.  
>  中括弧には変数名が含まれ、シェルコマンドで変数の内容に置き換えられます。

* * *

**狙いとしては!tessractの部分でpngファイルと同じ名前のpdfファイルを生成し**

質問時の転記ミスかもしれませんが「pngファイルと同じ名前のpdfファイル」を組み立てる指定が不完全です。  
pdfファイル名を作る用の"が1個しか無くて対になっていないのでは？

> `filename_{:02d}".format(pages.index(page))`

* * *

**それらを1つのpdfファイルにまとめるという形にしたかった**

最後のこの部分はちょっと意味不明です。元々まとまっている1つのpdfファイルがあって、そこから1ページづつ切り出しているのでは？

* * *

ソースコードの`for`ループ部分を以下のようにすれば、この時点での動作は出来るでしょう。  
主な変更部分の直前の行に`##`でコメントを入れています。

[code]

    for page in pages:
        pdf_path = Path(input_file)
        ## 拡張子無しファイル名作成
        file_name = pdf_path.stem + "_{:02d}".format(pages.index(page))
        ## .png ファイル名作成
        png_name = file_name + ".png"
        # pngで保存
        page.save(str(png_name), "png")
        names.append(str(png_name))
        print(png_name)
        ## shellコマンドへpython変数値をパラメータ指定
        !tesseract {png_name} {file_name} -l eng pdf
    
[/code]


CC BY-SA 4.0
2020-05-06T00:06:54.253
66333
2020-05-06T00:06:54.253
2020-06-17T08:14:45.997
-1
26370
66319
answer