2011年8月7日 星期日

HOW TO:端口打印(比较粗糙)

參考來源
--------
Imports System.IO
Imports System.Runtime.InteropServices
Public Class DataInfo
Private mLPTPORT As String '打印机端口
Private mInitText As String '初始化参数
Private mTexts As String() '以数组形式输出
Private mText As String '打印文本
Public Property LPTPORT() As String
Get
Return mLPTPORT
End Get
Set(ByVal Value As String)
mLPTPORT = Value
End Set
End Property
Public Property ToPrintText() As String
Get
Return mText
End Get
Set(ByVal Value As String)
mText = Value
End Set
End Property
Public Property InitPrinterText() As String
Get
Return mInitText
End Get
Set(ByVal Value As String)
mInitText = Value
End Set
End Property
Public Property ToPrintTexts() As String()
Get
Return mTexts
End Get
Set(ByVal Value As String())
mTexts = Value
End Set
End Property
End Class
Public Class Printer
#Region "接口参数"
Private PARAS As DataInfo
Public WriteOnly Property InputInfo() As DataInfo
Set(ByVal Value As DataInfo)
PARAS = Value
End Set
End Property
Private mStatus As Integer
Public ReadOnly Property STATUS() As Integer
Get
Return mStatus
End Get
End Property
#End Region

#Region "本地变量"
Private LPTPORT As String '端口
Private hPortP As IntPtr '返回句柄
Private retval As Boolean '关闭打印时返回的句柄
Private outFile As FileStream '打印字符流
#End Region
Public Sub InitializePrinter()
If PARAS.InitPrinterText.Trim = "" Then Exit Sub
LPTPORT = PARAS.LPTPORT
hPortP = CreateFile(LPTPORT, GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
mStatus = hPortP.ToInt32
outFile = New FileStream(hPortP, FileAccess.Write, False)
Dim fileWriter As New StreamWriter(outFile, System.Text.Encoding.Default)
fileWriter.AutoFlush = False
'打印开始
fileWriter.Write(PARAS.InitPrinterText)
fileWriter.Flush()
fileWriter.Close()
outFile.Close()
retval = CloseHandle(hPortP)
End Sub
Public Sub PrintText()
If PARAS.ToPrintText.Trim = "" Then Exit Sub
LPTPORT = PARAS.LPTPORT
hPortP = CreateFile(LPTPORT, GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
mStatus = hPortP.ToInt32
outFile = New FileStream(hPortP, FileAccess.Write, False)
Dim fileWriter As New StreamWriter(outFile, System.Text.Encoding.Default)
fileWriter.AutoFlush = False
'打印单据开始
fileWriter.WriteLine(PARAS.ToPrintText)
fileWriter.Flush()
fileWriter.Close()
outFile.Close()
retval = CloseHandle(hPortP)
End Sub
Public Sub Print(ByVal Text As String)
If Text.Trim = "" Then Exit Sub
LPTPORT = PARAS.LPTPORT
hPortP = CreateFile(LPTPORT, GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
mStatus = hPortP.ToInt32
outFile = New FileStream(hPortP, FileAccess.Write, False)
Dim fileWriter As New StreamWriter(outFile, System.Text.Encoding.Default)
fileWriter.AutoFlush = False
'打印单据开始
fileWriter.WriteLine(Text)
fileWriter.Flush()
fileWriter.Close()
outFile.Close()
retval = CloseHandle(hPortP)
End Sub
Public Sub PrintTexts()
If PARAS.ToPrintTexts Is Nothing OrElse PARAS.ToPrintTexts.Length = 0 Then Exit Sub
LPTPORT = PARAS.LPTPORT
hPortP = CreateFile(LPTPORT, GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
mStatus = hPortP.ToInt32
outFile = New FileStream(hPortP, FileAccess.Write, False)
Dim fileWriter As New StreamWriter(outFile, System.Text.Encoding.Default)
fileWriter.AutoFlush = False
'打印单据开始
For Each s As String In PARAS.ToPrintTexts
fileWriter.WriteLine(s)
Next
fileWriter.Flush()
fileWriter.Close()
outFile.Close()
retval = CloseHandle(hPortP)
End Sub
Public Shared Function GetCodeString(ByVal Numbers As String) As String
If Numbers.Trim = "" Then Return ""
Dim tmp As String
For Each s As String In Numbers.Split(" "c)
tmp &= Chr(CType("&H" & s, Integer))
Next
Return tmp
End Function
#Region "API所需要的必要信息"
Public Structure DCB
Public DCBlength As Int32
Public BaudRate As Int32
Public fBitFields As Int32
Public wReserved As Int16
Public XonLim As Int16
Public XoffLim As Int16
Public ByteSize As Byte
Public Parity As Byte
Public StopBits As Byte
Public XonChar As Byte
Public XoffChar As Byte
Public ErrorChar As Byte
Public EofChar As Byte
Public EvtChar As Byte
Public wReserved1 As Int16 'Reserved; Do Not Use
End Structure

Public Structure COMMTIMEOUTS
Public ReadIntervalTimeout As Int32
Public ReadTotalTimeoutMultiplier As Int32
Public ReadTotalTimeoutConstant As Int32
Public WriteTotalTimeoutMultiplier As Int32
Public WriteTotalTimeoutConstant As Int32
End Structure

Public Const GENERIC_READ As Int32 = &H80000000
Public Const GENERIC_WRITE As Int32 = &H40000000
Public Const OPEN_EXISTING As Int32 = 3
Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80
Public Const NOPARITY As Int32 = 0
Public Const ONESTOPBIT As Int32 = 0

Public Declare Auto Function CreateFile Lib "kernel32.dll" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _
ByVal hTemplateFile As IntPtr) As IntPtr

Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
ByRef lpDCB As DCB) As Boolean

Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
ByRef lpDCB As DCB) As Boolean

Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _
ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean

Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _
ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean

Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean
#End Region
End Class

Public Class CODE
Public Const C4 As String = Chr(&H34)
Public Const 联机 As String = Chr(&H11)
Public Const 解除联机 As String = Chr(&H13)
Public Shared Function 页长(ByVal i As Integer) As String
Return GetString("1B 43 " & i.ToString) '3英寸长
End Function
Public Shared Function 解除重打模式() As String
Return GetString("1B 6E")
End Function
Public Shared Function 双向打印() As String
Return GetString("1B 23 42")
End Function
Public Shared Function 行距(ByVal i As Integer) As String
Return GetString("1B 25 39 00 " & i.ToString) '18
End Function
Public Shared Function 高速打印() As String
Return GetString("1B 44")
End Function
Public Shared Function 垂直跳格(ByVal i As Integer) As String
Return GetString("1B 0B 00 " & i.ToString) '修改最后两位
End Function
Public Shared Function 间距换行(ByVal i As Integer) As String
Return GetString("1B 23 35 " & i.ToString) '修改最后一数
End Function
Public Shared Function 逆向换行(ByVal i As Integer) As String
Return GetString("1B 23 38 " & i.ToString) '修改最后一数
End Function
Public Shared Function 初始化() As String
Return GetString("1B 42")
End Function
Public Shared Function 下页() As String
Return GetString("0C")
End Function
Public Shared Function 换行() As String
Return GetString("0A")
End Function
Public Shared Function L行距(ByVal i As Integer) As String
Return GetString("1B 2B " & i.ToString)
End Function
Public Shared Function GetString(ByVal Numbers As String) As String
If Numbers.Trim = "" Then Return ""
Dim tmp As String
For Each s As String In Numbers.Split(" "c)
tmp &= Chr(CType("&H" & s, Integer))
Next
Return tmp
End Function
End Class
使用示意:

Imports LzmTW.PortPrint
Imports LzmTW.Common.SubAndFunction
Public Class OKIPrinter
Private Shared mPrinter As Printer
Private Shared mDataInfo As DataInfo
Private mPrinterInfo As PrinterInfo '读取打印机端口定义
Private mInitialzePrinterText As String = CODE.初始化 & CODE.页长(3) & CODE.双向打印 & CODE.高速打印 & CODE.行距(18)
Sub New()
If mPrinter Is Nothing Then
mPrinter = New Printer
mDataInfo = New DataInfo
mPrinterInfo = New PrinterInfo
mPrinter.InputInfo = mDataInfo
End If
End Sub
Public Property LocatePrinterInfo() As PrinterInfo
Get
Return mPrinterInfo
End Get
Set(ByVal Value As PrinterInfo)
mPrinterInfo = Value
End Set
End Property
Private Sub InitializePrinter()
mDataInfo.LPTPORT = mPrinterInfo.LPTPORT
End Sub
Public Sub 打印(ByVal Bill As 票据, ByVal BillName As String)
InitializePrinter()
If BillName.Equals("结算单") Then
mPrinter.Print(Bill.ToPrint结算单(mPrinterInfo.PrinterType))
End If
If BillName.Equals("发票") Then
mPrinter.Print(Bill.ToPrint发票(mPrinterInfo.PrinterType))
End If
End Sub
Public Sub 打印收费卡(ByVal Card As 收费卡)
InitializePrinter()
mPrinter.Print(Card.PrinterText)
End Sub
Public Class PrinterInfo
Public PrinterType As PrinterType
Public LPTPORT As String
End Class
End Class

Public Enum PrinterType
OKI
LQ
End Enum


Public Class 票据
Public 用户编码 As String
Public NO As String
Public 用户名称 As String
Public 所属月份 As String
'...

Public Function ToPrint发票(ByVal PrinterType As PrinterType) As String
If PrinterType = PrinterType.OKI Then
Return ToPrintOKI发票()
Else
Return ToPrintLQ发票()
End If
End Function
Private Function ToPrintOKI发票() As String
Dim Code As Code
Dim Leg As String = Space(10)
Dim tmp As String
tmp &= Code.页长(5) & Code.双向打印 & Code.高速打印 & Code.行距(21) & Code.下页()
tmp &= Code.换行() & Code.换行() & Code.间距换行(9)
tmp &= Leg & String.Format("{0,12}" & CHNFormat(1, 41, True, 收费类型) & "{2,4} {3,2} {4,2}", _
"", 收费类型, 年, 月, 日)
tmp &= Code.间距换行(2)
tmp &= Code.换行() & Leg & String.Format("{0,12}" & CHNFormat(1, 26, True, 用户名称) & "{2,12}{3,-24}", _
"", 用户名称, "", 用户编码)
'....
tmp &= Code.下页
Return tmp
End Function
Private Function ToPrintLQ发票() As String
Dim Code As Code
Dim Leg As String = Space(10)
Dim tmp As String
tmp = Code.GetString("1B 40 1B 43 0 03") & Code.L行距(62)
tmp &= Code.换行() & Code.换行()
tmp &= Leg & String.Format("{0,12}" & CHNFormat(1, 39, True, 收费类型) & "{2,4} {3,2} {4,2}", _
"", 收费类型, 年, 月, 日)
tmp &= Code.换行() & Leg & String.Format("{0,12}" & CHNFormat(1, 24, True, 用户名称) & "{2,12}{3,-24}", _
"", 用户名称, "", 用户编码)
'....
Return tmp
End Function
'....
End Class

沒有留言:

張貼留言