вызов pdftotext из скрипта Python не работает, когда я перехожу с локального компьютера на мой веб-хостинг - PullRequest
4 голосов
/ 29 января 2011

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

Я пытаюсь запустить это на своем сервере веб-хостинга (dreamhost). Имеет версию 2.5.2 для python и версию 3.02 для pdftotext.

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

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

Ответы [ 3 ]

6 голосов
/ 30 января 2011

Подсказка для ответа лежала в комментарии Нуфаля, чтобы использовать имя файла. Но у 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

Хотя я не уверен, как дать комментарию Нуфаля баллы за этот ответ. Возможно, он сможет вырезать и вставить этот ответ?

4 голосов
/ 30 января 2011

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

0 голосов
/ 29 января 2011

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

# pdftotext -layout - -

и:

# pdftotext -layout

В некоторых версиях pdftotext может использоваться stdi / stdout, а затем работать безлюбые файлы в командной строке.Попробуйте

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

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

...