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

时间:2018-02-13 17:51:43

标签: java printing java-print

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

文件打印得很完美,但每个作业都附带一个或两个额外页面,其中包含<script> alert('<%= Label1.ClientID %>'); </script> PROCEDURE `name` (`var1` SMALLINT(6), `var2` SMALLINT(6)) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a SMALLINT(6); DECLARE cur CURSOR FOR SELECT id FROM tableA WHERE fk_id = var2; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP IF done THEN LEAVE read_loop; END IF; FETCH cur INTO a; INSERT INTO tableB VALUES(var1, a); END LOOP; CLOSE cur; 等文字。

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

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

打印机东芝e-studion 5005AC支持PS3和PCL6。

ps: stack underflow

1 个答案:

答案 0 :(得分:1)

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

实施例

e.g。想象你有以下文件,并使用大小为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来避免未关闭流的问题。