|
|
Posted on
2008-09-18 16:03
Zhougm
阅读( 7142)
评论()
收藏
举报
对企业实施信息化来说,条码至关重要,最近在研究Label打印的东西,总结了两种打印方式:机器码打印、调用CodeSoft打印及使用C#编写了相关的代码来实现.
- 一.调用CodeSoft打印:
- 利用第三方软件codesofe进行label设计,然后在程序中调用打印。这种方式维护起来比较方便,手动调整label各参数指标即可。
- 准备工作:1.安装打印机驱动 2.安装codeSoft 3.设计label,设置label参数
程序实现:注意首先添加引用:Lppx2.tlb (codesoft安装后文件中)
- 二.机器码打印:
这种方式直接使用打印机机器指令进行打印,调用系统串口或并口实现。
- 针对上述两中情况,我用C#写了一个打印类.在实际工作中,觉得通过执行SQL得到相关Label信息的纪录集,然后根据纪录集控制label打印.用起来特方便,灵活.
- 可以很自由地控制Label打印内容,数量,模板文档等等一些信息,下面代码供大家学习参考.
- PrintLabel类:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

using System.IO;
using System.IO.Ports;
using System.Data;
using System.Windows.Forms;

namespace PrintLabel
  {
public class PrintLabel
 {
 //读取文件内容#region //读取文件内容
//获取需要打印的文本!
public bool GetContent(DataTable dt, out string fileContent)
 {
string strFileName = "";

if (dt.Rows.Count == 0)
 {
fileContent = "Has no label information !";
return false;
}

for (int i = 0; i < dt.Columns.Count; i++)
 {
if (dt.Columns[i].ColumnName.ToUpper().IndexOf("LABELFILE") > -1)
 {
strFileName = dt.Rows[0]["LabelFile"].ToString();
break;
}
}

if (strFileName == "")
 {
fileContent = "Can not find label file name !";
return false;
}

string strFilePath = Application.StartupPath + @"\" + strFileName;

if (!File.Exists(strFilePath))
 {
fileContent = "Can not find label file template" + strFilePath + " !";
return false;
}

StreamReader sr = new StreamReader(strFilePath, System.Text.Encoding.GetEncoding("gb2312"));
string strFileContent = sr.ReadToEnd();
sr.Close();

try
 {
int iRow = 0;
int iCol = 0;
int iRows = 0;
iRows = dt.Rows.Count;
for (; iRow < iRows; iRow++)
 {
if (iRow == 0)
 {
for (; iCol < dt.Columns.Count; iCol++)
 {
strFileContent = strFileContent.Replace("<" + dt.Columns[iCol].ColumnName.ToUpper() + ">", dt.Rows[iRow][iCol].ToString());
}
}
else
 {
for (iCol = 0; iCol < dt.Columns.Count; iCol++)
 {
strFileContent = strFileContent.Replace("<" + dt.Columns[iCol].ColumnName.ToUpper() + iRow.ToString() + ">", dt.Rows[iRow][iCol].ToString());
}
}
}

for (int iDelRow = iRows; iDelRow < 100; iDelRow++)
 {
for (int iDelCol = 0; iDelCol < dt.Columns.Count; iDelCol++)
 {
if (strFileContent.IndexOf("<" + dt.Columns[iDelCol].ColumnName.ToUpper() + iDelRow.ToString() + ">") > -1)
 {
strFileContent = strFileContent.Replace("<" + dt.Columns[iDelCol].ColumnName.ToUpper() + iDelRow.ToString() + ">", "<DELETELINE>");
}
}
}

string[] strLineArray = System.Text.RegularExpressions.Regex.Split(strFileContent, "\r\n"); //利用正则表达式来分解
strFileContent = "";
int j = 1;
foreach (string strLine in strLineArray)
 {
if (strLine.IndexOf("<DELETELINE>") > -1)
 {
continue;
}
if (j == 1)
 {
strFileContent = strLine;
j = j + 1;
}
else
 {
strFileContent = strFileContent + "\r\n" + strLine;
j = j + 1;
}
}
fileContent = strFileContent;
return true;
}
catch (Exception ex)
 {
fileContent = ex.Message;
return false;
}
}
#endregion

 //调用CodeSoft打印,首先添加引用:Lppx2.tlb(codesoft安装后文件中)#region //调用CodeSoft打印,首先添加引用:Lppx2.tlb(codesoft安装后文件中)
//打印函数,参数为打印机的命令或者其他文本!
public bool CSWrite(DataTable dt, out string Msg)
 {
string strFileName = "";

if (dt.Rows.Count == 0)
 {
Msg = "Has no label information !";
return false;
}

for (int i = 0; i < dt.Columns.Count; i++)
 {
if (dt.Columns[i].ColumnName.ToUpper().IndexOf("LABELFILE") > -1)
 {
strFileName = dt.Rows[0]["LabelFile"].ToString();
break;
}
}

if (strFileName == "")
 {
Msg = "Can not find label file name !";
return false;
}

string strFilePath = Application.StartupPath + @"\" + strFileName.Replace(".txt", ".lab").Replace(".TXT", ".lab");

if (!File.Exists(strFilePath))
 {
Msg = "Can not find label file template" + strFilePath + " !";
return false;
}

LabelManager2.ApplicationClass lbl = new LabelManager2.ApplicationClass();

try
 {
lbl.Documents.Open(strFilePath, false);// 调用设计好的label文件
LabelManager2.Document doc = lbl.ActiveDocument;


int iRow = 0;
int iCol = 0;
int iRows = 0;
iRows = dt.Rows.Count;
for (; iRow < iRows; iRow++)
 {
if (iRow == 0)
 {
for (; iCol < dt.Columns.Count; iCol++)
 {
try
 {
doc.Variables.FormVariables.Item(dt.Columns[iCol].ColumnName.ToUpper()).Value = dt.Rows[iRow][iCol].ToString(); //给参数传值
}
catch (Exception ex1)
 {
continue; //Codesoft文档中如没有该变量则跳出本次循环
}
}
}
else
 {
for (iCol = 0; iCol < dt.Columns.Count; iCol++)
 {
try
 {
doc.Variables.FormVariables.Item(dt.Columns[iCol].ColumnName.ToUpper() + iRow.ToString()).Value = dt.Rows[iRow][iCol].ToString(); //给参数传值
}
catch (Exception ex2)
 {
continue; //Codesoft文档中如没有该变量则跳出本次循环
}
}
}
}


int Num = 1; //打印数量
for (int j = 0; j < dt.Columns.Count; j++)
 {
if (dt.Columns[j].ColumnName.ToUpper().IndexOf("LABELNUM") > -1)
 {
Num = Convert.ToInt32((dt.Rows[0]["LabelNum"].ToString()));
break;
}
}

doc.PrintDocument(Num); //打印
Msg = "Pass";
return true;
}
catch (Exception ex)
 {
Msg = ex.Message;
return false;
}
finally
 {
lbl.Quit(); //退出
}
}
#endregion

 //串口打印#region //串口打印
//打印函数,参数为打印机的命令或者其他文本!
public bool COMWrite(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, string myString)
 {
try
 {
SerialPort ComPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
if (ComPort.IsOpen)
 {
ComPort.Close();
}
ComPort.Open();
ComPort.WriteLine(myString);
ComPort.Close();
return true;
}
catch (Exception ex)
 {
return false;
}
}
#endregion

 //并口打印#region //并口打印

[StructLayout(LayoutKind.Sequential)]
private struct OVERLAPPED
 {
int Internal;
int InternalHigh;
int Offset;
int OffSetHigh;
int hEvent;
}
[DllImport("kernel32.dll")]
private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

[DllImport("kernel32.dll")]
private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWriter, out int lpNumberOfBytesWriten, out OVERLAPPED lpOverLapped);

[DllImport("kernel32.dll")]
private static extern bool CloseHandle(int hObject);

private int iHandle;

//打开LPT 端口
public bool LPTOpen()
 {
iHandle = CreateFile("lpt1", 0x40000000, 0, 0, 3, 0, 0);
if (iHandle != -1)
 {
return true;
}
else
 {
return false;
}
}
//打印函数,参数为打印机的命令或者其他文本!
public bool LPTWrite(string myString)
 {
 if (!LPTOpen()) { return false; }
if (iHandle != 1)
 {
int i;
OVERLAPPED x;
byte[] mybyte = System.Text.Encoding.Default.GetBytes(myString);
//return WriteFile(iHandle, mybyte, mybyte.Length, out i, out x);
if (WriteFile(iHandle, mybyte, mybyte.Length, out i, out x))
 {
LPTClose();
return true;
}
else
 {
return false;
}

}
else
 {
throw new Exception("端口未打开~!");
return false;
}
}
//关闭打印端口
public bool LPTClose()
 {
return CloseHandle(iHandle);
}
#endregion
}
}

-
- 程序实现
private bool PrintModuleLabel(DataTable dt)
  {
string fileMsg;
if (PrintLabel.GetContent(dt,out fileMsg)==false)
 {
MessageBox.Show(fileMsg, "Module Buffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}

if (rdoCOMPort.Checked==true)
 {
string portName=cboPortName.Text.ToString().Trim();
int baudRate=Convert.ToInt32(cboBaudRate.Text.ToString().Trim());
Parity parity=Parity.None;
int dataBits=Convert.ToInt32(cboDataBits.Text.ToString().Trim());
StopBits stopBits;
switch (cboStopBits.Text.ToString().Trim())
 {
case "1":
stopBits = StopBits.One;
break;
case "2":
stopBits = StopBits.Two;
break;
case "None":
stopBits = StopBits.None;
break;
default:
stopBits = StopBits.One;
break;

}
if (PrintLabel.COMWrite(portName,baudRate,parity,dataBits,stopBits,fileMsg)==false)
 {
MessageBox.Show("COM Port Error !", "Module Buffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
else
 {
return true;
}
}
else if(rdoLPTPort.Checked==true)
 {
if (PrintLabel.LPTWrite(fileMsg)==false)
 {
MessageBox.Show("LPT Port Error !", "Module Buffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
else
 {
return true;
}
}
else
 {
string Msg;
if (PrintLabel.CSWrite(dt,out Msg)==false)
 {
MessageBox.Show(Msg, "Module Buffer", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
else
 {
return true;
}
}
}
注:以上内容,如需转载请注明出处.
-
|