2015-11-23 1 views
1

Мы используем Magick.Net версии 7.0 с Ghostscript 9.16. Мы читаем в формате PDF и преобразуем его в tif или jpg-изображение. Все работает нормально, когда мы запускаем их по одному за раз, и наш PDF-код преобразуется.Ошибка с ImageMagick и Ghostscript преобразования из PDF

Это приложение, которое будет поражено многими системами, поэтому мы поставили небольшой тест нагрузки, чтобы мы могли обрабатывать несколько запросов. Все работает отлично, пока мы используем разные файлы PDF. Если мы попытаемся запустить один и тот же файл PDF через несколько раз (одновременно выполняем 5 запросов с одним и тем же PDF), мы сталкиваемся с ошибкой. Ошибка, которую мы получаем, - 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/esbsvc/AppData/Local/Temp/magick-4668LPfdzdzRfLYF% d" "-fC:/Users/esbsvc/AppData/Local/Temp/magick-4668wanF98SE_8PK " " -fC:/Пользователи/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 \ AppData \ Local \ Temp \ xp42eval.0.cs: линия 112

Любая помощь с этим была бы оценена Mike H.

ответ

0

Есть две вероятные проблемы:

1) Код C# использует единственную копию DLL Ghostscript, и вы не создали ее для потоковой безопасности (я не могу вспомнить, что по умолчанию в настоящее время находится в Windows). Фактически вы используете несколько потоков, а не процессы.

2) У вас есть столкновение с доступом к файлам. Чтобы интерпретировать PDF-файл, нужно много раз перескакивать по файлу, я бы предположил, что два процесса попытались переместить указатель файла одновременно, а один не удалось.

ImageMagick не может обрабатывать файлы PDF напрямую, в отличие от форматов изображений (PDF не является форматом изображения, его гораздо более сложным), поэтому ему не нужно вызывать Ghostscript. Если вы попытаетесь сделать то же самое с файлами PostScript, вы можете столкнуться с той же проблемой. Однако, поскольку файлы PostScript читаются линейно, у вас может не возникнуть проблема с ними.

Если вы захватили вывод обратного канала Ghostscript (и прекратите использовать -dQUIET), вы можете получить более полезную информацию.

Поскольку вы говорите, что это «будет поражено многими системами», пожалуйста, проверьте условия AGPL и убедитесь, что ваше использование согласуется с лицензией.

0

В API документация Ghostscript (http://www.ghostscript.com/doc/current/API.htm) говорится следующее:

The Win32 DLL gsdll32.dll может использоваться несколькими программами одновременно, но только один раз в течение каждого процесса.

Версия Magick.NET, которую вы используете, не обрабатывает это должным образом. Я просто нажал патч в репозиторий GIT ImageMagick, чтобы убедиться, что DLL можно использовать только один раз. Первый поток будет использовать библиотеку в памяти, а второй/третий/и т. Д. поток будет принудительно использовать командную строку. Magick.NET 7.0.0.0022 только что опубликован и включает это изменение.

+0

Я загрузил последние, и я вижу отличные результаты из своих первых тестов. Я больше не вижу ошибок при попытке конвертировать PDF. Потрясающие. Спасибо за помощь! –