2012-09-10 202 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