|
马上注册,结交更多好友,享用更多功能。
您需要 登录 才可以查看,没有账号?立即注册
x
- Imports System.Text
- Imports System.Drawing
- Imports System.Drawing.Imaging
- Public Class FontConvertBmp
- Private m_FontName As String '字体名字
- Private m_FontSize As Integer '字体大小
- Private m_String As String '需要打印的文本
- Private m_FontBold As Boolean '字体样式
- Private m_X As Integer, m_Y As Integer '打印时候的X,Y坐标
- Private m_XZoom As Integer, m_YZoom As Integer '打印时候的X,Y方向的放大倍数最大只能为10倍
- Private List1 As List(Of Char), List2 As List(Of Integer) '压缩代码集合
- Private S As String
- Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As IntPtr) As Integer
- Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As IntPtr) As IntPtr
- Public Property XZoom() As Integer
- Get
- Return m_XZoom
- End Get
- Set(ByVal value As Integer)
- If value > 0 AndAlso value <= 10 Then
- m_XZoom = value
- End If
- End Set
- End Property
- Public Property YZoom() As Integer
- Get
- Return m_YZoom
- End Get
- Set(ByVal value As Integer)
- If value > 0 AndAlso value <= 10 Then
- m_YZoom = value
- End If
- End Set
- End Property
- Public Property X() As Integer
- Get
- Return m_X
- End Get
- Set(ByVal value As Integer)
- If value >= 0 Then
- m_X = value
- End If
- End Set
- End Property
- Public Property Y() As Integer
- Get
- Return m_Y
- End Get
- Set(ByVal value As Integer)
- If value >= 0 Then
- m_Y = value
- End If
- End Set
- End Property
- Public Property FontName() As String
- Get
- Return m_FontName
- End Get
- Set(ByVal value As String)
- m_FontName = value
- End Set
- End Property
- Public Property FontSize() As Integer
- Get
- Return m_FontSize
- End Get
- Set(ByVal value As Integer)
- If value > 7 AndAlso value <= 500 Then
- m_FontSize = value
- End If
- End Set
- End Property
- Public Property Text() As String
- Get
- Return m_String
- End Get
- Set(ByVal value As String)
- m_String = value
- End Set
- End Property
- Public Property FontBold() As Boolean
- Get
- Return m_FontBold
- End Get
- Set(ByVal value As Boolean)
- m_FontBold = value
- End Set
- End Property
- Public Sub New()
- m_FontName = "宋体"
- m_FontSize = 12
- m_FontBold = False
- m_X = 1
- m_Y = 1
- m_XZoom = 1
- m_YZoom = 1
- InitDictionary()
- End Sub
- Public Function Convert() As String
- Dim Hdc As IntPtr
- Hdc = CreateCompatibleDC(IntPtr.Zero)
- Dim Graphic As Graphics = Graphics.FromHdc(Hdc)
- Dim Width As Integer, Height As Integer
- Dim G As Graphics, Image As Bitmap
- Dim Font As Font
- If m_FontBold = True Then
- Font = New Font(m_FontName, m_FontSize, Drawing.FontStyle.Bold, GraphicsUnit.Pixel)
- Else
- Font = New Font(m_FontName, m_FontSize, Drawing.FontStyle.Regular, GraphicsUnit.Pixel)
- End If
- Width = (CInt(Graphic.MeasureString(m_String, Font).Width) \ 8 + 1) * 8 '将行规格话便于计算字节
- Height = Font.Height '列高
- Image = New Bitmap(Width, Height, PixelFormat.Format32bppArgb)
- G = Graphics.FromImage(Image)
- G.Clear(Color.White)
- G.DrawString(m_String, Font, Brushes.Black, 0, 2) '将文本写入图片
- Dim Value As Integer = Width * Height
- Dim TempString As New StringBuilder(Value)
- Dim DesString As New StringBuilder(Value)
- DesString.Append("~DGOUTSTR01," & Width * Height \ 8 & "," & Width \ 8 & ",")
- Dim i As Integer, j As Integer
- Dim Sum As Integer
- For j = 0 To Height - 1 '由于内存中的图片是倒置,所以要反取数据
- For i = 0 To Width \ 4 - 1
- Sum = 0
- For m As Integer = 0 To 3 '由于4个点可用1个十六进制数表示因此一次取4个点进行转换
- If Image.GetPixel(i * 4 + m, j).B = 0 Then '由于只打印黑白点所以根据RGB分量判断是否需要打印该点
- Sum += 1 << (3 - m) '通过移位操作将该点的信息与一个BIT相对应
- End If
- Next
- TempString.Append(Hex(Sum)) '将取出的点转换成16进制数
- Next
- Next
- Dim Count As Integer = 1 '将转成16进制的文本进行压缩
- For i = 1 To TempString.Length - 1
- If TempString.Chars(i - 1) = TempString.Chars(i) Then
- Count += 1
- If i = TempString.Length - 1 Then
- DesString.Append(CompressCode(Count) & TempString.Chars(i))
- End If
- Else
- DesString.Append(CompressCode(Count) & TempString.Chars(i - 1))
- S = String.Empty
- Count = 1
- End If
- Next
- DesString.Append(vbCrLf & "^FO" & m_X.ToString & "," & m_Y.ToString & "^XGOUTSTR01," & m_XZoom & "," & m_YZoom & ",^FS")
- DeleteDC(Hdc)
- G.Dispose()
- Image.Dispose()
- Graphic.Dispose()
- Return DesString.ToString
- End Function
- Private Function CompressCode(ByRef Input As Integer) As String
- If Input > 1 Then
- For i As Integer = List1.Count - 1 To 0 Step -1 '使用递归和贪婪算法将连续的数字转换成ZPL压缩代码,如000可用I0表示
- If Input >= List2.Item(i) Then
- S &= List1.Item(i)
- Input -= List2.Item(i)
- CompressCode(Input)
- End If
- Next
- End If
- Return S
- End Function
- Private Sub InitDictionary()
- '将ZPL定义的压缩代码写入集合
- List1 = New List(Of Char)
- List2 = New List(Of Integer)
- For i As Integer = 0 To 18
- List1.Add(ChrW(71 + i))
- List2.Add(i + 1)
- Next
- For i As Integer = 0 To 19
- List1.Add(ChrW(103 + i))
- List2.Add(20 * (i + 1))
- Next
- End Sub
- End Class
接下来我们开始分析价签配置文件了,对于%开头的词我们仍然认定为数据库中列,@定义为变量,定义^WINFONT(变量1,变量2,变量3,变量4,变量5,变量6)函数,其中变量分别对应 字体名,字号,X坐标,Y坐标,是否为粗体,X方向放大倍数,Y方向放大倍数。程序的实现原理就是将“%”,“^WINFONT”,“@”通过正则表达式将其从文件中提取出来来,然后根据各自的功能进行相应的拆分,替换转换成ZPL指令流,最后再将其发送到打印机。
在写分析价签配置文件分析库和打印接口的时候应该有哪些重要地方呢
|
|