Что заставляет 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, которая помогает.

Скорее всего, процесс, выполняющий веб-приложение, не имеет разрешения на запись в каталоги, которые вы используете. Я бы предложил создать какой-то конкретный каталог для использования приложением и локальный идентификатор для запуска пула приложений, а затем дать этому идентификатору достаточно привилегий для чтения / записи созданного вами каталога.

Другие вопросы по тегам