実現したいこと
-PYInstalleで作ったアプリが他のPCでもエラーが起きないような
自作モジュール(image_recognition.py、converter.py)とpdf2imageモジュールの
パスの指定のやり方を知りたい。
前提
今私はPythonで
1:PySimpleGUIでアプリの画面を作り、
2:手動でPDFを選択して「画像認識」ボタンを押せば
3:自動でPDFを画像(PNG)に変換して、
4:Tesseractで画像認識するというものを作っています。
とりあえずプログラムの方は一旦区切りがついたので、
PYInstallerでEXE化して、他の人のPCでも動かせるようにしようと思ったのですが、
エラーが発生し上手くいきません。エラーの内容的にモジュールのパスの指定が原因だとは思いますが....
どう直せばいいのか自分で調べても分からなかったため、質問させていただきました。
一応プログラムは全文載せてますが、パス指定のあたりは
「====」で区切っています。
まず前提としては自分PC上で作ったアプリを実行すると、
アプリ画面が表示され、ボタンを押せば画像認識が実行され正常に動作しました。
そして他のPCの場合だとアプリ画面の表示までは大丈夫ですが、
ボタンを押すと以下のようなエラーが発生し、強制終了してしまいます。
※pdf2imageに必要だと聞いたpopplerはEXE化するAPP.pyと同じディレクトリ内に保存しています。
フォルダ名:APP (アプリ用データの保存場所)
↓→App.py (EXE化するファイル)
↓→image_recognition.py (自作モジュール)
↓→converter.py (自作モジュール)
↓→フォルダ名:poppler-23.10.0 (popplerデータが入っているフォルダ)
発生している問題・エラーメッセージ
エラーメッセージ Traceback (most recent call last): File "pdf2image\pdfimage.py",line568,in pdfinfo_from_path File "subprocess.py",line 1026,in_init_ File "subprocess.py",line1538,in execute_child PermissionError:[WinError 5]アクセスが拒否されました。 During handling of the above exception,another exception occurred: Traceback (most recent call last): File "APP.py",line43,in <module> File "image_recognition.py",line 36,in recogntion File "converter.py",line41,in pdfhenkan File "pdf2image\pdfimage.py",line127,in convert_from_path File "pdf2image\pdfimage.py",line 594,in_pdfinfo_from_path pdf2image.exceptions.PDFInfoNotInstalledError:Unable to get page count.IS poppler installed and PATH? [5636]Failed to execute script 'APP' due to unhandled exception!
該当のソースコード(EXE化するメインモジュール APP.py)
============================== ソースコード import PySimpleGUI as sg import gazou_APP.kensaku as ken import gazou_APP.image_recognition as rec ============================== def execute(moji,value): msg = "検索文字「"+moji+"」があるファイルは\n"+value + "\nです。" window["text1"].update(msg)#取得した変数データを使って、text1の文字を更新しています。 def make_main(): # ------------ メインウィンドウ作成 ------------ main_layout = [[sg.Text("あなたの名前は?"), sg.Input("お名前", key="input1")], [sg.Button("画像認識実行", size=(20,1), pad=(5,15)),sg.Input(".", key="infolder"),sg.FolderBrowse("選択")], [sg.Button("検索", size=(20,1), pad=(5,15)), sg.Input("検索文字", key="input2")], [sg.Button("終了", size=(20,1), pad=(5,15), button_color=('white', 'red'), font=('Arial',15))], [sg.Multiline(key="text1", size=(64,20))]] return sg.Window("図面検索アプリ", main_layout,font=(None,14),finalize=True) def make_sub(): # ------------ サブウィンドウ作成 ------------ sub_layout = [[sg.Text("本当に終了しますか?")], [sg.Button("はい")], [sg.Button("いいえ")]] return sg.Window("サブウィンドウ", sub_layout,font=(None,14),finalize=True) def make_sub2(): # ------------ サブウィンドウ2作成 ------------ sub2_layout = [[sg.Text("画像認識終了")], [sg.Button("OK")]] return sg.Window("サブウィンドウ", sub2_layout,font=(None,14),finalize=True) # 最初に表示するウィンドウを指定する。 window = make_main() while True: event, values = window.read() if event == None: break if event == "画像認識実行": rec.recognition(values["infolder"])#valuesで入力文字を入手 sub2_window = make_sub2() while True: event, values = sub2_window.read() if event == None: break if event == "OK": sub2_window.close() sub2_window.close() if event == "検索": moji1=values["input2"] moji2=ken.kensaku(values["input2"]) execute(moji1,moji2) if event == "終了": sub_window = make_sub() while True: event, values = sub_window.read() if event == None: break if event == "はい": sub_window.close() window.close() if event == "いいえ": sub_window.close() sub_window.close() window.close()
該当のソースコード(pdf2imageを使用しているモジュール)
ソースコード # このプログラムは特定のファイルのPDFをPNGに全変換する関数です。 import glob import os from pathlib import Path from pdf2image import convert_from_path import shutil import tag2 as t2 hozon="" def pdfhenkan(file2): #今までの手法 # poppler/binを環境変数PATHに追加する # poppler_dir = Path(__file__).parent.absolute() / "poppler/bin" # os.environ["PATH"] += os.pathsep + str(poppler_dir) #インストールしたPopplerのパスを環境変数「PATH」へ追記する。 #OS自体に設定してあれば以下の2行は不要 ============================== path = os.getcwd() #exe実行ディレクトリpathを取得するのが重要 TESSERACT_PATH = path + '/poppler-23.10.0/Library/bin' #今回はexeと同じディレクトリに配置させる前提とする TESSDATA_PATH = path + '/poppler-23.10.0/Library/bin/pdfinfo' #pdfinfoのpath os.environ["PATH"] += os.pathsep + TESSERACT_PATH os.environ["PYTHONPATH"] = TESSDATA_PATH ============================== #指定の名前のファイル(PDFファイル)を取り出す a = glob.glob(file2+'/**/*.pdf', recursive=True)#ファイルの選択 count1=(len(a)) #変換するファイルの要素数 count2=0 #変換するファイルの選択用 img=0 #繰り返す回数を決める用 print('PDF:'+str(count1)) file_name4="" while img < count1: #aの要素数まで繰り返す file_name=a[count2] #aから順番にファイル名を取り出す pdf_path = Path(file_name) # PDFファイルのパス pages = convert_from_path(str(pdf_path), 150)# PDF -> Image に変換(150dpi) # 画像ファイルを1ページずつ保存 image_dir = ('1_PDF→PNG変換') image_dir2=Path(image_dir)# 画像ファイルを保存するファイルを選択 for i, page in enumerate(pages): file_name2 = pdf_path.stem + "_{:02d}".format(i + 1) + ".png" file_name3 = pdf_path.stem + "_{:02d}".format(i + 1) image_path = image_dir2 / file_name2 # pngで保存 page.save(str(image_path), "png") print(image_path) count=i # ページ枚数 file_name4=file_name4+","+file_name3 abc=t2.set_tag(str(pdf_path),file_name4)#データーベースに結果を保存 test = str(image_path) src = pdf_path dst = '処理済みPDF' shutil.copy2(src, dst) img=img+1 count2=count2+1 print('PDF→PNG end') #メインの処理 def main(): pdfhenknan() if __name__ == "__main__": main()
試したこと
一応
https://qiita.com/ku_a_i/items/76f5fb34279ce3aa6e99
の「2-1.プログラムのPath指定部分を変更する」を見様見真似でやってみましたが、
失敗し、どうすればいいのかよく分かりませんでした。
補足情報(FW/ツールのバージョンなど)
Windows 10 Pro for Workstation
Python 3.12.1
pdf2image 1.16.3
poppler 23.10.0

回答1件
あなたの回答
tips
プレビュー