需求:
通过html调用本地服务启动打印机,带参数去打印不同内容。
步骤:
1. 生成可直接执行的exe程序。
2. 注册服务。
3. 前端调用测试。
1. 生成可直接执行的exe程序
1.1 前提:代码测试已经通过,可看我的另一篇文章(含代码)。
1.2 按如图步骤生成jar文件
如上图所示,生成了PrintLaben.jar的文件。
1.3 按如图步骤生成exe文件
① 先将exe4j软件下载安装
链接:https://pan.baidu.com/s/11p3jewLX4tSkxCXzOAbhWA
提取码:wg8j
一直下一步即可安装完成。
② 打开exe4j软件,按照该视频可进行操作,注意一定要生成没有java,带jre的exe运行程序。如何将idea的java程序打包成exe (新版,可以在没有java的电脑下运行)_哔哩哔哩_bilibili
③ 经过②步骤,拿到exe文件跟jre的文件夹,保持在同一目录下面,再把这个TSCLIB.dll的打印机本地函数库放到同一目录下,这个库可以TODO一篇文章中获取。
2. 注册服务
2.1 新建一个print.reg的注册服务文件
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\print]
@="print"
"URL Protocol"=""[HKEY_CLASSES_ROOT\print\DefaultIcon]
@="D:\\develope\\washPrint\\PrintLabel.exe"[HKEY_CLASSES_ROOT\print\shell]
@=""[HKEY_CLASSES_ROOT\print\shell\open]
@="" [HKEY_CLASSES_ROOT\print\shell\open\command]
@="\"D:\\develope\\washPrint\\PrintLabel.exe\" \"%1\" "
如上图所示,其中
D:\\develope\\washPrint\\PrintLabel.exe : 是你生成的exe程序的全路径地址
\"%1\" :是代表可以带参数
2.2 新建后双击该文件
确认即可,打开cmd窗口,输入regedit打开,如下图所示
如上图所示,即注册成功
2.3 打开浏览器,输入print://即可调用到PrintLabel.exe程序。
3. 前端调用程序
<a href="" id="printLinks"><el-button type="primary">打印</el-button></a>
这里的需求是,带过去的参数是变化的,所以在JS中采用下列代码获取,但是注意这里要在点击这个打印前去做设置,不然传过去的参数就是空。
var a = document.getElementById('printLinks')a.setAttribute('href', '你需要设置的内容')
中文乱码问题(通过加解密算法解决):
用了好多方式都有问题:索性就是在前端出发带参数将内容进行加密
//引入加密板块
import CryptoJS from 'crypto-js/crypto-js'//加密板块代码
const key = '1111122222333334'
var secret = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(printContent), CryptoJS.enc.Utf8.parse(key), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString()
在打印的时候进行解密
//解密的依赖
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version>
</dependency>//密钥 前后台一致16位
private static final String KEY = "1111122222333334";
//参数分别代表 算法名称/加密模式/数据填充方式
private static final String ALGORITHMESTR = "AES/ECB/PKCS5Padding";//解密算法public static String desEncrypt(String data) throws Exception {//decode解密//让程序自动创建keyGenerator对象,并告诉其用AES处理KeyGenerator kgen = KeyGenerator.getInstance("AES");//告诉秘钥生成器处理模式是128bit,也就是16位kgen.init(128);//拿到秘钥,KEY是我们刚刚定义的SecretKeySpec key1 = new SecretKeySpec(KEY.getBytes(), "AES");//创建密码器[算法名/加密模式/数据填充模式]Cipher cipher = Cipher.getInstance(ALGORITHMESTR);//表示密码器要使用key进行解码cipher.init(Cipher.DECRYPT_MODE, key1);//根据刚刚加密得到的结果,我们需要把info.getPassword字符串通过base64编码成cipher能识别的byte数组byte[] result = cipher.doFinal(Base64.decodeBase64(data));//测试通过,前后端AES一致,后端能转AES码[需要转为string]System.out.println("decode:" + new String(result, StandardCharsets.UTF_8));return new String(result, StandardCharsets.UTF_8);}