【问题标题】:java - "ps: stack underflow" when sending postscript directly to network printerjava - 将postscript直接发送到网络打印机时出现“ps:堆栈下溢”
【发布时间】:2018-07-24 04:10:48
【问题描述】:

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

文件以完美的形状打印,但每个作业都带有一到两页额外的页面,其中包含ps: stack underflowerror undefined offending command 等文本。

一开始我认为 PDF2PS 过程有问题,所以我尝试了来自 PS Files 的 2 个 PS 文件。但问题仍然存在。

我还使用 GhostView 验证了 ps 文件。现在我认为代码可能有问题。该代码不会引发任何异常。

Toshiba 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();
    }

【问题讨论】:

    标签: java printing java-print


    【解决方案1】:

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

    示例

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

     1234567890ABCDEF
    

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

     1234567890
    

    在第二次inputStream.read() 调用后,它将返回6 并且在缓冲区中您将拥有:

     ABCDEF7890
    

    在第三次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 来避免未关闭的流出现问题。

    【讨论】:

    • 你是我的英雄!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2011-06-24
    相关资源
    最近更新 更多