2010-03-24 3 views
2

Я использую оболочку ghostscriptsharp для C# и ghostscript. Я хочу генерировать эскизы из pdf-файлов. Дополнительная информация о образце-коде дана here.Использование Ghostscript в веб-приложении (PDF Thumbnails)

Существуют различные методы импорта из 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 для создания эскизов в WebApplication (.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-сервере?

Привет Клаус

ответ

1

теперь у меня есть обходной путь. Я не обращаюсь к 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

Ее возможно, что личность вы работаете на веб-сайт под не имеет права на запись для C: \

+0

Я дал всем возможным пользователям (iis user, aspnetuser и т. Д.) Права на запись для c: \, gsdll32.dll, gs.exe, ... но это не сработало. –

+0

Вам нужно будет поместить gsdll32.dll в папку bin webs. – Adrian

2

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

string workingDirectory = @"C:\tmp"; 
Directory.SetCurrentDirectory(workingDirectory); 
GhostscriptWrapper.GeneratePageThumb("c:\\sample.pdf", "c:\\sample.jpg", 1, 100, 100);