chiamando pdftotext da script python non funziona quando cambio dalla macchina locale al mio webhosting

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

Domanda

ho scritto un piccolo script python per informazioni parse / estratto da un PDF. L'ho provato sulla mia macchina locale, ho pitone 2.6.2 e pdftotext versione 0.12.4.

Sto cercando di eseguire questo sul mio server webhosting (DreamHost). Ha pitone versione 2.5.2 e la versione pdftotext 3.02.

Ma quando provo ad eseguire lo script ottengo il seguente errore sulla linea di pdftotext (ho controllato con un semplice buttare via script come bene) "Errore: Impossibile aprire il file '-'"

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

Si noti che sto passare questa funzione lo stesso file PDF e lo fa avere accesso ad esso. In un'altra funzione posso-mail me stesso il documento PDF dallo stesso script in esecuzione sul hosting.

Che cosa sto facendo di sbagliato? Qual è la possibile differenza di utilizzo per sottoprocesso / python / PDFtext tra la mia versione locale e la versione hosting? Sono indovinando dovrò modificare il comando, in modo che qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo.

È stato utile?

Soluzione

Può il pdftotext leggere dalla riga di comando direttamente sul hosting? Si può verificare questo? Inoltre, perché non si passa il nome del file temporaneo come un argomento piuttosto che dà sullo standard input? (Repasting qui come per il vostro suggerimento).

Altri suggerimenti

Il suggerimento per la risposta stava nel commento di Noufal, per usare il nome del file. Ma l'os.tmpfile () non ha un nome di file. Ho dovuto usare un altro modulo. Il codice modificato è riportata qui sotto.

#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

Non sono sicuro sicuro di come dare il commento di Noufal i punti per questa risposta però. Forse lui può tagliare e incollare questa risposta?

Se si dispone di accesso alla shell al server, provare a correre senza Python:

# pdftotext -layout - -

e

# pdftotext -layout

Alcune versioni di pdftotext possono utilizzare stdi / stdout quindi eseguire senza alcun file nella linea di comando. Prova

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

o il file uso temporaneo come suggerito da Noufal Ibrahim.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top