前言
说下自己的趟坑之路
最近被这个打印机忙的焦头烂额
对于没有硬件任何经验的人来说,一开始是蒙的,热敏打印机根据模板打印出小票来?不都是配套的么,?还需要我们开发?
第一天 按部就班来,?安装驱动,然后搜索网上一大堆,大部分也是?java?awt绘制图打印,?最后打印出来了也有二维码,也可以选择哪个打印机来打印,如代码:
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import java.awt.*;
import java.awt.print.*;
public class Prient {
public static void main(String[] args) {
int height = 250;
// 通俗理解就是书、文档
Book book = new Book();
// 打印格式
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT);
// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper p = new Paper();
p.setSize(height-20, height);
p.setImageableArea(0, 0, height-20, height);
pf.setPaper(p);
// 把 PageFormat 和 Printable 添加到书中,组成一个页面
book.append((g, pageFormat, page) -> {
if (page > 0) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(new Font("Default", Font.PLAIN, 14));
g2d.drawString("等位排单号", 50, 10);
g2d.drawString("-------------------------------------", 7, 20);
g2d.drawString("手机号码:" + "11111111111", 7, 35);
g2d.drawString("领号日期:" + "11111", 7, 65);
g2d.drawString("-------------------------------------", 7, 80);
g2d.setFont(new Font("Default", Font.PLAIN, 25));
g2d.drawString("小号", 7, 105);
g2d.setFont(new Font("Default", Font.PLAIN, 14));
g2d.drawString("您之前还有" + 5 + "桌客人在等待", 7, 130);
g2d.drawImage(QrCodeUtils.creatRrCode("http://baidu.com",120,120),50,140,null);
return Printable.PAGE_EXISTS;
}, pf);
// // 设置打印属性
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(1));// 打印份数
// 查找所有打印服务
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, aset);
// 将所有查找出来的打印机与自己想要的打印机进行匹配,找出自己想要的打印机
PrintService myPrinter = null;
for (int i = 0; i < services.length; i++) {
// System.out.println("service found: " + services[i]);
String svcName = services[i].toString();
if (svcName.contains("80C")) { // 指定打印机
//if (svcName.contains("AYZN_Print")) { // 指定打印机
//if (svcName.contains("ZMIN X1i")) { // 指定打印机
System.out.println("OK");
myPrinter = services[i];
}
}
// 获取打印服务对象
PrinterJob job = PrinterJob.getPrinterJob();
// 获取打印服务对象
if (myPrinter != null) {
try {
job.setPrintService(myPrinter);
// 设置打印类
job.setPageable(book);
// 打印
// System.out.println("--》打印数据");
job.print();
} catch (Exception pe) {
pe.printStackTrace();
}
} else {
System.out.println("no printer services found");
}
}
}
但是仔细一想,?我如此这般,那么以后我的服务端是不是也得安装驱动,?于是下了linux驱动安装一个服务器,百般艰难,如果我以后如此部署,简直要我命呀
第二天 于是找另外一个路子,想到是不是可以不用驱动就可以打印呢,?我当时觉得有点异想天开,没想到一搜真可以,?我先去官网下载了一个c++的dll文件,动态库,?如代码
import com.sun.jna.Library;
import com.sun.jna.Native;
public class CallMain
{
//动态库类
public interface DllInterface extends Library
{
DllInterface INSTANCE = (DllInterface)Native.loadLibrary("E:\\JsPrinterDll_64.dll", DllInterface.class);
int uniConnectNetPortByIp(String ip, int port, int timeout);
int uniWrite(int i, String content, int size);
int uniTwobarCodes(int fs, String content, int nZoomIn, int nErrorLevel, int bCut);
int uniselectCharacterSize(int i, int n);
Boolean uniClose(int i);
Boolean uniInitNetSev();
Boolean uniCloseNetServ();
int uniselectChineseCharModel(int i);
int uniprintAndFeedLine(int i);
}
public static void main(String[] args)
{
System.out.println("---------1.简单调用-----------");
DllInterface instance = DllInterface.INSTANCE;
Boolean init = instance.uniInitNetSev();
int con = instance.uniConnectNetPortByIp("10.1.50.115",9100, 5000);
if (con > 0) {
int si = instance.uniselectCharacterSize(con,100010);
int ch = instance.uniselectChineseCharModel(con);
String a = "aaaa";
instance.uniWrite(con, a, a.length());
// instance.uniTwobarCodes(con, "https://www.baidu.com",7,1,0);
instance.uniWrite(con, "\n\n\n\n\n\n\n\n", 8);
boolean b= instance.uniClose(con);
}
boolean c =instance.uniCloseNetServ();
}
}
然后调用类库中的函数,说说遇到的问题,?字体无法放大,不切纸,无法打印汉子,乱码等等,当然应该有解决方案,有些函数我应该没找到,慢慢的一个在解决,最后逐渐崩溃
第三天?不甘心如此这般,继续寻找度娘寻求帮助,还可以socket,拿来一试,妈呀,输出Writer,这不就是所期待的么,?要啥出啥,在去官网下载编程手册,对照写各种想要的,真是皇天不负有心人
正文
根据官方文档编写自定模板,授人以鱼不如授人以渔,后附工具类
去xprinter官网下载开发文档中的编程手册,打开如图
则对应代码:
public void setUnderline(int val) throws IOException {
writer.write(0x1B);//16进制码
writer.write("-");//2D 也可
writer.write(val);//n的值,当然48/49/50 也可
writer.flush();
}
?其他的详细看文档写出你想要的模板来
不多说了,?剩下的自己研究吧~
附工具类,连接打印机, 并常用模板 打印小票工具类
|