
python初心者です。
下記コードは使い指定フォルダ内に複数あるPDFファイルの特定の範囲の画像を切り出しOCRでテキスト化するものです。
ネット上で見つけ参考にさせて頂いたものです。
動作は成功しましたが、出力結果をエクセルに書き込む為にコードを追加しましたがうまくいきません。
import pyautogui as pag
import pyocr
from PIL import Image
import sys
import subprocess
import pyperclip
import os
import time
import openpyxl as px
pyocr.tesseract.TESSERACT_CMD = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
acr_path ="C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
#PDF指定
pdf_path = r"C:\\○○○\\○○○\\○○○\\test\\PDFファイル\\"
pdf_list = os.listdir(pdf_path)
i = 1
#OCRを動かして、テキストデータに変換(スペース削除)
def run_ocr(tool,name_img):
result = tool.image_to_string(name_img,lang='jpn')
result = result.replace(' ','')
print(result)
return result
if __name__=='__main__':
#OCR呼び出し
tools = pyocr.get_available_tools()
tool = tools[0]
#フォルダ内にあるPDFファイルをループ
for idx,file in enumerate(pdf_list):
#PDFファイルを開く
pdf_pro = subprocess.Popen([acr_path,pdf_path+file],shell=False)
time.sleep(2)
#座標指定箇所を切り取りして画像保存
name_img = pag.screenshot(str(i) + 'temp.png',region=(920, 240, 160, 60))
#指定座標を文字起こししてテキスト変換
result =run_ocr(tool,name_img)
i = i + 1
wb = px.Workbook()
sheet = wb.create_sheet('sheet1')
sheet.cell(row=1,column=1,value=result)
wb.save(r"結果.xlsx")
pdf_pro.kill()
time.sleep(1)
コードを実行すると「結果.xlsx"」内の「Sheet1」という名前の新たなシートに、テキスト化されたものがセルA1に上書きされている様です。
成功イメージは「結果.xlsx"」のSheet1(1枚目)のセルA1からA2、A3と下にどんどん出力結果が書き込まれることです。
追加したコードは
wb = px.Workbook()
sheet = wb.create_sheet('sheet1')
sheet.cell(row=1,column=1,value=result)
wb.save(r"結果.xlsx")
の部分です。
いろいろ参考にして見たのですがここまでが限界でした。
お詳しい方教えて頂けませんでしょうか?
宜しくお願い致します
No.1ベストアンサー
- 回答日時:
まずこのサイトでは行頭空白は削除されるのでPythonのインデントが保存されない。
したがって制御構造を含むPythonコードはまともに読めなくなるので、空白を全角空白など別の文字に置き換えてそれらしく見えるようにしないと分かりにくいのよ。それでresultには1行がテキストで入って、追加コードでは1行ごとに書き込んでいるということで良いのかな。
そうするとsheet.cell(row=1,column=1,...)のコードはA1セルに書き込んでいるので常にA1に上書きされるのは当たり前ですね。
sheet.cell(row=i,column=1,...)
とすれば下の行に書かれていくのではないでしょうか。
あと毎回新しいワークブックを開いて1行書いて保存しているので前の回に書き込んだものは忘れていますね。ワークブックの作成はループに入る前に一回だけにしましょう。保存はループ内で毎回でも構いません。
あと最期にwb.close()をしておきましょう。開いたまま閉じないループだと資源を使い切って問題が発生するリスクがあります。これはWorkbookの実装がちゃんとしていれば滅多なことはないと思いますが。
No.2
- 回答日時:
こんばんは
pythonは全く知りませんし、インデントもないのでわからなくなっていますけれど・・
ざっと見だけですが、
>sheet.cell(row=1,column=1,value=result)
なら、同じところに書いているだけなので
>テキスト化されたものがセルA1に上書きされている様です。
は当然の結果ではないでしょうか。
変数 i を行番号にしようとしているみたいですから、それを利用すればいいのでは?
sheet.cell(row=i,column=1,value=result)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
<forEach> 内で供給された "ite...
-
setAttribute(String, int)は適...
-
干支の計算で。。。
-
アルファベットのソート
-
画像の位置指定の数字を変えて...
-
Androidで画面遷移ができません.
-
ある年月の前月(月の開始日)...
-
Javaで常駐するソフトを作って...
-
ファイル名を動的に生成したい
-
「例外 *** は対応する try 文...
-
【JAVAエラー】互換性のない型...
-
IF関数でEmpty値を設定する方法。
-
オブジェクトの中のプロパティ...
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
javaです。 途中まで出来ている...
-
flush()とclose()について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
<forEach> 内で供給された "ite...
-
setAttribute(String, int)は適...
-
干支の計算で。。。
-
生年月日と今日の日付から年齢...
-
アプレットの動作テストができない
-
importするには java.io.*; imp...
-
アプレットでスクロールバーを...
-
JPanelについて
-
Java初心者ですが・・・
-
JTableでスクロールバーが表示...
-
main()メソッドが無いコード
-
Javaで常駐するソフトを作って...
-
どうしてもプログラムが動いて...
-
ActionForm form にnullが入っ...
-
JFrame の再表示を禁止したい。
-
Javaアプリケーションのアイコ...
-
javaでスタート画面を作ってい...
-
Java Applet での虫食い算での質問
おすすめ情報