2015-11-23 174 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時,我不再看到錯誤。真棒。謝謝您的幫助! –

相關問題