4

我写了一个小 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 文档。

我究竟做错了什么?我的本地版本和虚拟主机版本之间 subprocess/python/pdftext 的使用可能有什么区别?我猜我将不得不修改命令,所以任何帮助将不胜感激。

提前致谢。

4

3 回答 3

6

答案的提示在于 Noufal 的评论,使用文件名。但是 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

不过,我不确定如何为 Noufal 的评论提供这个答案的要点。也许他可以剪切并粘贴这个答案?

于 2011-01-30T13:14:09.770 回答
4

pdftotext 可以直接在虚拟主机上从命令行读取吗?你能证实这一点吗?另外,为什么不将临时文件的名称作为参数传递,而不是在标准输入中提供呢?(根据您的建议在此处重新粘贴)。

于 2011-01-30T14:09:37.360 回答
0

如果您对服务器具有 shell 访问权限,请尝试在没有 Python 的情况下运行:

# pdftotext -layout - -

和:

# pdftotext -layout

某些版本的 pdftotext 可能会使用 stdi/stdout,然后在命令行中不带任何文件运行。尝试

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

或者按照 Noufal Ibrahim 的建议使用临时文件。

于 2011-01-29T13:36:10.003 回答