Что вызывает Ghostscript для возврата ошибки -100?

Итак, я использую Matthew Ephraim GhostscriptSharp, который является простой оболочкой С# для неуправляемой DLL Ghostscript Win32 в моем проекте ASP.Net MVC, Некоторые предпосылки:

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

Я решил использовать класс оболочки Mr. Ephraim (GhostscriptSharp), потому что он был достаточно прост для использования, и это дает мне относительно чистый доступ к API DLL.

Чтобы протестировать его, я создал фиктивное консольное приложение С#, чтобы убедиться, что я могу загрузить 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 кажется уловкой, потому что нет документации, в которой говорится, что здесь может быть неправильно.

Любая помощь очень ценится, спасибо заранее.

Ответ 1

Итак, в итоге я оказался ошибкой ID10T, которая меня приводила сюда в этом конкретном экземпляре.

В коде Matthew Ephraim GhostscriptSharp он использует пару перечислений для определения параметров, указанных для Ghostscript, а два из них - это перечисления GhostscriptDevices и GhostscriptPageSizes. Проблема в том, как они написаны. Resharper (плагин Jetbrains Visual Studio) имеет правила по умолчанию для именования членов Enum. Не думая, я исправил все эти определения, чтобы удовлетворить Resharper, не понимая, что они передаются непосредственно Ghostscript, поэтому вместо получения a7 для -sPAPERSIZE GS получал a7, а для -sDEVICE он получал Jpeg вместо Jpeg.

В настоящее время разрешения не являются проблемой на моем конце, но только потому, что я запускаю тестовый сервер веб-разработчиков Cassini в Visual Studio.

Спасибо @MarkRedman и @tvanfosson за полезные советы!

Ответ 2

Ошибка -100 - это общая "фатальная ошибка" в GhostScript.

Несколько вещей, чтобы проверить:

1) Разрешения (для всех операций требуется доступ к файлам)

2) Scope, вы хотите добавить папку GS bin в переменные PATH

3) Считайте, что вы не вызываете GhostScript напрямую из asp.net, GS может быть очень интенсивным с CPU, а скорее обрабатывать файлы в отдельной службе

Я также создал обертку, отправлю мне электронное письмо (адрес в профиле), и я пошлю его вам. Он позволяет передавать в папку GS bin, которая помогает.

Ответ 3

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