我编写了一段Java代码,通过套接字将PDF格式的postscript脚本发送到网络打印机。
这些文件打印得很完美,但每个作业都附带一到两页额外的文本,比如ps: stack underflow
或error undefined offending command
。
一开始,我认为PDF2PS进程有问题,所以我尝试了这个PS Files中的2个PS文件。但问题仍然存在。
我还用GhostView验证了ps文件。现在我认为代码可能有问题。代码不会抛出任何异常。
这款打印机名为东芝e-Studion5005AC,支持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();
}
发布于 2018-02-13 19:49:38
您正在将整个缓冲区写入输出流,而不管有多少实际内容。这意味着当你最后一次写buffer时,它很可能在缓冲区的末尾有一堆来自上一次迭代的内容。
示例
例如,假设您有以下文件,并使用大小为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来避免未关闭的流出现问题。
https://stackoverflow.com/questions/48772753
复制相似问题