GhostScript:gswin32c挂起,但gswin32有效

时间:2013-02-13 17:34:43

标签: java ghostscript

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

gswin32c -dNOPAUSE -sDEVICE=tiff24nc -r300 -sCompression=lzw -sOutputFile="C:/destination.tif" "C:/source.pdf" -c quit

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

这适用于我们的大部分文件,但是对于某些文件,进程只是挂起而且任务管理器显示gswin32c.exe进程正在使用0%的CPU。我们已经使用了一分钟后杀死该过程,并使用PDFBox转换PDF,如果GhostScript无法响应。

使用相同的命令,但使用gswin32工具时,转换工作正常,减去每次执行命令时打开和关闭GUI窗口的事实。因此,使用gswin32不是一种选择,因为人们不断地在服务器上工作。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

此问题与Ghostscript无关。您将遇到使用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();