gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:18:14 26 4
gpt4 key购买 nike

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

这些文件以完美的形状打印,但每个作业都附带一到两页额外的页面,其中包含诸如 ps:堆栈下溢错误未定义的违规命令 之类的文本。

一开始我以为 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();
}

最佳答案

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

示例

例如假设您有以下文件并且使用大小为 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 来避免未关闭流的问题。

关于java - "ps: stack underflow"将 postscript 直接发送到网络打印机时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48772753/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com