Вызов PdftOtext из сценария Python не работает, когда я перехожу с локальной машины на свой веб -хост

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

Вопрос

Я написал небольшой сценарий Python для анализа/извлечения информации из PDF. Я проверил его на своей локальной машине, у меня есть версия Python 2.6.2 и PdftOtext 0.12.4.

Я пытаюсь запустить это на своем сервере веб -хостинга (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 между моей локальной версией и версией Webhost? Я предполагаю, что мне придется изменить команду, поэтому любая помощь будет высоко оценена.

Заранее спасибо.

Это было полезно?

Решение

Может ли PDFTOTEXT прочитать из командной строки непосредственно на Webhost? Вы можете проверить это? Кроме того, почему бы вам не пропустить имя временного файла в качестве аргумента, а не отдать его на стандартный ввод? (Репродато здесь в соответствии с вашим предложением).

Другие советы

Намек на ответ лежал в комментарии Нуфала, чтобы использовать имя файла. Но os.tmpfile () не имеет имени файла. Я должен был использовать другой модуль. Модифицированный код приведен ниже.

#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

Я не уверен, как дать комментарий Нуфала очки за этот ответ. Возможно, он сможет вырезать и вставить этот ответ?

Если у вас есть доступ к серверу, попробуйте запустить без Python:

# pdftotext -layout - -

а также:

# pdftotext -layout

Некоторые версии pdftOtext могут использовать STDI/STDOUT, затем запускать без каких -либо файлов в командной строке. Пытаться

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

Или используйте временный файл, как предложено Noufal Ibrahim.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top