0

我们正忙于使用 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。如果 GhostScript 无法响应,我们已经在一分钟后终止了该进程并使用 PDFBox 转换 PDF。

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

4

2 回答 2

1

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

于 2013-02-14T08:36:04.973 回答
1

这个问题与 Ghostscript 无关。您使用 ProcessBuilder 运行的每个程序都会遇到问题,它将输出发送到标准输出。由于 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();
于 2013-11-17T16:27:27.667 回答