1

PDF から変換された PostScript スクリプトを Socket 経由でネットワーク プリンタに送信するための Java コードを作成しました。

ps: stack underflowファイルは完璧な形で印刷されましたが、すべてのジョブには、やのようなテキストを含む余分なページが 1 つか 2 つ付いていますerror undefined offending command

最初は PDF2PS プロセスに何か問題があると思ったので、このPS Filesから 2 つの PS ファイルを試しました。しかし、問題はまだ残っています。

また、GhostView で ps ファイルを確認しました。今、コードに何か問題があるのではないかと思います。コードは例外をスローしません。

プリンタ 東芝 e-studion 5005AC は PS3 と PCL6 に対応しています。

    File file = new File("/path/to/my.ps");

    Socket socket = null;
    DataOutputStream out = null;
    FileInputStream inputStream = null;
    try {
        socket = new Socket(printerIP, printerPort);
        out = new DataOutputStream(socket.getOutputStream());
        DataInputStream input = new DataInputStream(socket.getInputStream());
        inputStream = new FileInputStream(file);
        byte[] buffer = new byte[8000];

        while (inputStream.read(buffer) != -1) {
            out.write(buffer);

        }

        out.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
4

1 に答える 1

1

実際のコンテンツの量に関係なく、バッファ全体を出力ストリームに書き込んでいます。つまり、最後にバッファーを書き込むと、バッファーの最後に前回の反復からのコンテンツが大量に含まれる可能性が高くなります。

たとえば、次のファイルがあり、サイズ 10 のバッファを使用しているとします。

 1234567890ABCDEF

最初のinputStream.read()呼び出しの後、戻り10、バッファには次のようになります。

 1234567890

2回目のinputStream.read()呼び出しの後、戻り6、バッファには次のようになります。

 ABCDEF7890

3回目のinputStream.read()呼び出しの後、戻っ-1てきて、読むのをやめます。

プリンター ソケットは、最終的にこれらのデータを受け取ります。

1234567890ABCDEF7890

ここで、最後の7890ビットはプリンターが理解できない余分なビットですが、最初のビットは正常に解釈でき1234567890ABCDEFます。

修理

によって返される長さを考慮する必要がありますinputStream.read()

        byte[] buffer = new byte[8000];
        for (int length; (length = inputStream.read(buffer)) != -1; ){
            out.write(buffer, 0, length);
        }

また、クローズされていないストリームの問題を回避するために、try-with-resources の使用を検討してください。

于 2018-02-13T19:49:38.250 に答える