Pythonスクリプトからpdftotextを呼び出すこと
-
27-10-2019 - |
質問
PDFから情報を解析/抽出するための小さなPythonスクリプトを書きました。ローカルマシンでテストしました。Python2.6.2とPDFTOTEXTバージョン0.12.4があります。
WebHostingサーバー(DreamHost)でこれを実行しようとしています。 Pythonバージョン2.5.2およびPDFTOTEXTバージョン3.02があります。
しかし、スクリプトを実行しようとすると、pdftotext行で次のエラーが表示されます(単純な捨てスクリプトでもチェックしました)「エラー:ファイルを開くことができませんでした」 - 」
def ConvertPDFToText(currentPDF):
pdfData = currentPDF.read()
tf = os.tmpfile()
tf.write(pdfData)
tf.seek(0)
if (len(pdfData) > 0) :
out, err = subprocess.Popen(["pdftotext", "-layout", "-", "-"], stdin = tf, stdout=subprocess.PIPE ).communicate()
return out
else :
return None
私はこの関数を同じPDFファイルに渡しており、それにアクセスできることに注意してください。別の関数では、WebHostで実行されている同じスクリプトからPDFドキュメントを電子メールで送信できます。
私は何が間違っているのですか?私のローカルバージョンとWebhostバージョンの間のサブプロセス/Python/PDFTEXTの使用の可能性のある違いは何ですか?コマンドを変更する必要があると推測しているので、どんな助けも大歓迎です。
前もって感謝します。
解決
pdftotextは、webhostでコマンドラインから直接読むことができますか?これを確認できますか?また、標準の入力でそれを与えるのではなく、引数として一時ファイルの名前を渡してみませんか? (あなたの提案に従ってここで再送信)。
他のヒント
答えのヒントは、ファイル名を使用するために、ヌファルのコメントにありました。ただし、os.tmpfile()にはファイル名がありません。別のモジュールを使用する必要がありました。変更されたコードを以下に示します。
#import tempfile
def ConvertPDFToText(currentPDF):
pdfData = currentPDF.read()
tf = tempfile.NamedTemporaryFile()
tf.write(pdfData)
tf.seek(0)
outputTf = tempfile.NamedTemporaryFile()
if (len(pdfData) > 0) :
out, err = subprocess.Popen(["pdftotext", "-layout", tf.name, outputTf.name ]).communicate()
return outputTf.read()
else :
return None
しかし、ヌファルのコメントにこの答えのポイントを与える方法がわかりません。おそらく彼はこの答えをカットして貼り付けることができますか?
シェルがサーバーにアクセスできる場合は、Pythonなしで実行してみてください。
# pdftotext -layout - -
と:
# pdftotext -layout
PDFTOTEXTの一部のバージョンでは、STDI/STDOUTを使用してから、コマンドラインにファイルなしで実行される場合があります。試す
out, err = subprocess.Popen(["pdftotext", "-layout"], stdin = tf, stdout=subprocess.PIPE ).communicate()
または、Noufal Ibrahimが提案したTempファイルを使用します。