生成条码(图1)、二维码(图2)图片及打印出二维码标签(图3)效果
图1 图2 图3
示例代码下载
DLL说明
BarcodeLib.dll--生成条码图片组件
ThoughtWorks.QRCode.dll--生成二维码图片组件
FNTHEX32.DLL--用于斑马条码打印机打印中文
注:打印机名称在Web.config 文件中
网络共享打印机:\\网络计算机名称或IP\网络打印机名称
本地打印机:打印机名称
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.Data;
namespace PrintLib.Printers.Zebra
{
using System = global::System;
using ThoughtWorks.QRCode.Codec;
using System.Drawing;
using System.Drawing.Printing;
public class Printer
{
public string Name;
#region 从Web.config文件中获取打印机名称,如
public Printer()
{
this.Name = System.Configuration.ConfigurationManager.AppSettings["Printer"];
}
public Printer(string name)
{
this.Name = name;
}
#endregion
#region DLL声明
//ZPL
[DllImport(@"FNTHEX32.DLL", CharSet = CharSet.Ansi)]
public static extern int GETFONTHEX(
string chnstr,
string fontname,
string chnname,
int orient,
int height,
int width,
int bold,
int italic,
StringBuilder param1);
//EPL
[DllImport(@"Eltronp.dll", CharSet = CharSet.Ansi)]
public static extern int PrintHZ(int Lpt, //0:LPT1,1 LPT2
int x,
int y,
string HZBuf,
string FontName,
int FontSize,
int FontStyle);
#endregion
#region 指令说明
/**
^XA 开始 ^XZ 结束
^LH起始坐标 ^PR进纸回纸速度 ^MD 对比度
^FO标签左上角坐标 ^XG打印图片参数1图片名称后两个为坐标
^FS标签结束符 ^CI切换国际字体 ^FT坐标 ^FD定义一个字符串
^A定义字体 ^FH十六进制数 ^BY模块化label ^BC条形码128
^PQ打印设置 参数一 打印数量 参数二暂停 参数三重复数量 参数四为Y时表明无暂停
**/
#endregion
#region PrintDocument 打印条码、二维码
public void Print()
{
System.Drawing.Printing.PrintDocument _Document = new System.Drawing.Printing.PrintDocument();
_Document.PrintPage += _Document_PrintPage;
PageSettings pageSet = new PageSettings();
pageSet.Landscape = false;
pageSet.Margins.Top = 0;
pageSet.Margins.Left = 1;
pageSet.PaperSize = new System.Drawing.Printing.PaperSize("小票", 2, 2);
_Document.DefaultPageSettings = pageSet;
_Document.Print();
}
void _Document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
float x = 0;
float y = 0;
float width = 300;
float height = 60;
e.Graphics.DrawImage(CreateBarcodeImage("--test--",""), x, y, width, height);
e.HasMorePages = false;
}
#endregion
#region ZPL 打印条码、二维码
///
/// 条码打印(标签两列)
///
/// 左边距 推荐值:0
/// 上边距 推荐值:0
/// 第一列与第二列的距离 推荐值:0
/// 条码高 推荐值:0
/// 条码内容1,内容2两个字符串 推荐值:11位字母数字组成
/// true /false 执行状态
public bool PrintBarcode(int l,int h,int cl,int bch, params string[] str)
{
l = l == 0 ? 0 : l;
h = h == 0 ? 8 : h;
cl = cl == 0 ? 30 : cl;
bch = bch == 0 ? 100 : bch;
StringBuilder sb = new StringBuilder();
sb.Append("^XA");
//连续打印两列(单列只写一条)
sb.Append(string.Format("^MD30^LH{0},{1}^FO{2},{3}^ACN,18,10^BY1.8,3,{4}^BC,,Y,N^FD{5}^FS", l, h, l, h, bch, str[0]));
sb.Append(string.Format("^MD30^LH{0},{1}^FO{2},{3}^ACN,18,10^BY1.8,3,{4}^BC,,Y,N^FD{5}^FS", l, h, l + cl, h, bch, str[1]));
sb.Append("^XZ");
return RawPrinterHelper.SendStringToPrinter(this.Name, sb.ToString());
}
///
/// 二维码打印(标签两列)
///
/// 左边距 推荐值:0
/// 上边距 推荐值:0
/// 第一列与第二列的距离 推荐值:0
/// 二维码放大倍数 推荐值:0
/// 内容1,内容2两个字符串 推荐值:字母数字组成(位数不限制)
/// true /false 执行状态
public bool PrintQRCode(int l, int h, int cl, int bch, params string[] str)
{
if (str.Length <2) return false;
string[] str0 = str[0].Split(',');
string[] str1 = str[1].Split(',');
l = l == 0 ? 5 : l;
h = h == 0 ? 8 : h;
cl = cl == 0 ? 360 : cl;
bch = bch == 0 ? 5 : bch;
StringBuilder sb = new StringBuilder();
sb.Append("^XA");
sb.Append(string.Format("^LH{0},{1}^FO{2},{3}^BQ,2,{4}^FDQA,{5}^FS", l, h, 0, h, bch, str0[0]));
sb.Append(TextToHex(str0[1], str0[0], 24));
sb.Append(string.Format("^FT{0},{1}^XG{2},1,1^FS", 125+l, h+60, str0[0]));
sb.Append(TextToHex(str0[0], str0[0], 20));
sb.Append(string.Format("^FT{0},{1}^XG{2},1,1^FS", 125 + l, h + 90, str0[0]));
sb.Append(string.Format("^LH{0},{1}^FO{2},{3}^BQ,2,{4}^FDQA,{5}^FS", l, h, 0 + cl, h, bch, str1[0]));
sb.Append(TextToHex(str1[1], str1[0], 24));
sb.Append(string.Format("^FT{0},{1}^XG{2},1,1^FS", 125 + cl + l, h + 60, str1[0]));
sb.Append(TextToHex(str1[0], str1[0], 20));
sb.Append(string.Format("^FT{0},{1}^XG{2},1,1^FS", 125 + cl + l, h + 90, str1[0]));
sb.Append("^XZ");
return RawPrinterHelper.SendStringToPrinter(this.Name, sb.ToString());
}
#endregion
#region 条码、二维码图片生成
///
/// 生成条形码图片
///
/// 条形码序列号
/// 图片存放路径(绝对路径)
/// 返回图片
public System.Drawing.Image CreateBarcodeImage(string num, string path)
{
BarcodeLib.Barcode b = new BarcodeLib.Barcode();
b.BackColor = System.Drawing.Color.White;
b.ForeColor = System.Drawing.Color.Black;
b.IncludeLabel = true;
b.Alignment = BarcodeLib.AlignmentPositions.CENTER;
b.LabelPosition = BarcodeLib.LabelPositions.BOTTOMCENTER;
b.ImageFormat = System.Drawing.Imaging.ImageFormat.Png;
System.Drawing.Font font = new System.Drawing.Font("verdana", 10f);
b.LabelFont = font;
try
{
System.Drawing.Image image = b.Encode(BarcodeLib.TYPE.CODE128B, num);
image.Save(path);
return image;
}
catch (Exception)
{
}
return null;
}
///
/// 生成二维码图片
///
/// 二维码序列号
/// 图片存放路径(绝对路径)
/// 返回图片
public System.Drawing.Image CreateQRCodeImage(string num,string path)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
String encoding = "Byte";
if (encoding == "Byte")
{
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
}
else if (encoding == "AlphaNumeric")
{
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
}
else if (encoding == "Numeric")
{
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
}
try
{
int scale = Convert.ToInt16(4);
qrCodeEncoder.QRCodeScale = scale;
}
catch (Exception)
{
}
try
{
int version = Convert.ToInt16(7);
qrCodeEncoder.QRCodeVersion = version;
}
catch (Exception)
{
}
string errorCorrect = "M";
if (errorCorrect == "L")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
else if (errorCorrect == "M")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
else if (errorCorrect == "Q")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
else if (errorCorrect == "H")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
try
{
Bitmap bm = qrCodeEncoder.Encode(num);
bm.Save(path);
MemoryStream ms = new MemoryStream();
bm.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return System.Drawing.Image.FromStream(ms);
}
catch (Exception)
{
}
return null;
}
#endregion
#region ZPL 打印中文小票
public string TextToHex(string text, string textId, int height)
{
StringBuilder hexBuilder = new StringBuilder(4 * 1024);
int subStrCount = 0;
subStrCount = GETFONTHEX(text, "Arial", textId, 0, height, 0, 1, 0, hexBuilder);
return hexBuilder.ToString().Substring(0, subStrCount);
}
public string DeviceLabelToHex(string text, string textId)
{
StringBuilder hexBuilder = new StringBuilder(4 * 1024);
int subStrCount = 0;
subStrCount = GETFONTHEX(text, "Arial", textId, 0, 40, 0, 1, 0, hexBuilder);
return hexBuilder.ToString().Substring(0, subStrCount);
}
public bool IsZebraPrinter(string printerName)
{
return printerName.IndexOf("ZDesigner") + printerName.IndexOf("Zebra") >= -1;
}
public void ZPLPrintDeviceLabel(DataTable dt, int copies)
{
ZPLPrintDeviceLabel(dt, true, copies);
}
public void ZPLPrintDeviceLabel(DataTable dt, bool isRequireTextToHex, int copies)
{
Project.Printers.Prints.Label label = null;
for (int i = 0; i < copies; i++)
{
foreach (DataRow row in dt.Rows)
{
List labelList = new List();
label = new Project.Printers.Prints.Label();
#region Data
label.Id = "HName";
label.Text = row["HName"].ToString();
label.XPos = 150;
label.YPos = 60;
labelList.Add(label);
label = new Project.Printers.Prints.Label();
label.Id = "AName";
label.Text = row["AName"].ToString();
label.XPos = 10;
label.YPos = 140;
labelList.Add(label);
//label = new Project.Printers.Prints.Label();
//label.Id = "name1";
//label.Text = row["name1"].ToString();
//label.XPos = 70;
//label.YPos = 180;
//labelList.Add(label);
label = new Project.Printers.Prints.Label();
label.Id = "ANo";
label.Text = row["ANo"].ToString();
label.XPos = 10;
label.YPos = 185;
labelList.Add(label);
//label = new Project.Printers.Prints.Label();
//label.Id = "No1";
//label.Text = row["No1"].ToString();
//label.XPos = 70;
//label.YPos = 245;
//labelList.Add(label);
label = new Project.Printers.Prints.Label();
label.Id = "UResponsible";
label.Text = row["UResponsible"].ToString();
label.XPos = 10;
label.YPos = 234;
labelList.Add(label);
//label = new Project.Printers.Prints.Label();
//label.Id = "Responsible1";
//label.Text = row["Responsible1"].ToString();
//label.XPos = 70;
//label.YPos = 305;
//labelList.Add(label);
label = new Project.Printers.Prints.Label();
label.Id = "RPerson";
label.Text = row["RPerson"].ToString();
label.XPos = 325;
label.YPos = 140;
labelList.Add(label);
//label = new Project.Printers.Prints.Label();
//label.Id = "Person1";
//label.Text = row["Person1"].ToString();
//label.XPos = 355;
//label.YPos = 180;
//labelList.Add(label);
label = new Project.Printers.Prints.Label();
label.Id = "BDate";
label.Text = row["BDate"].ToString();
label.XPos = 10;
label.YPos =334;
labelList.Add(label); label = new Project.Printers.Prints.Label();
label.Id = "UPrice";
label.Text = row["UPrice"].ToString();
label.XPos = 325;
label.YPos = 185;
labelList.Add(label);
labelList.Add(label); label = new Project.Printers.Prints.Label();
label.Id = "MResponsible";
label.Text = row["MResponsible"].ToString();
label.XPos = 10;
label.YPos = 280;
#endregion
labelList.Add(label);
if (isRequireTextToHex)
{
ZPLPrintLabels(this.Name, labelList.ToArray(), 100);
}
else
{
ZPLPrintLabelsWithHexText(this.Name, labelList.ToArray());
}
}
}
}
private void ZPLPrintLabelsWithHexText(string printerName, Project.Printers.Prints.Label[] labels)
{
string labelIdCmd = string.Empty;
string labelContentCmd = string.Empty;
foreach (Project.Printers.Prints.Label label in labels)
{
labelIdCmd += "^FT" + label.XPos.ToString() + "," + label.YPos.ToString() + "^XG" + label.Id + ",1,1^FS";
labelContentCmd += label.Text;
}
string content = labelContentCmd
+ "^XA^LH0,0^PR2,2^MD20^FO0,0"
+ labelIdCmd
+ "^PQ1,0,1,Y^XZ";
RawPrinterHelper.SendStringToPrinter(printerName, content);
}
private void ZPLPrintLabels(string printerName, Project.Printers.Prints.Label[] labels, int height)
{
string labelIdCmd = string.Empty;
string labelContentCmd = string.Empty;
string headTitle = string.Empty;
string barcodeNo = string.Empty;
foreach (Project.Printers.Prints.Label label in labels)
{
labelIdCmd += "^FT" + label.XPos.ToString() + "," + label.YPos.ToString() + "^XG" + label.Id + ",1,1^FS";
if (label.Id == "HName")
{
//headTitle += "^FDMA," + label.Id + "^FS";
}
if (label.Id == "ANo")
{
barcodeNo += "^FDMA,YF10069^FS";
}
labelContentCmd += TextToHex(label.Text, label.Id, height);
}
#region 打印具有格式的小票
string content = labelContentCmd
+ "^XA^LH0,0^PR2,2^MD20^FO0,0"
//+ headTitle
+ "^FO20,80^GB560,0,3^FS"
+ labelIdCmd
+ "^FT455,340^BQN,2,4"
+ barcodeNo
+ "^PQ1,0,1,Y^XZ";
RawPrinterHelper.SendStringToPrinter(printerName, content);
#endregion
}
#endregion
}
}
调用方法
using System;
using System.Data;
using PrintLib.Printers.Zebra;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
//打印 小票(标签)
protected void Button3_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable("table1");
dt.Columns.Add(new DataColumn("HName", typeof(string)));
dt.Columns.Add(new DataColumn("AName", typeof(string)));
dt.Columns.Add(new DataColumn("ANo", typeof(string)));
dt.Columns.Add(new DataColumn("UResponsible", typeof(string)));
dt.Columns.Add(new DataColumn("MResponsible", typeof(string)));
dt.Columns.Add(new DataColumn("RPerson", typeof(string)));
dt.Columns.Add(new DataColumn("UPrice", typeof(string)));
dt.Columns.Add(new DataColumn("BDate", typeof(string)));
DataRow row = dt.NewRow();
row["HName"] = "第二炮兵工程大学";
row["AName"] = "资产名称" + " 笔记本";
row["ANo"] = "资产编号"+" YF10069";
row["UResponsible"] = "使用单位" + " 营房处";
row["MResponsible"] = "管理单位" + " 教保处";
row["RPerson"] = "负责人" +" 丁延龙";
row["BDate"] = "购置日期 "+System.DateTime.Now.ToShortDateString();
row["UPrice"] = "单价 0";
dt.Rows.Add(row);
Printer printer = new Printer();
printer.ZPLPrintDeviceLabel(dt, 1);
#region old print mode
//PrinterWSR.ZebraPrinter zebraPrinterWS = new PrinterWSR.ZebraPrinter();
zebraPrinterWS.de
//Process p = new Process();
//try
//{
// p.StartInfo.FileName = @"D:\Debug\PrintApp.exe";
// p.StartInfo.UseShellExecute = false;
// p.StartInfo.RedirectStandardInput = true;
// p.StartInfo.RedirectStandardOutput = true;
// p.StartInfo.CreateNoWindow = false;
// p.Start();
// //p.StandardInput.WriteLine(TextBox1.Text.Trim());
// //Process.Start("D:/Debug/PrintApp.exe", TextBox1.Text.Trim());
//}
//catch
//{
//}
//finally
//{
// p.WaitForExit();
// p.Dispose();
//}
p.Kill();
#endregion
}
//生成图片
protected void Button1_Click(object sender, EventArgs e)
{
//根据一定的规则,生成序列号作为唯一标识 如:
string num = "01008D004Q-0";
string fileName = num+".png";
//生成条形码
try
{
String savePath = Server.MapPath("BarcodeImages") + "/" + fileName;
new PrintLib.Printers.Zebra.Printer().CreateBarcodeImage(num, savePath);
this.Image1.ImageUrl = "BarcodeImages/" + fileName;
}
catch (Exception)
{
}
//生成二维码图片
try
{
String savePath = Server.MapPath("QRCodeImages") + "/" + fileName;
new PrintLib.Printers.Zebra.Printer().CreateQRCodeImage(num, savePath);
this.Image2.ImageUrl = "QRCodeImages/" + fileName;
}
catch (Exception)
{
}
}
//打印
protected void Button2_Click(object sender, EventArgs e)
{
//批量打印时先从选中的记录中取出序列号放入一个字符型数组中 如:{"序列号1,名称1","序列号2,名称2"}
string[] str = new string[] { "01008D004Q-0,试件名称!" ,"01008D004Q-2,试件名称2!" };
/*
单列打印请修改
* PrintLib.Printers.Zebra.Printer().PrintQRCode方法中的打印指令
*/
//执行批量打印(双列标签)
for (int i = 0; i < str.Length; i++)
{
if ((i + 1) == str.Length)
{
new PrintLib.Printers.Zebra.Printer().PrintQRCode(0, 0, 0, 0, str[i], str[i]);
}
else
{
new PrintLib.Printers.Zebra.Printer().PrintQRCode(0, 0, 0, 0, str[i], str[i + 1]);
}
i++;
}
/*
for (int i = 0; i < str.Length; i++)
{
if ((i + 1) == str.Length)
{
new PrintLib.Printers.Zebra.Printer().PrintBarcode(0, 0, 0, 0, str[i], str[i]);
}
else
{
new PrintLib.Printers.Zebra.Printer().PrintBarcode(0, 0, 0, 0, str[i], str[i + 1]);
}
i++;
}*/
}
}