办公中国打印机论坛

 
 立即注册

QQ登录

只需一步,快速开始

办公中国打印机维修论坛vip会员
打印机复印机维修视频教程
搜索
 开通本论坛VIP会员,
享受更多贵宾权限。
点击查看!
点这里自动积分充值,
客服QQ:454037456
客服微信号:oachn123
北京客服微信号:
186 1000 1535
开通VIP会员,免费赠送
办公设备维修培训视频教程
(赠送全套60集培训课程)
[公告]下载前必看!
详细下载说明图解
请按照说明下载资料
查看: 3461|回复: 0

[教程] zebra z4M打印机怎么打印中文?解答2

[复制链接]

440

主题

55

回帖

3135

积分

高级工程师

Rank: 4

积分
3135
注册时间
2014-7-24
居住地
广东 广州市
发表于 2015-8-7 10:00:13 | 显示全部楼层 |阅读模式
办公中国打印机论坛VIP会员

马上注册,结交更多好友,享用更多功能。

您需要 登录 才可以查看,没有账号?立即注册

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指令流,最后再将其发送到打印机。
在写分析价签配置文件分析库和打印接口的时候应该有哪些重要地方呢



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|开通vip会员|关于我们|手机版|Archiver|打印机维修论坛 (京ICP备05009053号;北京市公安局备案:京公网安备110108002830号 )

GMT+8, 2024-5-6 10:25

Powered by Discuz!

办公中国打印机论坛
快速回复 返回顶部 返回列表