在将 pdftotext 从 Python 脚本调用时,切换到我的网站托管后不起作用
我写了一个小的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这个工具能直接在网络主机的命令行上读取文件吗?你能确认一下吗?还有,为什么不把临时文件的名字作为参数传进去,而是通过标准输入来给呢?(根据你的建议,我在这里重新粘贴一下)。