PDFTOTOTEXT vom Python -Skript aufzurufen, funktioniert nicht, wenn ich von der lokalen Maschine zu meinem Webhosting wechselt

StackOverflow https://stackoverflow.com/questions/4837114

Frage

Ich habe ein kleines Python -Skript geschrieben, um Informationen von einem PDF zu analysieren/zu extrahieren. Ich habe es auf meiner lokalen Maschine getestet, ich habe Python 2.6.2 und pdftotext Version 0.12.4.

Ich versuche, dies auf meinem Webhosting -Server (DreamHost) auszuführen. Es verfügt über Python Version 2.5.2 und pdftotext Version 3.02.

Aber wenn ich versuche, das Skript auszuführen, erhalte ich den folgenden Fehler in der PDFTOTOTEXT-Zeile (ich habe es auch mit einem einfachen Wurf-Weg-Skript überprüft). "Fehler: konnte keine Datei öffnen"-'""

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

Beachten Sie, dass ich diese Funktion in derselben PDF -Datei übergasse und darauf zugreifen kann. In einer anderen Funktion kann ich mir das PDF -Dokument aus demselben Skript per E -Mail senden.

Was mache ich falsch? Was ist der mögliche Unterschied in der Nutzung für Subprozess/Python/Pdftext zwischen meiner lokalen Version und der Webhost -Version? Ich vermute, ich muss den Befehl ändern, daher wäre jede Hilfe sehr geschätzt.

Danke im Voraus.

War es hilfreich?

Lösung

Kann der PDFTOTOTEXT aus der Befehlszeile direkt auf Webhost lesen? Können Sie das überprüfen? Warum passieren Sie den Namen der temporären Datei nicht als Argument, anstatt sie für die Standardeingabe zu geben? (Repräsentation hier nach Ihrem Vorschlag).

Andere Tipps

Der Hinweis auf die Antwort lag in Noufals Kommentar, um den Dateinamen zu verwenden. Aber das OS.TMPFile () hat keinen Dateinamen. Ich musste ein anderes Modul verwenden. Der geänderte Code ist unten angegeben.

#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

Ich bin mir nicht sicher, wie ich Noufals Kommentar die Punkte für diese Antwort abgeben kann. Vielleicht kann er diese Antwort schneiden und einfügen?

Wenn Sie Shell -Zugriff auf den Server haben, versuchen Sie, ohne Python auszuführen:

# pdftotext -layout - -

und:

# pdftotext -layout

Einige Versionen von PDFTOTOTEXT können STDI/STDOut verwenden und dann ohne Dateien in der Befehlszeile ausgeführt werden. Versuchen

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

Oder verwenden Sie die Temp -Datei, wie von Noufal Ibrahim vorgeschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top