2

我们使用 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 exception) at ImageMagick.Wrapper.MagickImageCollection.Read(Byte [] data, MagickReadSettings readSettings) 在 ImageMagick.MagickImageCollection.Read(Byte[] data, MagickReadSettings readSettings) 在 __DynamicCode。在 c:\Users\esbsvc\AppData\Local\Temp\xp42eval.0.cs:line 112 中键入 aeb039071464a22ae6518eaa5ec46c.OnExecute(PipelineContext1 上下文)

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

4

2 回答 2

0

有两个可能的问题:

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

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

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

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

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

于 2015-11-23T14:55:05.820 回答
0

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

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

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

于 2015-11-23T22:09:59.953 回答