4

PDFから情報を解析/抽出するための小さなpythonスクリプトを作成しました。ローカル マシンでテストしました。python 2.6.2 と pdftotext バージョン 0.12.4 を使用しています。

これを自分の Web ホスティング サーバー (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 ファイルを渡していることに注意してください。別の関数では、Web ホストで実行されている同じスクリプトから PDF ドキュメントを自分自身に電子メールで送信できます。

私は何を間違っていますか?私のローカル バージョンとウェブホスト バージョンの間で、subprocess/python/pdftext の使用方法にどのような違いがあるのでしょうか? コマンドを変更する必要があると思いますので、どんな助けでも大歓迎です。

前もって感謝します。

4

3 に答える 3

6

答えのヒントは、ファイル名を使用するための Noufal のコメントにありました。しかし、 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

ただし、Noufalのコメントにこの回答のポイントを与える方法がわかりません。おそらく、彼はこの答えを切り取って貼り付けることができますか?

于 2011-01-30T13:14:09.770 に答える
4

pdftotext は webhost でコマンドラインから直接読み取ることができますか? これを確認できますか?また、一時ファイルの名前を標準入力で与えるのではなく、引数として渡してはどうでしょうか? (あなたの提案に従ってここに貼り付けます)。

于 2011-01-30T14:09:37.360 に答える
0

サーバーへのシェル アクセス権がある場合は、Python なしで実行してみてください。

# pdftotext -layout - -

と:

# pdftotext -layout

一部のバージョンの pdftotext は stdi/stdout を使用し、コマンド ラインでファイルなしで実行される場合があります。試す

    out, err = subprocess.Popen(["pdftotext", "-layout"], stdin = tf, stdout=subprocess.PIPE ).communicate()

または、Noufal Ibrahim の提案に従って一時ファイルを使用します。

于 2011-01-29T13:36:10.003 に答える