Что заставляет Ghostscript возвращать ошибку -100?
Итак, я использую GhostscriptSharp Мэтью Эфраима, которая является простой оболочкой C# для неуправляемой библиотеки Win32 Ghostscript DLL в моем проекте ASP.Net MVC. Немного предыстории:
Я пытаюсь сделать так, чтобы пользователь загрузил PDF, а затем преобразовал этот документ в изображение, которое я затем смогу сохранить в любом каталоге, который я выбрал (а также сделал несколько других ООП, чтобы привязать это новое изображение к моему сайту).,
Я решил использовать класс-оболочку г-на Эфраима (GhostscriptSharp), потому что он был достаточно прост в использовании и дает мне относительно чистый доступ к API-интерфейсу DLL.
Чтобы проверить это, я создал фиктивное консольное приложение C#, чтобы убедиться, что я могу загрузить DLL, получить к ней доступ, передать файл PDF на локальный диск и затем записать JPG на тот же локальный диск. После небольшого опыта обучения я добился успеха. Я бы вручил его C:\INPUT.pdf, он вручил бы мне C:\OUTPUT.jpg.
Однако после интеграции кода GhostScriptSharp, который был у меня в консольном приложении, в мой проект ASP.NET MVC до точки, где я вызывал DLL с помощью P/invoke, Ghostscript возвращается с кодом int/error -100
, который является фатальной ошибкой (называется E_Fatal
в исходном коде GhostScript). Я получаю один и тот же результат как с файлом, загруженным через форму HTML, так и с тем, что я передаю ему те же жестко заданные пути, которые я использовал в своем рабочем консольном приложении.
Для справки, строки, которые выдают исключение, 93-97 в GhostScriptSharp.cs (который находится в CallApi
функция):
int result = InitAPI(gsInstancePtr, args.Length, args);
if (result < 0) {
throw new ExternalException("Ghostscript conversion error", result);
}
Очевидно, исключение выбрасывается, потому что result
является -100
,
Когда вызывается InitAPI, экземпляр ptr является действительным int
(хотя я не знаю, правильный ли экземпляр GS или нет), args имеет длину 20 (является string[]
) допустимых опций GhostScript (включая правильно экранированные пути к моим входным и выходным файлам).
Короче говоря, что я делаю не так? Код ошибки -100
кажется всеобъемлющим, потому что нет документации, в которой указано, что здесь может пойти не так.
Любая помощь очень ценится, спасибо заранее.
3 ответа
Итак, в конечном итоге это была ошибка ID10T, которая привела меня в замешательство в данном конкретном случае.
В коде Мэтью Эфраима GhostscriptSharp он использует несколько перечислений, чтобы определить параметры, изложенные для Ghostscript, и два, в частности, были GhostscriptDevices
а также GhostscriptPageSizes
перечисления. Проблема в том, как они написаны Resharper (плагин Jetbrains Visual Studio) имеет правила по умолчанию для именования членов Enum. Не думая, я исправил все эти определения, чтобы Резарпер не осознавал, что они передаются непосредственно в Ghostscript, поэтому вместо получения a7
за -sPAPERSIZE
GS получал A7
, и для -sDEVICE
это становилось Jpeg
вместо jpeg
,
В настоящее время разрешения не были проблемой с моей стороны, но только потому, что я запускаю тестовый сервер Cassini Web Dev в Visual Studio.
Спасибо @MarkRedman и @tvanfosson за их полезные советы!
Ошибка -100 - это общая "фатальная ошибка" в GhostScript.
Несколько вещей, чтобы проверить:
1) Разрешения (все операции требуют доступа к файлу)
2) Область действия, вы хотите добавить папку GS bin в переменные PATH
3) Не стоит вызывать GhostScript напрямую из asp.net, GS может сильно загружать процессор, а обрабатывать файлы в отдельном сервисе.
Я также создал обертку, отправьте мне электронное письмо (адрес в профиле), и я отправлю его вам. Это позволяет перейти в папку GS bin, которая помогает.
Скорее всего, процесс, выполняющий веб-приложение, не имеет разрешения на запись в каталоги, которые вы используете. Я бы предложил создать какой-то конкретный каталог для использования приложением и локальный идентификатор для запуска пула приложений, а затем дать этому идентификатору достаточно привилегий для чтения / записи созданного вами каталога.