在将 pdftotext 从 Python 脚本调用时,切换到我的网站托管后不起作用

4 投票
3 回答
3787 浏览
提问于 2025-04-16 10:50

我写了一个小的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时有什么可能的区别?我猜我需要修改命令,所以任何帮助都将非常感激。

提前谢谢你。

3 个回答

0

如果你能通过命令行访问服务器,可以试着不使用Python来运行:

# pdftotext -layout - -

还有:

# pdftotext -layout

有些版本的pdftotext可能会使用标准输入和输出,所以可以尝试在命令行中不带任何文件来运行。试试这个:

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

或者可以使用临时文件,正如Noufal Ibrahim所建议的那样。

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的评论加分。也许他可以把这个答案复制粘贴过来?

4

pdftotext这个工具能直接在网络主机的命令行上读取文件吗?你能确认一下吗?还有,为什么不把临时文件的名字作为参数传进去,而是通过标准输入来给呢?(根据你的建议,我在这里重新粘贴一下)。

撰写回答