2012-09-10 252 views
1

我的問題是:我使用ghostscript將一些pdf轉換爲jpeg文件,然後將它們渲染成silverlight控件。我轉換使用PDF文件:Ghostscript崩潰服務器

public void PdfToJpg(string ghostScriptPath, string input, string output) { 
      timer1.Enabled = true; 
      //if the pdf has more than 1 file (ex. 3) then 3 jpeg files will be outputed 
      String ars = "-dNOPAUSE -sDEVICE=jpeg -r300 -o" + output + "-%d.jpeg " + input; 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      startInfo.Arguments = ars; 
      startInfo.FileName = ghostScriptPath; 
      startInfo.WindowStyle = ProcessWindowStyle.Hidden;    
      using (Process exeProcess = Process.Start(startInfo)) { 
       exeProcess.WaitForExit(); 
      }   
     } 

然後保存會話中的頁碼和到字典中的頁面的byte [],字典和一個Silverlight的支持服務發送它,並把它們發送到ASPX頁面包含Silverlight控件(使用Response.redirect(page.aspx))。一切正常,但有時服務器(卡西尼或IIS)崩潰,這意味着文件被轉換,但重定向從不發生,只是頁面保持加載狀態。我必須用「結束進程」關閉cassini或重新啓動IIS服務器,以使進程再次運行。我不認爲問題是與服務,因爲我有一個類似的過程發送到silverlight應用一個字節[]的音頻文件,一切正常,服務器永遠不會卡住,所以我認爲這是因爲ghostscript ..如果有人有任何想法。另外我使用elmah,並沒有錯誤報告...當在調試時,當我點擊視圖按鈕,其中包含轉換和其他部分的過程它不會進入點擊事件,但轉換完成(不是重定向),我不知道這怎麼可能......謝謝。所以可以肯定的是一些與ghostscript的

UPDATE: 我改變了我的代碼:

 using (Process convertProc = new Process()) { 
       convertProc.StartInfo.FileName = ghostScriptPath; 
       convertProc.StartInfo.Arguments = args; 
       //convertProc.StartInfo.UseShellExecute = false; 
       //convertProc.StartInfo.RedirectStandardOutput = true; 
       convertProc.StartInfo.CreateNoWindow = true; 
       convertProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
       convertProc.Start(); 
       ThreadedKill(convertProc.Id); 
       convertProc.PriorityClass = ProcessPriorityClass.Normal; 
       convertProc.WaitForExit(); 
       } 

如果useshellexecute和redirectoutput被註釋掉服務器變爲「野生」有時,如果沒有,代碼運行完美每次,但是這個從ghostscript進程出現的窗口,我不想那樣。爲了不出現,我必須評論這行或將useshellexecute設置爲true,並評論redirectoutput,這有時會導致失敗。我能做什麼?什麼是redirectStandardOutput和它是什麼... ...不知道在MSDN ...

更新2: 更改我的gswin64.exe gswin64c.exe爲控制檯應用程序,現在我說的窗口isn再也沒有出現。無碼瘋了......,至少目前還沒有..

+0

要解決這個問題,您可能需要提供有關錯誤的更多特定信息,例如一個堆棧跟蹤或至少一個Windows錯誤代碼的異常。事件日誌中記錄了什麼? –

+0

這是問題,沒有例外,事件查看器中沒有錯誤,沒有任何錯誤,在TaskManager中,gswin64.exe在掛起時不運行。 – adi1989

+0

GPL Ghostscript 9.06(2012-08-08)gswin64.exe – adi1989

回答

1

首先,你不需要-dNOPAUSE因爲-o意味着-dBATCH-dNOPAUSE,但它不會傷害。

此問題是否發生「間歇」?或者,如果您重複發送一個掛起(崩潰服務器?)的文件:它是否每次都掛起,或者更頻繁地掛載該特定文件?

如果這確實是間歇性的,那麼它不太可能是Ghostscript。

爲了捕捉標準輸出標準錯誤從Ghostscript的成文件,你可以添加-sstdout=___.out-sstderr=___.err,看是否Ghostscript的抱怨。如果您總是編寫相同的文件,錯誤之後的內容會告訴您是否有任何消息是由gswin * .exe生成的。

添加-Z:也會爲Ghostscript輸出添加一些時間信息。

注意,因爲你正在使用-r300爲JPEG輸出:如果Ghostscript的意外停止,就會出現在TEMP目錄兩個文件與開始,有.tmp擴展。這些是爲基於磁盤的'clist'文件創建的(300 dpi分辨率的頁面大小超過默認的-dMaxBitmap=____值8m)。

如果您在TEMP文件夾中沒有看到te_XXXXX.tmp文件的累積,那麼Ghostscript(可能)不會崩潰。

+0

TEMP目錄中沒有'te _'。tmp文件...,我發送的文件,掛起時,我發送的每個文件都沒有關係它不起作用,它轉換爲jpeg文件,但我在代碼隱藏的其餘代碼不會執行。命令應該如何? :-sstdout = file.out -sstderr = file2.err -sDEVICE = jpeg -r300 -o「+ output +」 - %d.jpeg「+ input ;, .err和.out文件應該是?can \ t在任何地方找到它們,或者是因爲gs不會產生錯誤?,現在我找到了一個完全不會被gs轉換的pdf文件,我認爲它應該顯示一些日誌或其他內容...,謝謝 – adi1989