我写了一段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
答案 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来避免未关闭流的问题。