我在上一篇文章中介绍了Java调用条码打印机的相关方法,但是在实际生产环境中发现了一些问题,于是在此给出解决办法。
上一个Demo存在的一些问题包括:
1.打印浓度和宽度必须在打印机控制面板设置;
2.主机新添加的打印机获取不到;
3.严重:当某些中文字符无法打印时会终止程序。
4.添加了一个getMessage方法来获取打印结果。
第一个问题,只要在打印指令中加入~SDa和^PWa来控制打印深度和宽度即可。
第二个问题我采用了多种方法均无效,最终在一篇文章中偶然提到的一个在PrintServiceLookup.lookupPrintServices之前执行AppContext.getAppContext().put(PrintServiceLookup.class.getDeclaredClasses()[0], null)就能够解决问题。
第三个问题,通过try...catch捕获异常,并且替换掉这个无法打印的字符就行了。
完整的Demo如下
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.standard.PrinterName;
import sun.awt.AppContext;
/**
* 采用点阵字库ts24.lib
* @author Labrador
*
*/
public class ZplPrinter {
private String printerURI = null; //打印机完整路径
private PrintService printService = null; //打印机服务
private byte[] dotFont;
private String darkness = "~SD22"; //Set Darkness设置色带颜色的深度 0-30
private String width = "^PW1200"; //Print Width打印宽度0-1500
private String length = "^LL800"; //Label Length标签长度0-x(暂无作用)
private String begin = "^XA" + darkness + width; //标签格式以^XA开始
private String end = "^XZ"; //标签格式以^XZ结束
private String content = ""; //打印内容
private String message = ""; //打印的结果信息
/**
* 构造方法
* @param printerURI 打印机路径
*/
public ZplPrinter(String printerURI){
this.printerURI = printerURI;
//加载字体
File file = new File("C://ts24.lib");
if(file.exists()){
FileInputStream fis;
try {
fis = new FileInputStream(file);
dotFont = new byte[fis.available()];
fis.read(dotFont);
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}else{
System.out.println("C://ts24.lib文件不存在");
}
//初始化打印机
AppContext.getAppContext().put(PrintServiceLookup.class.getDeclaredClasses()[0], null);//刷新打印机列表
PrintService[] services = PrintServiceLookup.lookupPrintServices(null,null);
if (services != null && services.length > 0) {
for (PrintService service : se