劉德軍
(射陽縣人民醫(yī)院 信息科 224300)
摘 要:鏈?zhǔn)酱蛴〖埵侨粘J褂玫囊环N紙張類型,通常用于單聯(lián)或多聯(lián)的票據(jù)。通過針式打印機的鏈?zhǔn)捷敿埰鞯乃图?,完成打印任?wù)。但對于非標(biāo)準(zhǔn)格式的鏈?zhǔn)郊垙埓蛴r卻存在位置偏差的現(xiàn)象,經(jīng)過連續(xù)多張打印后,位置偏差相當(dāng)嚴(yán)重,甚至不能忍受。
關(guān)鍵詞:鏈?zhǔn)?;非?biāo)準(zhǔn);紙張;偏差
一、前言
作者在給某單位開發(fā)信息系統(tǒng)時,使用到該單位以前使用的定制的鏈?zhǔn)狡睋?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ù)越多偏移越嚴(yán)重,由于該發(fā)票是套打格式的,因此該問題是不能忍受的。
二、過程
經(jīng)過咨詢打印機廠家工程師,得知此問題是因為連續(xù)紙孔數(shù)為非整數(shù),根據(jù)計算紙張高度的方法為:連續(xù)紙孔數(shù)×0.5×2.54CM=高度,導(dǎo)致紙張高度為6.985CM(即帶三位小數(shù)),而操作系統(tǒng)紙張的精度為兩位小數(shù),因此要么設(shè)為6.98CM,要么設(shè)置為6.99CM,隨著打印張數(shù)的增加,其偏差也在增加。設(shè)為6.98CM時,位置逐漸向正常位置的上方偏移,而設(shè)為6.98CM時,位置逐漸向正常位置的下方偏移。因此除非修改紙張規(guī)格,否則無法正常打印。偏移情況如圖示:
三、處理方法
通過不斷的測試,作者終于找到一種方法來解決非標(biāo)鏈?zhǔn)郊埓蛴∥恢闷畹膯栴}。解決思路:既然無法更改紙張,那么就變通處理,只要在經(jīng)過一定數(shù)量的紙張偏差后,通過修正的消除該偏差,即可使打印位置回歸正常位置。
根據(jù)這一思路具體方法是:通過計算多張紙累積偏差和,調(diào)用打印機指令集進行誤差修正,從而實現(xiàn)正常打印。(打印指令集:控制打印機操作的打印控制語言指令集合。計算機通過打印控制語言,以軟件命令的方法來控制打印機操作,解釋執(zhí)行打印數(shù)據(jù),獲得打印結(jié)果的。)
四、詳細步驟
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、調(diào)用方法
‘將紙張高度設(shè)為6.98CM
‘根據(jù)實際使用狀態(tài)調(diào)整代碼中數(shù)字40為合適的數(shù)字即可,
If i Mod 40 = 0 Theni為打印張數(shù)計數(shù)
DoPrint (i) ‘打印操作
Call PrintRollBack ‘調(diào)用控制打印機后退
Else
DoPrint (i)
End If
五、體會與總結(jié)
通過調(diào)用打印機指令集,成功修正了因非標(biāo)鏈?zhǔn)郊垖?dǎo)致的打印位置偏差問題。對于控制打印機后退所需的紙張數(shù)可根據(jù)發(fā)票印刷位置與打印位置能忍受的程度來定,通過可調(diào)參數(shù)來使用時將更為方便。函數(shù)執(zhí)行后,會產(chǎn)生一行打印任務(wù)。本例調(diào)試環(huán)境為:Window XP(SP3)+Visual Basic 6.0(SP6),運行環(huán)境為:Window 10,打印機型號為EPSON LQ-635K。
參考文獻
[1]王懷彬等,Visual Basic程序設(shè)計,機械工業(yè)出版社,2008.04.
[2]北京愛普生軟件技術(shù)發(fā)展有限公司,ESC/P、ESC/P2、ESC/PK、ESC/PK2程序設(shè)計指南,1994.08.