10

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

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

import PythonMagick

pdf = 'test.pdf'
p = PythonMagick.Image()    
p.density('600')
p.read(pdf)
p.write('doc.jpg')

在此文件夹中(D:\Python Projects\Sheet Music Reader) D:\Python 项目\乐谱阅读器

但是,使用该相对 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 转换为图像是一场噩梦)

4

1 回答 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 位将无法工作,即使您已经安装了 64 位版本的 ImageMagick)。在 ImageMagick 之后
    设置为您的系统范围路径。C:\Program Files (x86)\gs\gs9.06\bin
  4. 检查您的设置是否有效。convert some.pdf some.jpg在命令行中尝试。如果它不起作用,那么您在第 1-3 点做错了。
  5. 使用非官方二进制文件安装PythonMagick,而不是使用 easy_install 或 pip。
    (再次重申:我使用的是 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)

这是我想到的那个问题的唯一解决方法。

于 2012-12-21T08:39:24.677 回答