接下来就想为什么汉字是乱码呢?是command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);里面的汉字需要转码吗?
对照jpPrinter.addCommand里面把原来的转码去掉了,如果在command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);中把汉字转成unico呢,试了试也不行。
把jpPrinter.addCommand恢复回去,
jpPrinter.addCommand = function(content) {
// 将指令转成数组装起;
var code = new encode.TextEncoder("gb18030", {
NONSTANDARD_allowLegacyEncoding: true,
}).encode(content);
for (var i = 0; i < code.length; ++i) {
command.push(code[i]);
}
// command = command + content;
};
还是会报错,throw new TypeError(‘first argument must be a string or Buffer’);
然后仔细一看,原来data复制不止是string类型,还可以是buffer类型。
那就接着从BluetoothPrinter往这里扒,因为不是蓝牙,不受每次传输的长度限制,所以把分段传输的逻辑去掉。
var data = Array.from(uint8Buf);
var buffer = new ArrayBuffer(data.length);
var dataView = new DataView(buffer);
for (var i = 0; i < data.length; ++i) {
dataView.setUint8(i, data[i]);
}
console.log(
"data type is: " + typeof data + ", is buffer: " + Buffer.isBuffer(data)
);
但是,还是报同样地错误。
然后发现Buffer.isBuffer(data)是false,为什么类型不对呢?
于是搜到了这里http://nodejs.cn/api/buffer.html#buffer_static_method_buffer_from_arraybuffer_byteoffset_length
是nodejs里面对Buffer有不同于js的类型定义。
于是改成:
var uint8Buf = command.getData();
var buffer=Buffer.from(uint8Buf);
console.log(
"buffer type is: " + typeof buffer + ", is buffer: " + Buffer.isBuffer(buffer)
);
var jobid = "";
printer.printDirect({
data: buffer, // or simple String: "some text"
printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
success: function(jobID) {
console.log("sent to printer with ID: " + jobID);
jobid = jobID;
},
error: function(err) {
console.log(err);
},
});
打印成功。