Das Frontend implementiert die Funktion des Aufrufs des Druckers und des Belegdrucks (TSPL).

Ⅰ- 1 – Nutzungsanforderungen

Die Front-End-Methode besteht darin, auf diese Schaltfläche zu klicken und den Drucker direkt drucken zu lassen, was ich möchte.

Github-Adresse: https://github.com/whqgo/nodeWebPrint

Ⅱ-II-Quittungsdruck

Derzeit ist es besser, den Befehlssatz direkt über das TSPL-Label zu drucken. Ich werde nicht näher auf die Grundumgebung eingehen. Die Implementierung dieser Funktion besteht darin, USB zum Senden von Anweisungen zu verwenden. Derzeit mangelt es daran Tools, die es uns ermöglichen, mit USB zu kommunizieren. Folgendes wird empfohlen: Ein Programmtreiber, der einen universellen USB-Treiber installiert.

  • Hinweis: TSPL ist ein universeller Befehlssatz für den Etikettendruck, der von vielen gängigen Etikettendruckern unterstützt wird. Zu den Kommunikationsmethoden der Etikettendrucker auf dem Markt gehören hauptsächlich: serielle Schnittstelle, USB, Bluetooth und WIFI. Durch Senden der entsprechenden TSPL-Anweisungen über die oben genannten Methoden kann der Etikettendrucker gemäß den Anweisungen drucken.

Der für das USB-Plug-in erforderliche Programmtreiber (Zadig).

https://zadig.akeo.ie/

Nachdem der Download abgeschlossen ist, öffnen Sie ihn und befolgen Sie die Schritte

  1. Überprüfen Sie diese
    Fügen Sie hier eine Bildbeschreibung ein
  2. Wählen Sie den angeschlossenen USB-Drucker USB aus, normalerweise den Produktnamen des Druckers. Ich verwende einen Jiabo-Drucker.
    Fügen Sie hier eine Bildbeschreibung ein

3.Installieren Sie den TreiberFügen Sie hier eine Bildbeschreibung ein

Code schreiben

Verzeichnisaufbau

Fügen Sie hier eine Bildbeschreibung ein

Haupteintragsdatei

webPrintUtils-ordnerspezifische Implementierung

  • Index: Logik der Funktionsimplementierung
  • bitmap_nodejs: wird zum Konvertieren von Bildern in Bitmaps verwendet
  • tspl.class: Sekundäre Kapselung von TSPL-Anweisungen
  • usb.class: Wird zum Verbinden von USB-Datenschreibvorgängen verwendet

Wir möchten zum Beispiel einen Barcode zeichnen

Fügen Sie der Datei tspl.class.js eine Barcode-Methode hinzu. Die spezifischen Anweisungen sind online leicht zu finden.

/**
 * 条码,这里固定为code128
 * 单位都为dot
 * 
 * @param {Number} [x=0] - x
 * @param {Number} [y=0] - y
 * @param {Number} [height=80] - height
 * @param {String} [content=""] - 条码内容,请遵循code128的约定,不是啥字符都可以往里边放的
 * @param {Boolean} [label=true] - 是否显示条码的label部分
 * @param {Number} [elementWidth=2] - 条码每位宽度
 * @param {Number} [rotate=0] - 旋转角度,支持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}"`);
}

Um es zu verwenden, müssen Sie die Parameter nur nach der Instanziierung übergeben.

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

// 实例化 一个 80mm, 40mm的画布
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)

Jetzt wurden in dieser tspl.class.js alle grundlegenden und häufig verwendeten Dinge hinzugefügt, wie z. B. QR-Code, Barcode, Text, Bild, Unterstreichung, Zeichenfeld und Farbblock.

Nach dem Abgleich können Sie es ausdrucken

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();

Fügen Sie hier eine Bildbeschreibung ein

Ⅲ - 三 - Normaler Druck

Was Sie vielleicht denken, ist, direkt mit dem Browser zu drucken und ihn über „window.print ()“ aufzurufen, aber die Operationsseite wird angezeigt. Wenn dies nicht akzeptabel ist, sagt der Leiter, dass es nicht schön und transparent ist, und lehnt es ab it. Der Schwerpunkt dieser Anforderung liegt nicht auf dem gedruckten Inhalt. Wenn Sie Inhalte zu einem Iframe hinzufügen, möchten Sie den gedruckten Inhalt in ein Bild umwandeln, anstatt ihn direkt zu drucken? Es ist schmerzlos. Nach langem Nachdenken nur Python kann dies tun. Python schreibt das Skript und kompiliert es in eine Exe und ruft es dann mit Knoten auf. Wir haben keine andere Wahl, als das Land durch diese Kurve zu retten.

Hier wird das Python-Modul win32com.client verwendet. Es bietet die Funktion, die zugrunde liegenden Komponenten von Windows aufzurufen, um Word, Excel, PPT usw. zu bedienen. Es kann nur in der Windows-Umgebung verwendet werden und erfordert die Installation bürobezogener Software ( WPS ist auch akzeptabel)

import win32com.client


# 打印
def openRrint():
    lg = '打印的xlsx文件路径'
    try:
        xlApp = win32com.client.Dispatch("Excel.Application")
        # UpdateLinks
        # CorruptLoad=2 尝试修复损坏的文件
        # xlBook = xlApp.Workbooks.Open(lg, UpdateLinks=0, CorruptLoad=2)  # 打印的文件
        xlBook = xlApp.Workbooks.Open(lg, UpdateLinks=0)  # 打印的文件
        xlApp.Visible = 0  # 不在后台运行
        xlApp.DisplayAlerts = False  # 显示弹窗
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.Orientation = win32com.client.constants.xlLandscape # 设置为横向打印
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.Zoom = False
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.FitToPagesWide = 1  # 页数范围
        xlApp.ActiveWorkbook.Sheets(1).PageSetup.FitToPagesTall = 10
        # xlBook.Save() #保存
        ename = xlApp.ActiveWorkbook.Name  # 获取打开工作表名称
        print("正在打印>", ename)
        xlBook.PrintOut()
        print(xlApp, "名称===")
        print(xlBook, "打印的文件===")
        print(lg, "lg===")
        # xlBook.PrintOut(1,5) # 打印页数1-5
        xlApp.Quit()  # 退出
    except Exception as e:
        print(f"打印 Excel 文件时发生错误: {str(e)}")


if __name__ == "__main__":
    # 调用打印机
    openRrint()
    pass

Dann packen Sie es in eine exe-Datei,

Pyinstaller -F init.py 打包exe

Der Knoten kann das Modul child_process verwenden, um eine Datei auszuführen

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

Dieser Code hat das erreicht, was ich will. Python ist ziemlich leistungsfähig, aber es gibt einige Probleme. Die mit diesem Code gepackte Exe ist tatsächlich bis zu 40 MB groß, was ziemlich unverschämt ist. Ich werde dieses Problem beiseite lassen, und dort In Zukunft wird es andere Möglichkeiten geben. Lösen Sie es. Dies ist ein zukünftiger Optimierungspunkt und wird basierend auf der Arbeitslast berechnet.

Für diesen letzten Schritt dachte ich, es wäre besser, wasm zu verwenden (Knoten ruft wasm direkt auf), aber diese Funktion wird nicht mit c implementiert. Python3 wird nicht nur in wasm konvertiert. Kann mir jemand helfen, diesen letzten Schritt zu verbessern? „Es ist wirklich nötig.“

Acho que você gosta

Origin blog.csdn.net/weixin_42863800/article/details/134186605
Recomendado
Clasificación