java - "ps: stack underflow" 将 postscript 直接发送到网络打印机时
java - "ps: stack underflow" when sending postscript directly to network printer
我写了一段 Java 代码来通过 Socket 将 PDF 转换的 postscript 脚本发送到网络打印机。
文件打印时形状完美,但每份作业都带有一或两页额外的文本,如 ps: stack underflow
或 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();
}
无论实际内容有多少,您都将整个缓冲区写入输出流。
这意味着当你最后一次写入缓冲区时,它很可能在缓冲区末尾有一堆来自上一次迭代的内容。
例子
例如假设您有以下文件并且使用大小为 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 来避免未关闭流的问题。
我写了一段 Java 代码来通过 Socket 将 PDF 转换的 postscript 脚本发送到网络打印机。
文件打印时形状完美,但每份作业都带有一或两页额外的文本,如 ps: stack underflow
或 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();
}
无论实际内容有多少,您都将整个缓冲区写入输出流。 这意味着当你最后一次写入缓冲区时,它很可能在缓冲区末尾有一堆来自上一次迭代的内容。
例子
例如假设您有以下文件并且使用大小为 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 来避免未关闭流的问题。