劉德軍
(射陽縣人民醫(yī)院 信息科 224300)
摘 要:鏈式打印紙是日常使用的一種紙張類型,通常用于單聯(lián)或多聯(lián)的票據(jù)。通過針式打印機的鏈式輸紙器的送紙,完成打印任務。但對于非標準格式的鏈式紙張打印時卻存在位置偏差的現(xiàn)象,經(jīng)過連續(xù)多張打印后,位置偏差相當嚴重,甚至不能忍受。
關鍵詞:鏈式;非標準;紙張;偏差
一、前言
作者在給某單位開發(fā)信息系統(tǒng)時,使用到該單位以前使用的定制的鏈式票據(jù)紙,其規(guī)格為寬12CM,高為5.5孔距(計算紙張高度的方法為:連續(xù)紙孔數(shù)×0.5×2.54CM=高度,5.5×0.5×2.54=6.985CM)。開始測試時沒發(fā)現(xiàn)紙張打印位置偏差問題,但隨著系統(tǒng)的正式使用,打印多張后就發(fā)生了明顯示的偏移,張數(shù)越多偏移越嚴重,由于該發(fā)票是套打格式的,因此該問題是不能忍受的。
二、過程
經(jīng)過咨詢打印機廠家工程師,得知此問題是因為連續(xù)紙孔數(shù)為非整數(shù),根據(jù)計算紙張高度的方法為:連續(xù)紙孔數(shù)×0.5×2.54CM=高度,導致紙張高度為6.985CM(即帶三位小數(shù)),而操作系統(tǒng)紙張的精度為兩位小數(shù),因此要么設為6.98CM,要么設置為6.99CM,隨著打印張數(shù)的增加,其偏差也在增加。設為6.98CM時,位置逐漸向正常位置的上方偏移,而設為6.98CM時,位置逐漸向正常位置的下方偏移。因此除非修改紙張規(guī)格,否則無法正常打印。偏移情況如圖示:
三、處理方法
通過不斷的測試,作者終于找到一種方法來解決非標鏈式紙打印位置偏差的問題。解決思路:既然無法更改紙張,那么就變通處理,只要在經(jīng)過一定數(shù)量的紙張偏差后,通過修正的消除該偏差,即可使打印位置回歸正常位置。
根據(jù)這一思路具體方法是:通過計算多張紙累積偏差和,調用打印機指令集進行誤差修正,從而實現(xiàn)正常打印。(打印指令集:控制打印機操作的打印控制語言指令集合。計算機通過打印控制語言,以軟件命令的方法來控制打印機操作,解釋執(zhí)行打印數(shù)據(jù),獲得打印結果的。)
四、詳細步驟
1、新建VB工程,添加模塊,名稱為mdlPrintControl。
2、mdlPrintControl代碼如下:
Option Explicit
‘聲明對動態(tài)鏈接庫?(DLL)?中外部過程的引用
Public Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function EndDocPrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function EndPagePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, ByVal pDefault As Long) As Long
Public Declare Function StartDocPrinter Lib "winspool.drv" Alias "StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pDocInfo As DOCINFO) As Long
Public Declare Function WritePrinter Lib "winspool.drv" (ByVal hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, pcWritten As Long) As Long
Public Type DOCINFO
pDocName As String
pOutputFile As String
pDatatype As String
End Type
Public lReturn As Long
Public MyDocInfo As DOCINFO
Public lpcWritten As Long
Public sWrittenData As String
Public lhPrinter As Long
Public Sub PrintRollBack() ‘控制打印機后退
lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0)
If lReturn = 0 Then
MsgBox "未找打印機!"
Exit Sub
End If
MyDocInfo.pDocName = ""
MyDocInfo.pOutputFile = vbNullString
MyDocInfo.pDatatype = vbNullString
StartDocPrinter lhPrinter, 1, MyDocInfo
sWrittenData = Chr(27) + "j" + Chr(30) ‘回退走紙
WritePrinter lhPrinter, ByVal sWrittenData, Len(sWrittenData), lpcWritten
EndPagePrinter lhPrinter
EndDocPrinter lhPrinter
ClosePrinter lhPrinter
End Sub
3、調用方法
‘將紙張高度設為6.98CM
‘根據(jù)實際使用狀態(tài)調整代碼中數(shù)字40為合適的數(shù)字即可,
If i Mod 40 = 0 Theni為打印張數(shù)計數(shù)
DoPrint (i) ‘打印操作
Call PrintRollBack ‘調用控制打印機后退
Else
DoPrint (i)
End If
五、體會與總結
通過調用打印機指令集,成功修正了因非標鏈式紙導致的打印位置偏差問題。對于控制打印機后退所需的紙張數(shù)可根據(jù)發(fā)票印刷位置與打印位置能忍受的程度來定,通過可調參數(shù)來使用時將更為方便。函數(shù)執(zhí)行后,會產(chǎn)生一行打印任務。本例調試環(huán)境為:Window XP(SP3)+Visual Basic 6.0(SP6),運行環(huán)境為:Window 10,打印機型號為EPSON LQ-635K。
參考文獻
[1]王懷彬等,Visual Basic程序設計,機械工業(yè)出版社,2008.04.
[2]北京愛普生軟件技術發(fā)展有限公司,ESC/P、ESC/P2、ESC/PK、ESC/PK2程序設計指南,1994.08.