GhostScript在ImageMagick中的文件路径

8
我想使用ImageMagick将PDF转换为PNG,在PC和OSX上进行操作,但我无法在任何一台计算机上安装GhostScript,因为我的软件将在这些计算机上使用。
有没有一种方法可以将GhostScript捆绑在ImageMagick中,并仅重定向ImageMagick的路径到该软件包,以便我可以在用户的计算机上使用它,而不必正式“安装”它?
我找到了这个页面,但我不知道如何更改ImageMagick中的delegates.xml文件以使其正确运行。我猜我必须更改此行的某个部分:
  <delegate decode="pdf" encode="eps" mode="bi" command=""@PSDelegate@" -q -dQUIET -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dEPSCrop -sDEVICE=epswrite "-sOutputFile=%o" -- "%i"" /> 

但我不确定该怎么做——应该放在哪里,或者基于ImageMagick的位置,或其他什么?非常感谢任何帮助。

更新v1.2:我尝试将上面的委托更改为以下内容,并在命令行中使用可执行文件:

 <delegate decode="pdf" encode="eps" mode="bi" command="&quot;F:\ImageMagickTest\ImageMagick\gs\bin\gswin32c.exe&quot; -q -dQUIET -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dEPSCrop -sDEVICE=epswrite &quot;-sOutputFile=%o&quot; -- &quot;%i&quot;"/>

但是当我运行程序时,在命令提示符中出现以下错误:
Microsoft Windows XP [Version 5.1.2600]

(C) 版权所有 1985-2001 微软公司。

F:\Documents and Settings\Administrator>F:\ImageMagickTest\ImageMagick\convert.e
xe F:\ImageMagickTest\PDFs\Appointment.pdf F:\ImageMagickTest\ConvertedPDFs\Appo
intment.png
convert.exe: `%s' (%d) "F:/ImageMagickTest/ImageMagick/gs9.06/bin/gswin32c.exe"
-q -dQUIET -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -d
EPSCrop -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -d
GraphicsAlphaBits=4 "-r72x72"  "-sOutputFile=F:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/
magick-5996ZNQmVN7RFumY--0000001" "-fF:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/magick-5
996r7pmg8XgvrNB" "-fF:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/magick-5996yhTQgwoLswnn"
@ error/utility.c/SystemCommand/1890.
convert.exe: Postscript delegate failed `F:\ImageMagickTest\PDFs\Appointment.pdf
': No such file or directory @ error/pdf.c/ReadPDFImage/679.
convert.exe: no images defined `F:\ImageMagickTest\ConvertedPDFs\Appointment.png
' @ error/convert.c/ConvertImageCommand/3044.

在我看来,这似乎表明它没有找到文件“Appointment.pdf”。但是文件确实存在。我哪里理解有误?

为了好玩,这是从Windows资源管理器中获取的gs完整路径:

F:\ImageMagickTest\ImageMagick\gs\bin\gswin32c.exe

为了更有趣,这里有一个在Unity 3D应用程序中调用它的c#脚本(我没有收到任何错误):

    string currDir = System.Environment.CurrentDirectory;
    string convertPath = currDir + @"\ImageMagick\convert.exe";
    string convertedDir = currDir + @"\ConvertedPDFs\";
    string pdfFolder = currDir + @"\PDFs\";
    string fileName = "Appointment";
    string argumentForImageMagick;


    argumentForImageMagick = pdfFolder + fileName + ".pdf" + " " + convertedDir + fileName + ".png";
    ProcessStartInfo info = new ProcessStartInfo {Arguments = argumentForImageMagick , FileName = convertPath};
    System.Diagnostics.Process.Start(info).WaitForInputIdle();

1
你的更新显示你没有将Ghostscript可执行文件放入命令行中,而只是放了它所在的目录:.....\bin\。在Windows上,你要找的可执行文件名为gswin32c.exegswin64c.exe - Kurt Pfeifle
顺便说一句,再次感谢您的大力帮助。没有您我将无法完成它。 - Catlard
1
删除两个@字符,这些字符包围着你的路径。当你提供可执行文件的完整路径时,它不再是一个变量(就像@PSDeletage@一样)。它应该读作... command="&quot;F:\ImageMagickTest\ImageMagick\gs\bin\gswin32c.exe&quot; ... -- 此外,你肯定已经检查过这确实是你的Ghostscript可执行文件了吧? - Kurt Pfeifle
“通过“切换命令行”,我是指尝试删除@符号。” - Catlard
Catlard,请查看我的更新答案。 - Kurt Pfeifle
显示剩余3条评论
5个回答

3

尝试将该行中的""@PSDelegate" -q部分替换为"/usr/local/bin/gs -q"(或您将安装Ghostscript可执行文件的任何路径)。

根据您的环境,您可能需要向该命令/行添加额外的参数,以告诉gs(在Windows上: gswin32c.exegswin64c.exe),它的库在哪里找到:
-I/usr/local/share/ghostscript/9.06/lib/


更新: 尝试在cmd.exe窗口中直接运行此Ghostscript命令,以查看它是否有效(或产生了哪些错误):

"F:/ImageMagickTest/ImageMagick/gs9.06/bin/gswin32c.exe" \
   -o F:/ImageMagickTest/PDFs/test.png                   \
   -dEPSCrop                                             \
   -dAlignToPixels=0                                     \
   -dGridFitTT=2                                         \
   -sDEVICE=pngalpha                                     \
   -dTextAlphaBits=4                                     \
   -dGraphicsAlphaBits=4                                 \
   -r72                                                  \
    F:/ImageMagickTest/PDFs/Appointment.pdf

不必担心我使用正斜杠(' / ')作为目录分隔符 - Windows 上的 Ghostscript 能够很好地处理这些字符。
希望您的 Ghostscript 安装是最新版本(否则它不会理解输出文件的 -o 语法)。
如果此命令不起作用,您应该在窗口中看到某种错误消息(因为我跳过了 -q -dQUIET 参数)。
可能 Ghostscript 找不到它的库,因为您可能只复制了 .exe 文件,而没有正确安装完整软件包。
也许您需要将类似于 -I"F:/ImageMagickTest/ImageMagick/gs9.06/lib" 的内容添加到命令行中(我不知道您的 Ghostscript /lib 目录的真实位置 - 这只是一个猜测!)。
"F:/ImageMagickTest/ImageMagick/gs9.06/bin/gswin32c.exe" \
   -o F:/ImageMagickTest/PDFs/test.png                   \
   -I"F:/ImageMagickTest/ImageMagick/gs9.06/lib"         \
   -dEPSCrop                                             \
   -dAlignToPixels=0                                     \
   -dGridFitTT=2                                         \
   -sDEVICE=pngalpha                                     \
   -dTextAlphaBits=4                                     \
   -dGraphicsAlphaBits=4                                 \
   -r72                                                  \
    F:/ImageMagickTest/PDFs/Appointment.pdf

在成功直接在cmd.exe窗口中运行Ghostscript后,您应该继续修改delegates.xml中的行。


Kurt!谢谢您的帮助。我正在按照您的指示尝试更改xml行...但是我不确定我是否正确地确定了路径。我已经更新了问题来反映它... - Catlard

1
我曾在没有管理员权限的电脑上尝试使用ImageMagick和GhostScript(两者均为便携版),并遇到了同样的问题。当我试图手动设置delegates.xml中GhostScript的路径,尝试批量将PDF文件转换为TIFF时,出现了错误。
解决方法是将delegates.xml文件中所有的"@PSDelegate"实例都替换为完整路径,例如:&quot;C:\<path_to_exec>\gswin32c.exe&quot;,而不仅仅是PDF特定行。这样做后,一切正常了。
这可能是因为GhostScript也用于其他格式,并且在转换PDF文件时可能依赖于delegates.xml文件中的其他"@PSDelegate"实例。

1

在我的情况下,这是Windows 10的问题。

我尝试了不同的选项,但ImageMagick总是尝试使用gs.exe。所以我做了一些我认为不会起作用的事情,基本上将我的gswin64c.exe文件重命名为gc.exe

之后它就可以工作了。我唯一需要的是将exe所在的路径添加到我的环境变量中,而在我的情况下,路径是:C:\Program Files\gs\gs9.53.3\bin


0

当我运行ImageMagick进行PDF阅读时,也遇到了“Postscript delegate failed”消息。问题是由于ImageMagick在Windows下读取以下注册表项(在SOFTAWRE下)之一以获取gs可执行文件的路径。

  • GPL Ghostscript
  • GNU Ghostscript
  • AFPL Ghostscript
  • Aladdin Ghostscript

问题是这指向用户计算机上安装的非常旧版本的Ghost script,并未能将PDF转换为图像。

解决方案是从计算机中卸载有问题的古老软件包,或更新delegates.xml文件以明确指向提供的gs可执行文件。


0

我曾经遇到过同样的问题,但是所有的答案都没有帮助到我。后来发现安装了32位版本的ImageMagick和64位版本的GhostScript,两者不兼容。因此我们卸载了64位的GhostScript并安装了32位版本,然后更新delegates.xml中的路径,问题得到了解决。


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