我们使用的是带有Ghostscript 9.16的Magick.Net 7.0版。我们正在阅读PDF,并将其转换为tif或jpg图像。当我们一次运行一个并转换PDF时,一切都很好。
这是一个将受到许多系统影响的应用程序,因此我们进行了一个小型负载测试,以确保我们能够处理多个请求。只要我们使用不同的PDF文件,一切都会运行得很好。如果我们多次尝试运行同一个PDF文件(用同一个PDF同时执行5个请求),我们会遇到错误。我们收到的错误是PDFDelegateFailed。我们不确定为什么会出现这种错误,如果我们尝试其他格式(如tif到jpg),就没有问题。
ImageMagick.MagickDelegateErrorException:
ESBService.exe:PDFDelegateFailed[ghostscript库9.16]-q-dQUIET-dSAFER-dBATCH-dNOPAUSE-dNOPROMPT-dMaxBitmap=500000000-dAlignToPixels=0-dGridFitTT=2"-sDEVICE=pngalpha"-dTextAlphaBits=4-dGraphicsAlphaBits=4"-r96x96"-sOutputFile=C:/Users/sbsvc/AppData/Local/Temp/magick-4668LPfdzdRfLYF%d"-fC:/Users/sbsvc/AppData/Local/Temp/magick-4668wanF98SE_8PK"-fC:/Users/sbsvc/AppData/Local/Temp/magick-4668L3mJE6M2iUZV":(null)'@pdf.c/ReadPDFImage/788ImageMagick.Wapper.MagickImageCollection.HandleException(MagickException异常)(Byte[]数据,MagickReadSettings readSettings)ImageMagick.MagickImageCollection.Read(Byte[]数据,MagickReadSettingsreadSettings)__DynamicCode.Typeaeb039071464a22ae6518eaa5ec46c.OnExecute(管道上下文1context)在c:\Users\esbsvc\AppData\Local\Temp\xp42eval.0.cs:line 112 中
如有任何帮助,我们将不胜感激Mike H.
有两个可能的问题:
1) C#代码使用的是Ghostscript DLL的一个副本,而您还没有将其构建为线程安全的(我记不起当前Windows上的默认值是什么)。实际上,您运行的是多个线程,而不是进程。
2) 您在文件访问方面发生冲突。为了解释PDF文件,有必要在文件中多次跳转,我猜有两个进程试图同时重新定位文件指针,其中一个失败了。
与图像格式不同,ImageMagick无法直接处理PDF文件(PDF不是图像格式,它要复杂得多),因此它不需要调用Ghostscript。如果您对PostScript文件进行同样的尝试,您可能会遇到同样的问题。但是,由于PostScript文件是线性读取的,因此这些文件可能没有问题。
如果捕获Ghostscript后台通道输出(并停止使用-dQUIET),则可能会获得一些更有用的信息。
由于您说这"将受到许多系统的影响",请检查AGPL的条款,并确保您的使用与许可证一致。
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刚刚发布,并包含了此更改。