当我从本地计算机更改为虚拟主机时,从 python 脚本调用 pdftotext 不起作用

发布于 2024-10-14 15:04:30 字数 798 浏览 3 评论 0原文

我编写了一个小的 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 使用可能存在什么差异?我猜我将不得不修改该命令,因此任何帮助将不胜感激。

提前致谢。

I wrote a small python script to parse/extract info from a PDF. I tested it on my local machine, I have python 2.6.2 and pdftotext version 0.12.4.

I am trying to run this on my webhosting server (dreamhost). It has python version 2.5.2 and pdftotext version 3.02.

But when I try to run the script I get the following error at the pdftotext line ( I have checked it with a simple throw away script as well) "Error: Couldn't open file '-'"

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

Note that I am pass this function the same PDF file and it does have access to it. In another function I can email myself the PDF document from the same script running on the webhost.

What am I doing wrong? What is the possible difference in usage for subprocess/python/pdftext between my local version and the webhost version? I am guessing I will have to modify the command, so any help would be greatly appreciated.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

娇柔作态 2024-10-21 15:04:30

答案的提示就在 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

我不确定如何给努法尔的评论给出这个答案的要点。也许他可以剪切并粘贴这个答案?

The hint for the answer lay in Noufal's comment, to use the filename. But the os.tmpfile() doesn't have a filename. I had to use another module. The modified code is given below.

#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

I am not sure sure how to give Noufal's comment the points for this answer though. Perhaps he can cut and paste this answer?

一百个冬季 2024-10-21 15:04:30

pdftotext 可以直接在网络主机上从命令行读取吗?你能验证一下吗?另外,为什么不将临时文件的名称作为参数传递,而不是在标准输入上给出它? (根据您的建议重新粘贴到此处)。

Can the pdftotext read from the command line directly on webhost? Can you verify this? Also, why don't you pass the name of the temporary file as an argument rather than give it on standard input? (repasting here as per your suggestion).

哆兒滾 2024-10-21 15:04:30

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

# pdftotext -layout - -

并且:

# pdftotext -layout

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

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

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

If you have shell access to the server, try to run without Python:

# pdftotext -layout - -

and:

# pdftotext -layout

Some versions of pdftotext may use stdi/stdout then run without any files in command line. Try

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

Or use temp file as suggested by Noufal Ibrahim.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文