Java GhostScript:gswin32c挂起,但gswin32可以工作

Java GhostScript:gswin32c挂起,但gswin32可以工作,java,ghostscript,Java,Ghostscript,我们正在使用GhostScript 9.06使用以下命令将PDF文件转换为TIFF文件: gswin32c-dNOPAUSE-sDEVICE=tiff24nc-r300-sCompression=lzw-sOutputFile=“C:/destination.tif”“C:/source.pdf”-C退出 这是通过Java在运行大多数批处理工具的Windows服务器上执行的 这对于我们的大部分文件都很有效,但对于某些文件,进程只是挂起,任务管理器显示gswin32c.exe进程使用了0%的CPU

我们正在使用GhostScript 9.06使用以下命令将PDF文件转换为TIFF文件:

gswin32c-dNOPAUSE-sDEVICE=tiff24nc-r300-sCompression=lzw-sOutputFile=“C:/destination.tif”“C:/source.pdf”-C退出

这是通过Java在运行大多数批处理工具的Windows服务器上执行的

这对于我们的大部分文件都很有效,但对于某些文件,进程只是挂起,任务管理器显示gswin32c.exe进程使用了0%的CPU。我们已经在一分钟后终止了该进程,如果GhostScript没有响应,则使用PDFBox转换PDF


当使用相同的命令,但使用
gswin32
工具时,转换效果非常好,不需要每次执行命令时打开和关闭GUI窗口。因此,使用
gswin32
不是一个选项,因为人们经常在服务器上工作。

而不是“-c quit”将-dBATCH添加到命令行。除非您的PDF文件都是单页文件,否则您可能还希望在输出文件名中添加“%d”。

此问题与Ghostscript无关。使用ProcessBuilder运行的每个程序都会出现问题,ProcessBuilder会将输出发送到Standard out。由于Windows缓冲区仅限制文本量,当您不读取java程序中的输出时,调用的进程将挂起。因此,当转换为pdf只会生成少量状态消息时,您可以成功运行gswin32c。但是,当您转换一个包含许多页面的文件时,该过程将挂起。解决方案是在Java程序中读取被调用进程的输出

    ProcessBuilder processBuilder = new ProcessBuilder(
    "C:\\Program Files (x86)\\gs\\gs9.10\\bin\\gswin32c.exe", "-sDEVICE=\"pdfwrite\"",
    "-dNOPAUSE", "-dBATCH", "-dSAFER", "-dQUIET", "-sOUTPUTFILE=\"" + fileName + ".pdf\"", "\""
    + fileName + ".ps\"");
processBuilder.redirectErrorStream(true); //Redirect Error Stream to Standard Inputstream so that we have to read only Standard in
Process process = processBuilder.start();
InputStream is = process.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = rd.readLine()) != null) {
    System.out.println(line);
}
rd.close();
process.waitFor();

根据GS文档,dBATCH相当于将-c quit放在命令行的末尾。我们还希望将每个pdf转换为单个tiff文件。不管怎样,我尝试了你的建议,但这个过程仍然挂起。如果你能提供一个文件来查看,你可以将它作为一个bug报告打开,在没有看到问题文件的情况下,我真的不能再说什么了。我仍然不会使用'-c quit',因为这是PostScript,您正在执行一个PDF文件。感谢您的建议,但不幸的是,我们正在转换的文档是法律文档,我们无权共享(甚至无法打开它们)。作为临时解决方案,现在我们启动
gswin32
进程。也许您可以要求某人使用相同的进程创建一个安全文件,并共享该文件。老实说,我看不出tihs会发生什么情况,因为这两个应用程序实际上是完全相同的。当我用一个简单的.ps文件尝试您的命令时,它在我的机器上运行得很好,9.0.4并且没有挂起。试着减少这个问题。请尝试使用其他.pdf文件或简单的.ps文件。与其使用-r300,不如尝试使用-r72。试着不要用-sCompression。使用不同于tiff24nc的设备进行尝试。将.pdf复制到gsbin目录,只需运行source.pdf文件,而不是引用的“c:/source.pdf”文件,目的地也一样,并直接在dos目录中运行该命令。尝试运行gswin32c source.pdf。