Использование Ghostscript в веб-приложении (эскизы PDF) - PullRequest
2 голосов
/ 24 марта 2010

Я использую оболочку ghostscriptsharp для c # и ghostscript. Я хочу создавать миниатюры из PDF-файлов. Дальнейшая информация о коде образца приведена здесь .

Существуют различные методы, импортированные из ghostscript-c-dll "gsdll32.dll".

 [DllImport("gsdll32.dll", EntryPoint = "gsapi_new_instance")]
 private static extern int CreateAPIInstance(out IntPtr pinstance, 
                                        IntPtr caller_handle);

 [DllImport("gsdll32.dll", EntryPoint = "gsapi_init_with_args")]
 private static extern int InitAPI(IntPtr instance, int argc, IntPtr argv);

 //...and so on

Я использую GhostscriptWrapper для создания миниатюр в веб-приложении (.net 2.0). Этот класс использует методы, импортированные выше.

 protected void Page_Load(object sender, EventArgs e){
      GhostscriptWrapper.GeneratePageThumb("c:\\sample.pdf", "c:\\sample.jpg", 1, 100, 100);
 }

Когда я отлаживаю веб-приложение в Visual Studio 2008, нажимая клавишу "F5", оно работает нормально (создается новый экземпляр веб-сервера). Когда я создаю приложение WindowsForm, оно тоже работает. Миниатюры генерируются.

Когда я получаю доступ к приложению через веб-браузер напрямую (http://localhoast/mywebappliation/..), оно не работает. Не создаются эскизы. Но также не выдается исключение.

Я поместил gsdll32.dll в системную папку Windows XP. Ghostscript Runtime также установлен. Я дал полный доступ в IIS-Webproject (.Net 2.0).

Кто-нибудь знает, почему я не могу получить доступ к Ghostscript из своего веб-приложения? Есть ли какие-либо проблемы безопасности для доступа к dll-файлам на IIS-сервере?

Приветствие Клаус

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Попробуйте изменить текущий каталог

string workingDirectory = @"C:\tmp";
Directory.SetCurrentDirectory(workingDirectory);
GhostscriptWrapper.GeneratePageThumb("c:\\sample.pdf", "c:\\sample.jpg", 1, 100, 100);
1 голос
/ 30 марта 2010

Теперь у меня есть обходной путь. У меня нет доступа к Ghostscript с помощью GhostscriptWrapper-Class. Вместо этого я получаю доступ к cmd.exe на сервере напрямую. Следующий метод принимает команду (синтаксис ghostscript) и запускает ее в cmd.exe. Для этого я использовал следующий метод:

public static string runCommand(string workingDirectory, string command)
    { 
        // Create the ProcessInfo object
        System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe");
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardInput = true;
        psi.RedirectStandardError = true;
        psi.WorkingDirectory = workingDirectory;

        // Start the process
        System.Diagnostics.Process proc = System.Diagnostics.Process.Start(psi);

        // Attach the output for reading
        System.IO.StreamReader sOut = proc.StandardOutput;

        // Attach the in for writing
        System.IO.StreamWriter sIn = proc.StandardInput;

        sIn.WriteLine(command);

        // strm.Close();

        // Exit CMD.EXE
        string stEchoFmt = "# {0} run successfully. Exiting";

       // sIn.WriteLine(String.Format(stEchoFmt, targetBat));
        sIn.WriteLine("EXIT");

        // Close the process
        proc.Close();

        // Read the sOut to a string.
        string results = sOut.ReadToEnd().Trim();

        // Close the io Streams;
        sIn.Close();
        sOut.Close();

        // Write out the results.
        string fmtStdOut = "<font face=courier size=0>{0}</font>";
        return String.Format(fmtStdOut, results.Replace(System.Environment.NewLine, "<br>"));
    }
0 голосов
/ 30 марта 2010

Возможно, что удостоверение, под которым вы запускаете веб-сайт, не имеет разрешения на запись для c: \

...