慢速java打印-DocPrintJob
我开发了一个Java桌面程序,该程序使用热敏打印机,代码如下:慢速java打印-DocPrintJob,java,printing,Java,Printing,我开发了一个Java桌面程序,该程序使用热敏打印机,代码如下: /** * printableObject extends Printable */ public static boolean print(Object printableObject, String printer_name) throws InterruptedException { InputStream printerTest = new ByteArrayInputStream("".getBytes());
/**
* printableObject extends Printable
*/
public static boolean print(Object printableObject, String printer_name) throws InterruptedException {
InputStream printerTest = new ByteArrayInputStream("".getBytes());
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(printableObject, DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
Doc docTest = new SimpleDoc(printerTest, flavor, null);
HashPrintServiceAttributeSet aset = new HashPrintServiceAttributeSet();
PrintRequestAttributeSet rset = new HashPrintRequestAttributeSet();
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
PrinterName printer = new PrinterName(printer_name, null);
rset.add(OrientationRequested.PORTRAIT);
rset.add(MediaSizeName.INVOICE);
aset.add(printer);
services = PrintServiceLookup.lookupPrintServices(null, aset);
if (!priterIsReady(services[0], 5)) {
return false;
}
if (services != null) {
try {
DocPrintJob docPrintJobTest = services[0].createPrintJob();
docPrintJobTest.print(docTest, rset);
if (!priterIsReady(services[0], 5)) {
return false;
}
DocPrintJob job = services[0].createPrintJob();
job.print(myDoc, rset);
Thread.sleep(300);
if (priterIsReady(services[0], 5)) {
DocPrintJob job2 = services[0].createPrintJob();
job2.print(docTest, rset);
return priterIsReady(services[0], 5);
} else {
return false;
}
} catch (ArrayIndexOutOfBoundsException ex) {
ex.printStackTrace();
} catch (PrintException pe) {
pe.printStackTrace();
}
}
return false;
}
public static boolean priterIsReady(PrintService printer, int max) throws InterruptedException {
int count = 0;
while (count < max) {
AttributeSet att = printer.getAttributes();
for (Attribute a : att.toArray()) {
String attributeName;
String attributeValue;
attributeName = a.getName();
attributeValue = att.get(a.getClass()).toString();
if (attributeName.equals("queued-job-count")) {
if (Integer.valueOf(attributeValue) == 0) {
return true;
} else {
System.err.println(">>> queued-job-count: " + Integer.valueOf(attributeValue));
}
}
}
Thread.sleep(600 + 600 / 5 * count);
count = count + 1;
}
return false;
}
/**
*可打印对象扩展了可打印对象
*/
公共静态布尔打印(Object printableObject,String printer_name)引发InterruptedException{
InputStream printerTest=新的ByteArrayInputStream(“.getBytes()”);
DocFlavor=DocFlavor.INPUT\u STREAM.AUTOSENSE;
Doc myDoc=new SimpleDoc(可打印对象,DocFlavor.SERVICE\u FORMATTED.PRINTABLE,null);
Doc docTest=new SimpleDoc(printerTest,flavor,null);
HashPrintServiceAttributeSet aset=新的HashPrintServiceAttributeSet();
PrintRequestAttributeSet rset=新的HashPrintRequestAttributeSet();
PrintService[]services=PrintServiceLookup.lookupPrintServices(null,null);
PrinterName printer=新的PrinterName(打印机名称,空);
rset.add(方向请求的肖像);
rset.add(MediaSizeName.INVOICE);
aset.add(打印机);
服务=PrintServiceLookup.lookupPrintServices(null,aset);
如果(!priterisrady(服务[0],5)){
返回false;
}
if(服务!=null){
试一试{
DocPrintJob docPrintJobTest=服务[0]。createPrintJob();
打印(docTest,rset);
如果(!priterisrady(服务[0],5)){
返回false;
}
DocPrintJob作业=服务[0]。createPrintJob();
作业打印(myDoc,rset);
睡眠(300);
if(优先级(服务[0],5)){
DocPrintJob job2=服务[0]。createPrintJob();
作业2.打印(博士测试、资源测试);
返回优先级日(服务[0],5);
}否则{
返回false;
}
}捕获(阵列索引边界外异常){
例如printStackTrace();
}捕获(打印异常pe){
pe.printStackTrace();
}
}
返回false;
}
公共静态布尔优先级READY(PrintService打印机,int max)引发中断异常{
整数计数=0;
同时(计数<最大值){
AttributeSet att=printer.getAttributes();
for(属性a:att.toArray()){
字符串属性名;
字符串属性值;
attributeName=a.getName();
attributeValue=att.get(a.getClass()).toString();
if(attributeName.equals(“排队作业计数”)){
if(Integer.valueOf(attributeValue)==0){
返回true;
}否则{
System.err.println(“>>>队列作业计数:”+Integer.valueOf(attributeValue));
}
}
}
线程睡眠(600+600/5*计数);
计数=计数+1;
}
返回false;
}
该代码在我的IDE或使用jar(java 1.8.0_73)时都能完美工作。印刷速度很快。但使用另一个配置类似的笔记本电脑(i7、8GB、Windows10)时,我遇到了一个问题:开始打印需要10秒以上。相同的JAR和相同的打印机,但java 1.8.0_101。在此期间,文档处于打印队列中。我用了另一个笔记本(i5,8GB,Windows10),我也有同样的延迟 我更改了上述代码,并尝试在不检查打印机是否准备就绪或打印测试的情况下打印,但问题仍然存在 有人经历过这个问题吗?
是否有其他方法可以打印可打印对象?在此期间,文档在打印队列中,因此不是Java问题。检查你的打印机驱动程序,它是我的主要嫌疑犯。但对于Windows 10,它是相同的64位驱动程序。另一个嫌疑犯是Java版本。我会寻找另一种打印方式,我找不到解决方案。但我认为这不会改变任何事情。在这段时间里,文档在打印队列中,这不是Java的问题。检查你的打印机驱动程序,它是我的主要嫌疑犯。但对于Windows 10,它是相同的64位驱动程序。另一个嫌疑犯是Java版本。我会寻找另一种打印方式,我找不到解决方案。但我认为这不会改变任何事情。