Что заставляет Ghostscript возвращать ошибку -100? - PullRequest
15 голосов
/ 03 декабря 2010

Итак, я использую Мэтью Эфраима 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, что является фатальной ошибкой (в исходном коде GhostScript называется E_Fatal). Я получаю один и тот же результат как с файлом, загруженным через форму 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 ]

11 голосов
/ 03 декабря 2010

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

Несколько вещей для проверки:

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

2) Сфера действия: вы хотите добавить папку bin GS в переменные PATH

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

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

3 голосов
/ 06 декабря 2010

Итак, в итоге мы столкнулись с ошибкой 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 за их полезные советы!

3 голосов
/ 03 декабря 2010

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

...