日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

指令打印与驱动打印随笔

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 指令打印与驱动打印随笔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文對指令打印和驅動打印做了一個簡要的介紹,分享了在開發客戶端打印組件時的一些過程并提出了一個新輪子用于解決老的問題并引出更多的新問題。全文大概 3500 字無圖,閱讀大概需要 7 分鐘。

驅動打印是指:使用 PrintDocument 進行打印。通過注冊其 PrintPage 方法拿到 Graphics 對象使用 GDI+ 畫圖打印。

指令打印是指:利用打印機廠商提供的指令協議控制打印機直接打印。

驅動打印和 Windows 平臺關聯緊密,所以不能做到跨平臺。驅動打印大部分情況不能即插即用,在第一次將某打印機鏈接到電腦時,可能需要安裝對應的驅動程序系統才能正確的識別到該打印機。

絕大部分小票打印機都支持 ESC 指令,除了 ESC 外常見的還有 TSC、TSPL,PPLA等這與打印機廠商和型號相關。指令打印可以跨平臺,且在不同的平臺要向硬件發出的指令是相同的,無論鏈接方式是 USB、串口還是藍牙。

從開發的角度來說,如果我們想兼容市面上大多數打印機并且想支持跨平臺,那么這就會是一件需要仔細斟酌和權衡的事情:

1、僅采用驅動打印。那么我們不得不放棄對跨平臺的支持。如果遇到過老的設備,它很可能沒有提供對最新的操作系統(比如 Windows 10)的支持,所以單純的驅動打印是玩兒不贏的。

2、僅采用指令打印。我們可以做到跨平臺,無懼系統升級,但仍有無解的情況:如果客戶的打印機沒有指令打印或者指令協議很小眾沒必要做支持怎么辦?這是真實發生的事情,有客戶需要用傳統的辦公用打印機打印小票,真·謎一般的操作。

3、驅動打印和指令打印并行。這當然會解決上述問題,但同時會引入新的問題:你不得不寫出多套不同的代碼去完成一件相同的事情,更可怕的是在修改一個問題時很可能會改了這一套忘了那一套。

在項目起初,因為對各種打印方案并不熟悉所以帶你部分經過了上述三個階段的演變。當支持的打印機和打印格式越來越多,維護這部分代碼就成為一件苦力活兒,而且非常容易出錯。接手這部分代碼的人會被懷疑是否能力有問題,畢竟開始的時候時那么的簡單。

大概 2019 年 7 月份時,項目組對驅動打印進行了封裝,該封裝參考了網上的開源組件,構建出了一個名為 TicketDocument 的類型,并添加了一些基礎操作:

TicketDocument 可以序列化為 JSON 字符串用于在網絡間傳輸。所以可以將 TicketDocument 的生成放置在服務端,這樣對打印格式進行微調時不需要更新客戶端。

項目中對 TicketDocument 的調用類似如下,其中 doc 變量即 TicketDocument 實例:

doc.AddText($"來源:{g.SName}"); doc.AddNewRow(); doc.AddText($"出廠時間:{g.CommandDate:yyyy/MM/dd}"); doc.AddNewRow(); doc.AddText($"產品:{g.Items.Count(i => i.FXashId == 0)}件", width: 0.4f); doc.AddText($"附件:{g.Items.Count(i => i.FXashId != 0)}件", width: 0.3f, offset: 0.4f, alignment: StringAlignment.Center); doc.AddText($"共計:{g.Items.Count}件", width: 0.3f, offset: 0.7f, alignment: StringAlignment.Far);

當項目不得不支持指令打印時, TicketDocument 的抽象定義就不能滿足需求了:因為指令打印并不能提供類似于 GDI+ 這種強大的控制力。

驅動打印和指令打印并行的事情必須上馬。因為指令各不相同,所以就編寫了不同的代碼對應不同的打印機,業務應用調用打印宿主時也采用多種不同的協議格式,因項目不同沒有使用 TicketDocument 。這對驅動打印部分造成了影響,滿天飛的硬編碼,寫死的數組下標,接著在對打印格式進行調整時,驅動打印罷工了。

于是,我們需要一個新的輪子:

  • 它應該滿足跨平臺打印的需求,在 Windows、Android、iOS 中有相同的行為表現。

  • 它應該同時支持驅動打印和指令打印。

  • 在滿足前兩條的同時,它應該盡量減少新增格式時的工作量。

  • All problems in computer science can be solved by another level of indirection .

    計算機科學中的所有問題都可以通過間接的另一個層次來解決。

    出自:David Wheeler

    這是軟件工程學中的一個真理,我們可以引入一種新的自定義指令來決絕上述的問題:

  • 這種指令是一種高級指令,它對驅動打印和大部分目前受支持的指令打印行為進行了封裝。

  • 這種高級指令最終會被翻譯成對 Graphics 的操作或打印機指令。

  • 這種高級指令由業務系統生成并可以在網絡中進行傳播。

  • 這種高級指令可以使用目前的主流編程語言生成,比如 C#、Java、Python、PHP、JavaScript 等。

  • 這種高級指令應該易于識別,并盡量減少在網絡傳輸中的流量消耗。

  • TicketDocument 似乎是一個不錯的先驅者,目前為止它滿足了 3、4、5 這三個條件。但設計一種高級指令并不是唯一需要的事情,仍有許多工作要做比如這種高級指令的解析和轉換等。

    目前為止我并沒有完成對這個輪子的全部設計,以上是對這個輪子的設想。這個輪子在設計上還不完整,有許多空白的部分需要填上。如果您對這個輪子感興趣,可以收藏本站,在文章下留言或打賞作者,謝謝支持!

    總結

    以上是生活随笔為你收集整理的指令打印与驱动打印随笔的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。