PDFTOTOTEXT vom Python -Skript aufzurufen, funktioniert nicht, wenn ich von der lokalen Maschine zu meinem Webhosting wechselt
-
27-10-2019 - |
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.
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.