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 プロセスが CPU の 0% を使用していることを示します。GhostScript が応答しない場合は、1 分後にプロセスを強制終了し、代わりに PDFBox を使用して PDF を変換するという手段にすでに頼っています。

同じコマンドをgswin32ツールで使用すると、変換は完全に機能しますが、コマンドが実行されるたびに GUI ウィンドウを開いたり閉じたりするという事実はありません。gswin32このため、人々は常にサーバーで作業しているため、使用することはできません。

4

2 に答える 2

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 に答える
1

'-c quit' の代わりに -dBATCH をコマンド ラインに追加します。PDF ファイルがすべて単一ページでない限り、おそらく出力ファイル名にも '%d' を追加したいと思うでしょう。

于 2013-02-14T08:36:04.973 に答える