您的位置:首页 > 编程语言 > C#

C#利用zxing.net生成二维码和条形码并实现打印的功能

2014-04-03 21:55 1506 查看
C#利用Zxing.net生成条形码和二维码并实现打印的功能
开篇:zxing.net是.net平台下编解条形码和二维码的工具。
下载地址:http://pan.baidu.com/s/1kTr3Vuf
Step1:使用VS2010新建一个窗体程序项目:



Step2:添加三个类:分别是BarCodeClass.cs、DocementBase.cs、imageDocument.cs。(下一步贴出这些类的代码);;;;添加下载回来的引用zxing.dll。
》说明:
《1》 BarCodeClass.cs主要用来实现条形码和二维码的生成和解析。
《2》 DocementBase.cs、imageDocument.cs这两个类是用来实现对生成的条形码和二维码进行打印。



Step3:编写上一步的三个类的代码:
》BarCodeClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZXing.Common;
using ZXing;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using ZXing.QrCode;
namespace BarCode
{
class
BarCodeClass
{
///<summary>
///生成条形码
///</summary>
///<paramname="pictureBox1"></param>
///<paramname="Contents"></param>
public
void CreateBarCode(PictureBoxpictureBox1,string Contents)
{
Regexrg =
new Regex("^[0-9]{12}$");
if(!rg.IsMatch(Contents))
{
MessageBox.Show("本例子采用EAN_13编码,需要输入12位数字");
return;
}

EncodingOptionsoptions =null;
BarcodeWriterwriter =null;
options = newEncodingOptions
{
Width = pictureBox1.Width,
Height = pictureBox1.Height
};
writer = newBarcodeWriter();
writer.Format = BarcodeFormat.ITF;
writer.Options = options;

Bitmapbitmap = writer.Write(Contents);
pictureBox1.Image = bitmap;
}

///<summary>
///生成二维码
///</summary>
///<paramname="pictureBox1"></param>
///<paramname="Contents"></param>
public
void CreateQuickMark(PictureBoxpictureBox1,string Contents)
{
if(Contents ==
string.Empty)
{
MessageBox.Show("输入内容不能为空!");
return;
}

EncodingOptionsoptions =null;
BarcodeWriterwriter =null;

options = newQrCodeEncodingOptions
{
DisableECI = true,
CharacterSet = "UTF-8",
Width = pictureBox1.Width,
Height = pictureBox1.Height
};
writer = newBarcodeWriter();
writer.Format = BarcodeFormat.QR_CODE;
writer.Options = options;

Bitmapbitmap = writer.Write(Contents);
pictureBox1.Image = bitmap;
}

///<summary>
///解码
///</summary>
///<paramname="pictureBox1"></param>
public
void Decode(PictureBoxpictureBox1)
{
BarcodeReaderreader =new
BarcodeReader();
Resultresult = reader.Decode((Bitmap)pictureBox1.Image);
}
}
}

》DocementBase.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing.Printing;
using System.Drawing;
using System.Windows.Forms;

namespace BarCode
{
class
DocementBase : PrintDocument
{
//fields
public
Font Font = new
Font("Verdana",10,
GraphicsUnit.Point);

//预览打印
public
DialogResult showPrintPreviewDialog()
{
PrintPreviewDialogdialog =new
PrintPreviewDialog();
dialog.Document = this;

returndialog.ShowDialog();
}

//先设置后打印
public
DialogResult ShowPageSettingsDialog()
{
PageSetupDialogdialog =new
PageSetupDialog();
dialog.Document = this;

returndialog.ShowDialog();
}
}
}

》imageDocument.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;

namespace BarCode
{
class
imageDocument : DocementBase
{
privateImage _Image;

public
Image Image
{
get
{
return_Image;
}
set
{
_Image = value;

if(_Image !=
null)
{
if(_Image.Size.Width > _Image.Size.Height)
DefaultPageSettings.Landscape =
true;
else
DefaultPageSettings.Landscape =
false;
}
}
}

publicimageDocument()
{

}

publicimageDocument(Image image)
{
this.Image= image;
}

protectedoverridevoidOnPrintPage(PrintPageEventArgs e)
{
if(Image ==
null)
{
thrownewInvalidOperationException();
}

RectanglebestFit = GetBestFitRectangle(e.MarginBounds, Image.Size);

e.Graphics.DrawImage(Image, bestFit);

e.Graphics.DrawRectangle(Pens.Black, bestFit);
e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds);
}

// 保持高度比:参数为(打印边界的Rectangularle对象,图像大小的Size对象)
protectedRectangle GetBestFitRectangle(Rectangle toContain,SizeobjectSize)
{
//检查页面是水平还是竖直的。
boolcontainerLandscape =false;
if(toContain.Width > toContain.Height)
containerLandscape = true;

//高度比=图像的高/图像的宽
floataspectRatio = (float)objectSize.Height / (float)objectSize.Width;
//得到页面左上角的坐标
intmidContainerX = toContain.Left + (toContain.Width / 2);
intmidContainerY = toContain.Top + (toContain.Height / 2);

intx1 = 0, x2 = 0, y1 = 0, y2 = 0;
if(containerLandscape ==false)
{
//竖直图像
x1 = toContain.Left;
x2 = toContain.Right;
//调整之后的height
intadjustedHeight = (int)((float)toContain.Width * aspectRatio);

y1 = midContainerY -(adjustedHeight / 2);
y2 = y1 + adjustedHeight;
}
else
{
y1 = toContain.Top;
y2 = toContain.Bottom;
//调整之后的height
intadjustedWidth = (int)((float)toContain.Height/ aspectRatio);

x1 = midContainerX -(adjustedWidth / 2);
x2 = x1 + adjustedWidth;
}
returnnewRectangle(x1,y1, x2 - x1, y2 - y1);
}
}
}

Step4:修改界面。



Step5:依次双击【生成条形码】、【生成二维码】、【解码】、【打印】等按钮,进入Click事件,编写后台代码。这里不再一一讲述如何实现。代码参照下一步:

Step6:贴出窗体的全部代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using ZXing;
using ZXing.QrCode.Internal;
using ZXing.Common;
using System.IO;
using ZXing.QrCode;

namespace BarCode
{
public
partial class
Main : Form
{
publicMain()
{
InitializeComponent();
}

private
BarCodeClass bcc = newBarCodeClass();
private
DocementBase _docement;

//生成条形码
privatevoid button1_Click(objectsender,EventArgs e)
{

bcc.CreateBarCode(pictureBox1,txtMsg.Text);

}
//生成二维码
privatevoid button2_Click(objectsender,EventArgs e)
{
bcc.CreateQuickMark(pictureBox1, txtMsg.Text);
}

privatevoid Form1_Load(objectsender,EventArgs e)
{
txtMsg.Text = System.DateTime.Now.ToString("yyyyMMddhhmmss").Substring(0,12);
}
//解码
privatevoid button4_Click(objectsender,EventArgs e)
{
if(pictureBox1.Image ==null)
{
MessageBox.Show("请录入图像后再进行解码!");
return;
}
BarcodeReaderreader =new
BarcodeReader();
Resultresult = reader.Decode((Bitmap)pictureBox1.Image);
MessageBox.Show(result.Text);
}

//打印
privatevoid button3_Click(objectsender,EventArgs e)
{

if(pictureBox1.Image ==null)
{
MessageBox.Show("You Must Load an Image first!");
return;
}
else
{
_docement=new
imageDocument(pictureBox1.Image);
}
_docement.showPrintPreviewDialog();
}
}

}

Step7:剩下的就是演示了:本机演示结果如下:
》运行程序:点击【生成条形码】,结果如下:



》点击【解码】按钮,结果如下:



》点击《打印》按钮,结果如下:



》点击【生成二维码】按钮,结果如下:



》点击【解码】按钮,结果如下:




》点击【打印】按钮,结果如下:



总结:若有不足,请各位提出批评。
(分享快乐!!!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: