国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能

這篇具有很好參考價(jià)值的文章主要介紹了前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Ⅰ- 壹 - 使用需求

前端 的方式 點(diǎn)擊這個(gè)按鈕,直接讓打印機(jī)打印我想要的東西

github地址: https://github.com/whqgo/nodeWebPrint

Ⅱ - 貳 - 小票打印

目前比較好的方式就是直接用 TSPL 標(biāo)簽打印指令集, 基礎(chǔ)環(huán)境就不多說(shuō)了,這個(gè)功能的實(shí)現(xiàn)就是利用usb發(fā)送指令,現(xiàn)在缺少個(gè)來(lái)讓我們能夠和usb溝通的工具,下面這就是推薦的一個(gè)程序驅(qū)動(dòng),安裝通用USB驅(qū)動(dòng)程序.

  • 注: TSPL是一套通用的標(biāo)簽打印指令集,很多主流標(biāo)簽打印機(jī)都支持。市面上標(biāo)簽打印機(jī)的通訊方式主要有:串口、USB、藍(lán)牙和WIFI,通過(guò)上述方式發(fā)送相應(yīng)的TSPL指令,標(biāo)簽打印機(jī)就可以依照指令進(jìn)行打印。

usb 插件需要的 程序驅(qū)動(dòng)(Zadig)

https://zadig.akeo.ie/

下載完成后打開(kāi),依次操作

  1. 勾選這些
    前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能,前端
  2. 選擇連接的usb 打印機(jī)usb, 一般是 打印機(jī)商品名字,我這使用的是佳博打印機(jī)
    前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能,前端

3.安裝驅(qū)動(dòng)前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能,前端

編寫(xiě)代碼

目錄結(jié)構(gòu)

前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能,前端

main入口文件

webPrintUtils文件夾 具體的實(shí)現(xiàn)

  • index : 功能實(shí)現(xiàn)的邏輯
  • bitmap_nodejs : image轉(zhuǎn)bitmap所用
  • tspl.class : TSPL 指令二次封裝一下
  • usb.class: 用于連接 usb數(shù)據(jù)寫(xiě)入操作

列如我們想畫(huà)一個(gè)條形碼

在tspl.class.js文件中添加一個(gè)barcode方法, 具體的指令很容易在網(wǎng)上查到

/**
 * 條碼,這里固定為code128
 * 單位都為dot
 * 
 * @param {Number} [x=0] - x
 * @param {Number} [y=0] - y
 * @param {Number} [height=80] - height
 * @param {String} [content=""] - 條碼內(nèi)容,請(qǐng)遵循code128的約定,不是啥字符都可以往里邊放的
 * @param {Boolean} [label=true] - 是否顯示條碼的label部分
 * @param {Number} [elementWidth=2] - 條碼每位寬度
 * @param {Number} [rotate=0] - 旋轉(zhuǎn)角度,支持0,90,180,270
 * @returns {Tspl}
 * @public
 */
barcode ( 
    x = 0, 
    y = 0,
    height = 80,
    content = "",
    label = true,
    elementWidth = 2,
    rotate = 0
) {
    return this.#append(`BARCODE ${x},${y},"128",${height},${+label},${rotate},${elementWidth},${elementWidth*2},"${content}"`);
}

使用只需要在實(shí)例化后傳參就行了

const Printer = require('./printer.class')
const Usb = require('./usb.class')
const Tspl = require('./tspl.class')
const { encode } = require('GBKCodec')

// 實(shí)例化 一個(gè) 80mm, 40mm的畫(huà)布
const print = new Printer({
    connection: new Usb,
    language: new Tspl({
        size: "80mm, 40mm",
        gap: "2mm, 0mm",
        encoder: encode
    })
});
print.barcode(30, 20, '120', data.c, false, 3)

現(xiàn)在這個(gè)tspl.class.js中 基本的常用的都添加完了,二維碼,條形碼,文本.圖片,下劃線(xiàn),繪制盒子,繪制色塊

搭配之后就可以打印出來(lái)

await print.text(40, 10, '前端精湛掌握', 2, 'TSS24.BF2')
await print.bar(5, 96, 560, 4)
await print.qrcode(40, 110, "http://weixin.qq.com/r/zRHk-BjEZUUarVyf90Tf") // 二維碼
await print.print();

前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能,前端

Ⅲ - 叁 - 普通打印

可能想到 的是 , 直接用瀏覽器打印,通過(guò) `window.print()調(diào)用,但是會(huì)彈出來(lái)操作頁(yè)面,不行 領(lǐng)導(dǎo)說(shuō)這樣不行不美觀(guān)不通透 否決.這個(gè)需求的重點(diǎn)不是打印的內(nèi)容,不管是內(nèi)容添加到iframe里還是將打印內(nèi)容轉(zhuǎn)為圖片 而是想直接打印.無(wú)痛的那種,思來(lái)想去,也就只有python能這樣做了,python寫(xiě)好腳本編譯成exe然后用node調(diào)用,沒(méi)辦法只好這樣曲線(xiàn)救國(guó)了.

這里用到了 python模塊 win32com.client 它提供調(diào)用 windows 底層組件對(duì) word 、Excel、PPT 等進(jìn)行操作的功能,只能在 Windows 環(huán)境下使用,并且需要安裝 office 相關(guān)軟件才行(WPS也行)

import win32com.client


# 打印
def openRrint():
    lg = '打印的xlsx文件路徑'
    try:
        xlApp = win32com.client.Dispatch("Excel.Application")
        # UpdateLinks
        # CorruptLoad=2 嘗試修復(fù)損壞的文件
        # xlBook = xlApp.Workbooks.Open(lg, UpdateLinks=0, CorruptLoad=2)  # 打印的文件
        xlBook = xlApp.Workbooks.Open(lg, UpdateLinks=0)  # 打印的文件
        xlApp.Visible = 0  # 不在后臺(tái)運(yùn)行
        xlApp.DisplayAlerts = False  # 顯示彈窗
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.Orientation = win32com.client.constants.xlLandscape # 設(shè)置為橫向打印
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.Zoom = False
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.FitToPagesWide = 1  # 頁(yè)數(shù)范圍
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.FitToPagesTall = 10
        # xlBook.Save() #保存
        ename = xlApp.ActiveWorkbook.Name  # 獲取打開(kāi)工作表名稱(chēng)
        print("正在打印>", ename)
        xlBook.PrintOut()
        print(xlApp, "名稱(chēng)===")
        print(xlBook, "打印的文件===")
        print(lg, "lg===")
        # xlBook.PrintOut(1,5) # 打印頁(yè)數(shù)1-5
        xlApp.Quit()  # 退出
    except Exception as e:
        print(f"打印 Excel 文件時(shí)發(fā)生錯(cuò)誤: {str(e)}")


if __name__ == "__main__":
    # 調(diào)用打印機(jī)
    openRrint()
    pass

然后打包成exe文件,

Pyinstaller -F init.py 打包exe

node就可以用child_process模塊執(zhí)行一個(gè)文件了

const { execFile } = require('child_process')
execFile(url)

就這點(diǎn)代碼就實(shí)現(xiàn)了 我想要的需求 python 還挺強(qiáng)嘞,不過(guò)也有點(diǎn)問(wèn)題 就這點(diǎn)代碼 打包exe竟然高達(dá)40MB,相當(dāng)離譜了也是,留著這個(gè)問(wèn)題把,后續(xù)有其他的方式了 在解決, 這可是以后的優(yōu)化點(diǎn),算工作量的.

最后這一步 我尋思 用wasm去做會(huì)更好(node直接調(diào)用wasm),但是 用c沒(méi)實(shí)現(xiàn)出來(lái)這功能,python3不只是轉(zhuǎn)成wasm,有沒(méi) 大佬幫忙完善這最后一步啊 真的很需要文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-741353.html

到了這里,關(guān)于前端實(shí)現(xiàn)調(diào)用打印機(jī)和小票打印(TSPL )功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包