java - "ps: stack underflow" 将 postscript 直接发送到网络打印机时

java - "ps: stack underflow" when sending postscript directly to network printer

我写了一段 Java 代码来通过 Socket 将 PDF 转换的 postscript 脚本发送到网络打印机。

文件打印时形状完美,但每份作业都带有一或两页额外的文本,如 ps: stack underflowerror 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();
    }

无论实际内容有多少,您都将整个缓冲区写入输出流。 这意味着当你最后一次写入缓冲区时,它很可能在缓冲区末尾有一堆来自上一次迭代的内容。

例子

例如假设您有以下文件并且使用大小为 10 的缓冲区:

 1234567890ABCDEF

在第一次 inputStream.read() 调用后,它将 return 10 并且在缓冲区中你将拥有:

 1234567890

在第二次 inputStream.read() 调用后它将 return 6 并且在缓冲区中你将有:

 ABCDEF7890

第三次 inputStream.read() 调用后,它将 return -1 并且您将停止阅读。

打印机套接字最后会收到这些数据:

1234567890ABCDEF7890

这里最后的7890是打印机不理解的额外位,但它可以成功解释第一个1234567890ABCDEF

修复

您应该考虑 return 由 inputStream.read() 编辑的长度:

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

也可以考虑使用 try-with-resources 来避免未关闭流的问题。