Llamar a Pdftotext desde el script de Python no funciona cuando cambio de la máquina local a mi webhosting

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

Pregunta

Escribí un pequeño script de Python para analizar/extraer información de un PDF. Lo probé en mi máquina local, tengo Python 2.6.2 y Pdftotext versión 0.12.4.

Estoy tratando de ejecutar esto en mi servidor webhosting (Dreamhost). Tiene Python versión 2.5.2 y PDFTotext versión 3.02.

Pero cuando intento ejecutar el script, obtengo el siguiente error en la línea PDFTotext (también lo he verificado con un script de tiroteo simple) "Error: no se pudo abrir el archivo '-'"

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

Tenga en cuenta que estoy aprobando esta función el mismo archivo PDF y tiene acceso a él. En otra función, puedo enviarme un correo electrónico al documento PDF del mismo script que se ejecuta en el webhost.

¿Qué estoy haciendo mal? ¿Cuál es la posible diferencia en el uso de subprocesos/python/pdftext entre mi versión local y la versión webhost? Supongo que tendré que modificar el comando, por lo que cualquier ayuda sería muy apreciada.

Gracias por adelantado.

¿Fue útil?

Solución

¿Puede el pdftotext leer desde la línea de comando directamente en Webhost? ¿Puedes verificar esto? Además, ¿por qué no pasa el nombre del archivo temporal como argumento en lugar de darlo en la entrada estándar? (repartir aquí según su sugerencia).

Otros consejos

La pista de la respuesta radica en el comentario de Noufal, para usar el nombre de archivo. Pero el os.tmpfile () no tiene un nombre de archivo. Tuve que usar otro módulo. El código modificado se proporciona a continuación.

#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

Sin embargo, no estoy seguro de cómo darle al comentario de Noufal los puntos para esta respuesta. ¿Quizás pueda cortar y pegar esta respuesta?

Si tiene acceso de shell al servidor, intente ejecutar sin Python:

# pdftotext -layout - -

y:

# pdftotext -layout

Algunas versiones de PDFTOTEXT pueden usar STDI/STDOUT y luego ejecutar sin ningún archivo en la línea de comando. Probar

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

O use el archivo TEMP según lo sugerido por Noufal Ibrahim.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top