2011-01-29 4 views
3

PDFから情報を解析/抽出する小さなPythonスクリプトを作成しました。私は私のローカルマシンでそれをテストしました。私はpython 2.6.2とpdftotext version 0.12.4を持っています。ローカルマシンからウェブホスティングに変更するとpythonスクリプトからpdftotextが呼び出されない

私はウェブホスティングサーバー(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ファイルに渡しており、アクセスできることに注意してください。別の機能では、ウェブホストで実行されている同じスクリプトからPDF文書を電子メールで送信できます。

私は間違っていますか?私のローカルバージョンとウェブホストバージョンの間のサブプロセス/ python/pdftextの使用法の可能な違いは何ですか?私はコマンドを修正する必要があると思いますので、どんな助けでも大歓迎です。

ありがとうございます。

+1

pdftotextをwebhost上のコマンドラインから直接読み取ることはできますか?これを確認できますか?また、一時ファイルの名前を標準入力に渡すのではなく、引数として渡すのはなぜですか? –

+0

3.02はおそらく 'pdftotext'ではなく' xpdf'のバージョンです。通常、 'pdftotext'は_xpdf_パッケージの一部です。 – PoltoS

+0

@ Noufal - はい、コマンドラインから読むことができます。私がこれをやっている理由の詳細については、この質問を参照してくださいhttp://stackoverflow.com/questions/3745178/running-a-command-line-from-python-and-piping-arguments-from-memory – Chaitanya

答えて

4

pdftotextはwebhost上のコマンドラインから直接読み取ることはできますか?これを確認できますか?また、一時ファイルの名前を標準入力に渡すのではなく、引数として渡すのはなぜですか? (あなたの提案に応じてここで再蘇生する)。

+0

'poppler-utils'パッケージをリモートサーバにインストールすることは私の解決策でした – rom

0

サーバーへのシェルアクセスを持っている場合は、Pythonのなしで実行しようとは:

# pdftotext -layout - - 

と:

# pdftotext -layout 

pdftotextの一部のバージョンには、内のすべてのファイルなしで実行しSTDI /標準出力を使用することができますコマンドライン。試してみてください。

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

Noufal Ibrahimの提案どおりに一時ファイルを使用してください。

+0

これらの作業のどれも。 "pdftotext -layout - - "は同じエラーメッセージを表示し、 "pdftotext -layout"はヘルプテキストを表示するだけです。 " - "引数のないサブプロセスは "pdftotext -layout"のように振る舞い、ヘルプメッセージを出力します – Chaitanya

6

答えのヒントは、Noufalのコメントにあり、ファイル名を使用しています。しかし、os.tmpfile()にはファイル名はありません。私は別のモジュールを使用しなければならなかった。変更されたコードを以下に示します。

Noufalさんのコメントにこの回答のポイントを与える方法がわかりません。おそらく、彼はこの答えをカットアンドペーストできますか?

+0

上記のコードを作成するには、以下のインポートを 'import os、tempfile、subprocess'に追加する必要があります。 currentPDFがあなたのファイルのパスであるならば、 'pdfData = file(currentPDF、 'rb')。read()'で最初の行を変更してください。 – rom

関連する問題