非标链式纸打印位置偏差处理探索
2017-03-23刘德军
刘德军
(射阳县人民医院 信息科 224300)
摘 要:链式打印纸是日常使用的一种纸张类型,通常用于单联或多联的票据。通过针式打印机的链式输纸器的送纸,完成打印任务。但对于非标准格式的链式纸张打印时却存在位置偏差的现象,经过连续多张打印后,位置偏差相当严重,甚至不能忍受。
关键词:链式;非标准;纸张;偏差
一、前言
作者在给某单位开发信息系统时,使用到该单位以前使用的定制的链式票据纸,其规格为宽12CM,高为5.5孔距(计算纸张高度的方法为:连续纸孔数×0.5×2.54CM=高度,5.5×0.5×2.54=6.985CM)。开始测试时没发现纸张打印位置偏差问题,但随着系统的正式使用,打印多张后就发生了明显示的偏移,张数越多偏移越严重,由于该发票是套打格式的,因此该问题是不能忍受的。
二、过程
经过咨询打印机厂家工程师,得知此问题是因为连续纸孔数为非整数,根据计算纸张高度的方法为:连续纸孔数×0.5×2.54CM=高度,导致纸张高度为6.985CM(即带三位小数),而操作系统纸张的精度为两位小数,因此要么设为6.98CM,要么设置为6.99CM,随着打印张数的增加,其偏差也在增加。设为6.98CM时,位置逐渐向正常位置的上方偏移,而设为6.98CM时,位置逐渐向正常位置的下方偏移。因此除非修改纸张规格,否则无法正常打印。偏移情况如图示:
三、处理方法
通过不断的测试,作者终于找到一种方法来解决非标链式纸打印位置偏差的问题。解决思路:既然无法更改纸张,那么就变通处理,只要在经过一定数量的纸张偏差后,通过修正的消除该偏差,即可使打印位置回归正常位置。
根据这一思路具体方法是:通过计算多张纸累积偏差和,调用打印机指令集进行误差修正,从而实现正常打印。(打印指令集:控制打印机操作的打印控制语言指令集合。计算机通过打印控制语言,以软件命令的方法来控制打印机操作,解释执行打印数据,获得打印结果的。)
四、详细步骤
1、新建VB工程,添加模块,名称为mdlPrintControl。
2、mdlPrintControl代码如下:
Option Explicit
‘声明对动态链接库?(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
‘根据实际使用状态调整代码中数字40为合适的数字即可,
If i Mod 40 = 0 Theni为打印张数计数
DoPrint (i) ‘打印操作
Call PrintRollBack ‘调用控制打印机后退
Else
DoPrint (i)
End If
五、体会与总结
通过调用打印机指令集,成功修正了因非标链式纸导致的打印位置偏差问题。对于控制打印机后退所需的纸张数可根据发票印刷位置与打印位置能忍受的程度来定,通过可调参数来使用时将更为方便。函数执行后,会产生一行打印任务。本例调试环境为:Window XP(SP3)+Visual Basic 6.0(SP6),运行环境为:Window 10,打印机型号为EPSON LQ-635K。
参考文献
[1]王怀彬等,Visual Basic程序设计,机械工业出版社,2008.04.
[2]北京爱普生软件技术发展有限公司,ESC/P、ESC/P2、ESC/PK、ESC/PK2程序设计指南,1994.08.