PythonMagick无法找到我的PDF文件。

11

我已经从非官方Windows二进制文件下载并安装了PythonMagick,用于python 2.7,64位Windows 7。

我正在尝试运行这段代码(Processor.py)

import PythonMagick

pdf = 'test.pdf'
p = PythonMagick.Image()    
p.density('600')
p.read(pdf)
p.write('doc.jpg')
在这个文件夹中(D:\ Python项目\ Sheet Music Reader)。 D:\ Python项目\ Sheet Music Reader 然而,使用相对pdf路径或pdf = “D:\ Python Projects \ Sheet Music Reader”会导致此错误。
Traceback (most recent call last):
  File "D:/Python Projects/Sheet Music Reader/Processor.py", line 6, in <module>
    p.read(pdf)  
RuntimeError: Magick: PostscriptDelegateFailed `D:\Python Projects\Sheet Music Reader\test.pdf':   
No such file or directory @ error/pdf.c/ReadPDFImage/664

我不明白为什么它找不到我的PDF,它与Python脚本在同一个目录中。

是什么导致了这个错误,我该如何修复?
(我有印象在Python中将PDF转换为图像是一场噩梦)


os.path.exists("D:\\Python Projects\\Sheet Music Reader\\test.pdf") 的结果是什么?p.read(pdf) 是期望文件名还是文件对象? - Alex L
os.path.exists() 返回 True,同时将一个文件对象作为 pdf 传递会引发错误;ArgumentError: Python argument types in Image.read(Image, file) did not match C++ signature: - Anti Earth
1个回答

27

我几天前也遇到了完全相同的问题。虽然从.gif(或其他格式)转换为.jpg非常顺利,但从.pdf转换为.jpg会产生完全相同的错误。这是因为ImageMagick使用Ghostscript来读取/转换PDF。

您可以通过安装Ghostscript(只有32位版本有效)来解决该问题。不要忘记将“C:\ Program Files(x86)\ gs \ gs9.06 \ bin”添加到系统路径中。

以下是我如何使PythonMagick工作的逐步指南:
(我在Windows 7 64位上使用Python 2.7.3 32位。)

  1. 安装最新版本的ImageMagick(目前写作时是“ ImageMagick-6.8.1-1-Q16-windows-dll.exe”,请注意,这是32位版本;64位对我也很好)。
    别忘了勾选选项“安装用于C和C ++的开发头文件和库”
  2. 将环境变量MAGICK_HOME设置为ImageMagick的路径(对我来说是C:\Program Files (x86)\ImageMagick-6.8.1-Q16)。
    如果尚未添加,请将此路径附加到系统范围的路径中,位于第一位置。
  3. 下载并安装32位版本的GhostScript(64位不起作用,即使您已安装了ImageMagick的64位版本)。
    在ImageMagick之后将C:\Program Files(x86)\ gs \ gs9.06 \ bin设置为系统范围的路径。
  4. 检查您的设置是否有效。在命令行中尝试convert some.pdf some.jpg。如果不起作用,则说明在第1-3点中做错了些什么。
  5. 使用非官方二进制文件而不是easy_install或pip安装PythonMagick
    (再次说明:我正在使用32位Python 2.7.3解释器,因此我选择了“ PythonMagick-0.9.7.win32-py2.7. exe”)
  6. 启动您的Python命令行工具并尝试类似以下内容的操作:
from PythonMagick import Image
im = Image()
im.read(r"C:\Path\To\Some.pdf")
im.write("some.jpg")



另附一个多页PDF的示例:

import os
from pyPdf import PdfFileReader, PdfFileWriter
from tempfile import NamedTemporaryFile
from PythonMagick import Image

reader = PdfFileReader(open("some.pdf", "rb"))
for page_num in xrange(reader.getNumPages()):
    writer = PdfFileWriter()
    writer.addPage(reader.getPage(page_num))
    temp = NamedTemporaryFile(prefix=str(page_num), suffix=".pdf", delete=False)
    writer.write(temp)
    temp.close()

    im = Image()
    im.density("300") # DPI, for better quality
    im.read(temp.name)
    im.write("some_%d.jpg" % (page_num))

    os.remove(temp.name)

这是我所能想到的唯一解决该问题的方法。


pyPdf的示例(我认为)是无效的;您正在将一个pyPdf页面对象(无论它是什么)传递给PythonMagick Image构造函数,该函数不接受它(导致参数错误;C++类型不匹配)。我找不到这两个模块合作的有效示例。您有其他资源/示例吗?谢谢。 - Anti Earth
2
添加了一个包含多个页面的 PDF 的示例。对于延迟感到抱歉。 - floqqi
同样的问题,不过我正在使用Python 2.7.3 64位和ImageMagick 64位。 Ghostscript 32位不起作用,我不得不安装64位版本才能使用(使用floqqi的逐步指南)。 - Rabih Kodeih
@floqqi,“将“MAGICK_HOME”环境设置为ImageMagick路径”的意思是什么?我该如何做到这一点?此外,ImageMagick安装文件的名称现已更改为ImageMagick-6.9.1-2-Q16-x86-dll.exe(版本已更新)。 - akki
1
@akki,您需要设置一个名为MAGICK_HOME的新环境变量,并将您的ImageMagick安装路径(在我的例子中为“C:\Program Files (x86)\ImageMagick-6.8.1-Q16”)作为值。 - floqqi
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接