2011-01-29 41 views
3

我写了一个小型python脚本来解析/提取PDF中的信息。我在本地机器上测试过它,我有python 2.6.2和pdftotext版本0.12.4。当我从本地机器更改为我的网站主机时,从python脚本调用pdftotext不工作

我想在我的虚拟主机服务器(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的用法有什么区别?我猜我将不得不修改命令,所以任何帮助将不胜感激。

在此先感谢。

+1

pdftotext是否可以直接从webhost上的命令行读取?你能证实这一点吗?另外,为什么不将临时文件的名称作为参数传递,而不是将它作为标准输入提供给它? – 2011-01-29 13:33:07

+0

3.02可能是`xpdf`的版本,而不是`pdftotext`。通常`pdftotext`是_xpdf_包的一部分。 – PoltoS 2011-01-29 13:42:03

+0

@Noufal - 是的,它可以从命令行读取。为更多的上下文,为什么我这样做看到这个问题http://stackoverflow.com/questions/3745178/running-a-command-line-from-python-and-piping-arguments-from-memory – Chaitanya 2011-01-30 13:04:03

回答

4

pdftotext可以直接从webhost上的命令行读取吗?你能证实这一点吗?另外,为什么不将临时文件的名称作为参数传递,而不是将它作为标准输入提供给它? (根据你的建议在这里重新开始)。

0

如果服务器shell访问,尽量不Python的运行:

# pdftotext -layout - - 

和:

# pdftotext -layout 

pdftotext的某些版本可能会使用STDI /标准输出则没有在任何文件上运行命令行。尝试

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

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

+0

这些工作都没有。 “pdftotext -layout - - ”给了我同样的错误信息,“pdftotext -layout”只是输出帮助文本。没有“ - ”参数的子进程的行为与“pdftotext -layout”的行为相同,并输出帮助消息 – Chaitanya 2011-01-30 12:59:42

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的评论点这个答案虽然。也许他可以剪切并粘贴这个答案?

相关问题