2015-11-23 88 views
1

我们在Ghostscript 9.16上使用Magick.Net 7.0版本。我们正在阅读PDF格式并将其转换为tif或jpg图像。当我们一次一个地运行这些代码并转换PDF时,一切正常。ImageMagick和Ghostscript从PDF转换出错

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

ImageMagick.MagickDelegateErrorException:

ESBService.exe: PDFDelegateFailed [ghostscript的库9.16] -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 5亿-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(字节[] 数据,MagickReadSettings readSettings)在 ImageMagick.MagickImageCollection.Read(字节[]数据,MagickReadSettings readSettings)在 __DynamicCode.Typeaeb039071464a22ae6518eaa5ec46c.OnExecute(PipelineContext1 上下文)在C:\ Users \用户esbsvc \应用程序数据\本地\ TEMP \ xp42eval.0.cs:线112

任何帮助,这将不胜感激 麦克H.

回答

0

有两个可能的问题:

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

2)文件访问存在冲突。为了解释一个PDF文件,有必要跳过这个文件,我猜想两个进程试图同时重定位文件指针,一个失败。

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

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

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

0

Ghostscript的(http://www.ghostscript.com/doc/current/API.htm)的API文档指出以下:

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

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

+0

我下载了最新版本,我从我的第一次测试中看到了很棒的结果。尝试转换PDF时,我不再看到错误。真棒。谢谢您的帮助! –

相关问题