【问题标题】:Error with ImageMagick and Ghostscript converting from PDFImageMagick 和 Ghostscript 从 PDF 转换时出错
【发布时间】:2016-02-25 15:37:38
【问题描述】:

我们使用 Magick.Net 7.0 版和 Ghostscript 9.16。我们正在阅读 PDF 并将其转换为 tif 或 jpg 图像。当我们一次运行这些并转换我们的 PDF 时,一切正常。

这是一个会受到许多系统攻击的应用程序,因此我们进行了一个小型负载测试,以确保我们可以处理多个请求。只要我们使用不同的 PDF 文件,一切都运行良好。如果我们尝试多次运行同一个 PDF 文件(使用同一个 PDF 同时执行 5 个请求),我们会遇到错误。我们收到的错误是 PDFDelegateFailed。我们不确定为什么会出现此错误,如果我们尝试其他格式(例如 tif 到 jpg),则没有问题。

ImageMagick.MagickDelegateErrorException:

ESBService.exe: PDFDelegateFailed [ghostscript library 9.16] -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r96x96" "-sOutputFile=C:/Users/esbsvc/AppData/Local /Temp/magick-4668LPfdzdzRfLYF%d" “-fC:/Users/esbsvc/AppData/Local/Temp/magick-4668wanF98SE_8PK” “-fC:/Users/esbsvc/AppData/Local/Temp/magick-4668L3mJE6M2iUZV”: (null)'@error/pdf.c/ReadPDFImage/788 at ImageMagick.Wrapper.MagickImageCollection.HandleException(MagickException 异常)在 ImageMagick.Wrapper.MagickImageCollection.Read(Byte[] 数据,MagickReadSettings 读取设置)在 ImageMagick.MagickImageCollection.Read(Byte[] 数据,MagickReadSettings 读取设置)在 __DynamicCode.Typeaeb039071464a22ae6518eaa5ec46c.OnExecute(PipelineContext1 上下文)在 c:\Users\esbsvc\AppData\Local\Temp\xp42eval.0.cs:line 112

对此的任何帮助将不胜感激 迈克 H.

【问题讨论】:

    标签: c# imagemagick ghostscript magick.net


    【解决方案1】:

    有两个可能的问题:

    1) C# 代码使用的是 Ghostscript DLL 的单个副本,并且您尚未将其构建为线程安全的(我不记得 Windows 当前的默认设置是什么)。实际上,您正在运行多个线程而不是进程。

    2) 文件访问发生冲突。为了解释 PDF 文件,需要在文件中跳转很多次,我猜想两个进程同时尝试重新定位文件指针,一个失败了。

    ImageMagick 不能直接处理 PDF 文件,这与图像格式不同(PDF 不是图像格式,它要复杂得多),因此它不需要调用 Ghostscript。如果您要对 PostScript 文件进行相同的尝试,您可能会遇到同样的问题。但是,由于 PostScript 文件是线性读取的,因此您可能不会遇到这些问题。

    如果您捕获 Ghostscript 反向通道输出(并停止使用 -dQUIET),那么您可能会获得一些更有用的信息。

    既然您说这“会受到许多系统的影响”,请检查 AGPL 的条款并确保您的使用与许可一致。

    【讨论】:

      【解决方案2】:

      Ghostscript (http://www.ghostscript.com/doc/current/API.htm) 的 API 文档声明如下:

      Win32 DLL gsdll32.dll 可以被多个程序同时使用,但在每个进程中只能使用一次。

      您使用的 Magick.NET 版本无法正确处理此问题。我刚刚向 ImageMagick 的 GIT 存储库推送了一个补丁,以确保 DLL 只能使用一次。第一个线程将使用内存中的库和第二个/第三个/等。线程将强制使用命令行。 Magick.NET 7.0.0.0022 刚刚发布并包含此更改。

      【讨论】:

      • 我下载了最新版本,我在第一次测试中看到了很好的结果。尝试转换 PDF 时,我不再看到错误。惊人的。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      相关资源
      最近更新 更多