GhostScript:gswin32c 挂起,但 gswin32 有效
Posted
技术标签:
【中文标题】GhostScript:gswin32c 挂起,但 gswin32 有效【英文标题】:GhostScript: gswin32c hangs, but gswin32 works 【发布时间】:2013-02-13 17:34:42 【问题描述】:我们正忙于使用 GhostScript 9.06 使用以下命令将 PDF 文件转换为 TIFF 文件:
gswin32c -dNOPAUSE -sDEVICE=tiff24nc -r300 -sCompression=lzw -sOutputFile="C:/destination.tif" "C:/source.pdf" -c quit
这是通过 Java 在运行我们大多数批处理工具的 Windows 服务器上执行的。
这对我们的大部分文件都很有效,但对于某些文件,进程只是挂起,任务管理器显示 gswin32c.exe 进程正在使用 0% 的 CPU。如果 GhostScript 无法响应,我们已经在一分钟后终止该进程并使用 PDFBox 转换 PDF。
使用相同的命令,但使用gswin32
工具时,转换工作完美,减去每次执行命令时都会打开和关闭 GUI 窗口的事实。因此,使用gswin32
不是一个选项,因为人们一直在服务器上工作。
【问题讨论】:
当我用一个简单的 .ps 文件尝试你的命令时,它在我的机器上运行良好,使用 9.0.4 并且没有挂起。尝试减少问题。尝试使用不同的 .pdf 文件或简单的 .ps 文件。而不是 -r300,请尝试 -r72。尝试不使用 -sCompression。尝试使用与 tiff24nc 不同的设备。将 .pdf 复制到 gsbin 目录,然后只运行文件 source.pdf 而不是引用的“c:/source.pdf”,对于目标也是如此,然后直接在 dos 目录中运行命令。尝试运行 gswin32c source.pdf。 【参考方案1】:在命令行中添加 -dBATCH 而不是 '-c quit'。除非您的 PDF 文件都是单页,否则您可能还想在输出文件名中添加一个 '%d'。
【讨论】:
根据GS文档,dBATCH相当于把-c quit放在命令行末尾。我们还希望将每个 pdf 转换为单个 tiff 文件。无论如何,我尝试了您的建议,但过程仍然挂起。 好吧,如果您可以提供一个文件供您查看,您可以在bugs.ghostscript.com 处将其作为错误报告打开,如果没有看到问题文件,我真的无话可说。我仍然不会使用“-c quit”,因为那是 PostScript,而您正在执行 PDF 文件。 感谢您的建议,但不幸的是,我们正在转换的文件是合法文件,我们无权分享(甚至打开它们)。现在作为临时解决方案,我们将gswin32
进程最小化。
也许您可以要求某人使用相同的过程创建一个安全文件,然后共享它。老实说,我看不出这种情况应该发生的任何方式,因为这两个应用程序实际上是相同的。【参考方案2】:
这个问题与 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();
【讨论】:
以上是关于GhostScript:gswin32c 挂起,但 gswin32 有效的主要内容,如果未能解决你的问题,请参考以下文章