Java代码提交打印任务滞留队列无法打印,其他应用打印正常
问题原因排查
- DocFlavor配置错误:你当前使用
javax.print.DocFlavor.BYTE_ARRAY.AUTOSENSE提交纯文本字节流,HP Deskjet 3512这类消费级喷墨打印机本身对原始纯文本字节的兼容性极差,AUTOSENSE无法自动识别你提交的纯文本格式,而其他办公软件提交的是已经光栅化处理的打印内容,所以可以正常输出。 - 打印属性集为空:你传入的
HashPrintRequestAttributeSet没有指定任何打印参数(包括纸张规格、色彩模式、边距等),打印机拿到不符合预期的空参数集后会直接挂起任务不会执行打印。 - 字符编码不匹配:直接调用
printText.getBytes()使用操作系统默认编码生成字节流,打印机的纯文本解码规则和系统编码不一致时,也会导致任务卡住不执行。
修复方案
将纯文本转换为可被打印机通用识别的打印格式,同时补充必要的打印参数,修复后参考代码如下:
import javax.print.*; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.standard.*; import java.awt.*; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterJob; public class PrintTest { public static void main(String[] args) { try { // 指定要打印的文本 String printText = "Hello World"; // 获取默认打印服务 PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); PrinterJob printerJob = PrinterJob.getPrinterJob(); printerJob.setPrintService(printService); // 配置打印参数 HashPrintRequestAttributeSet attrSet = new HashPrintRequestAttributeSet(); attrSet.add(MediaSizeName.ISO_A4); // 指定A4纸 attrSet.add(PrintQuality.NORMAL); // 指定普通打印质量 attrSet.add(OrientationRequested.PORTRAIT); // 指定纵向打印 // 实现Printable接口绘制文本内容 printerJob.setPrintable(new Printable() { @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { if (pageIndex > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); g2d.setFont(new Font("宋体", Font.PLAIN, 12)); g2d.drawString(printText, 100, 100); // 坐标控制文本打印位置 return PAGE_EXISTS; } }); // 提交打印 printerJob.print(attrSet); System.out.println("打印任务提交成功"); } catch (Exception e) { e.printStackTrace(); } } }
如果仍有问题可以额外添加校验逻辑确认打印服务是否匹配你的HP Deskjet 3512设备,避免代码选错默认打印机。
内容的提问来源于stack exchange,提问作者adcrown
相关产品推荐
相关产品推荐

