做项目过程中,有一个需求,是要按照模板样式生成某个设备信息的二维码,并打印可以打印出来,于是用了以下代码实现:
1.需要按照模板打印,例如需要打印成这种布局:
可以看到,布局内不仅有文字,对象参数,二维码,方格等,所以思路是要先制作好一个固定的模板,然后打印时候将对象参数和二维码放到方格模板内即可。
于是用word制作了一个模板,并转成pdf格式
模板制作完成后开始编码
private void Print(object obj)
{
//判断要打印哪个对象参数
if (DataTableControl.SelectObjects == null) {
SystemService.MsgBoxService.ShowMsgBox("请选择要打印二维码的设备");
return;
}
//以下五行是获取刚刚制作的模板文件,看各自的需求编写,只需要获取到模板文件即可。
string fileName = "设备标签.pdf";
string date = FileFun(fileName);
string path = TempFileAccess.TempDir;
var serviceTemplatPath = path + fileName;
Model.HttpUpLoadSerivce.DownLoadUploadFile("instrument", date, fileName, serviceTemplatPath, null);
//开始编写代码打印二维码和参数(对象可能有多个,如果需求是每次只打印一个,就不需要for循环)
foreach (var i in DataTableControl.SelectObjects) {
PdfDocument document = new PdfDocument();
//通过文件路径获取刚刚下载好的模板
document.LoadFromFile(serviceTemplatPath);
DataGridRow dataGridRow = i as DataGridRow;
//使用模板页面
PdfPageBase pageIndex = document.Pages[0];
pageIndex.Canvas.SetTransparency(1f, 1f, PdfBlendMode.Overlay);
//自定义PdfTrueTypeFont、PdfPen实例
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", 12f), true);
PdfPen pen = new PdfPen(System.Drawing.Color.Black);
//使用DrawString方法在指定位置写入文本
string InstrumentName = "设备名称:" + dataGridRow.InstrumentName;
string Type = "规格型号:" + dataGridRow.Type;
string ManufacturingNumber = "出厂编号:" + dataGridRow.ManufacturingNumber;
string ManagementNumber = "管理编号:" + dataGridRow.ManagementNumber;
string SubordinateDepartments = "使用部门:" + dataGridRow.SubordinateDepartments;
string keeper = "保管人:" + dataGridRow.Keeper;
//这里的最后两个参数,是表示x,y轴长度,要根据自己的模板慢慢调好位置
pageIndex.Canvas.DrawString(InstrumentName, font, pen, 120, 150);
pageIndex.Canvas.DrawString(Type, font, pen, 120, 165);
pageIndex.Canvas.DrawString(ManufacturingNumber, font, pen, 120, 180);
pageIndex.Canvas.DrawString(ManagementNumber, font, pen, 120, 195);
pageIndex.Canvas.DrawString(SubordinateDepartments, font, pen, 120, 210);
pageIndex.Canvas.DrawString(keeper, font, pen, 120, 225);
//创建BarcodeSettings对象
BarcodeSettings settings = new BarcodeSettings();
//设置条码类型为二维码
settings.Type = BarCodeType.QRCode;
//设置二维码数据(此处二维码也可以赋值为超链接,只要扫码了就可以跳转...现在我赋值的是设备的信息)
settings.Data = InstrumentName + " " + Type + " " + ManufacturingNumber + " " + ManagementNumber + " " + SubordinateDepartments +" "+keeper;
设置显示文本
settings.Data2D = "⠀";
//设置数据类型为数字
settings.QRCodeDataMode = QRCodeDataMode.Numeric;
//设置二维码错误修正级别
settings.QRCodeECL = QRCodeECL.H;
//设置宽度
settings.X = 2.0f;
//初始化BarCodeGenerator对象
BarCodeGenerator generator = new BarCodeGenerator(settings);
//创建图片并保存为PNG格式
System.Drawing.Image image = generator.GenerateImage();
//加载缩放后的图片到PdfImage对象
PdfImage pdfImage = PdfImage.FromImage(image);
//调整图片大小
int width = image.Width;
int height = image.Height;
float scale = 0.18f; //缩放比例
SizeF size = new SizeF(width * scale, height * scale);
//设置图片位置(二维码位置)
float x = 400;
float y = 150f;
//在指定位置绘入图片
pageIndex.Canvas.DrawImage(pdfImage, new PointF(x, y), size);
//输出文件路径,并打开文件
string filePath1 = LocalPath + "\\" + Common.Util.CommonUtils.GetUUId() + ".pdf";
document.SaveToFile(filePath1);
System.Diagnostics.Process.Start(filePath1);
}
}
大功告成。
当然还有另一种情况,就是不需要模板的情况,单纯空白页面打印二维码或者参数,这个更容易些,附上代码:
private void Print(object obj)
{
if (DataTableControl.SelectObjects == null) {
SystemService.MsgBoxService.ShowMsgBox("请选择要打印二维码的设备");
return;
}
foreach (var i in DataTableControl.SelectObjects) {
PdfDocument document = new PdfDocument();
DataGridRow dataGridRow = i as DataGridRow;
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
//新页面参数
PdfMargins margins = new PdfMargins();
margins.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margins.Bottom = margins.Top;
margins.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margins.Right = margins.Left;
//添加新页(不使用模板,则要添加新页面)
PdfPageBase pageIndex = document.Pages.Add(PdfPageSize.A4, margins);
pageIndex.Canvas.SetTransparency(1f, 1f, PdfBlendMode.Overlay);
//自定义PdfTrueTypeFont、PdfPen实例
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", 12f), true);
PdfPen pen = new PdfPen(System.Drawing.Color.Black);
//使用DrawString方法在指定位置写入文本
string InstrumentName = "设备名称:" + dataGridRow.InstrumentName;
string Type = "规格型号:" + dataGridRow.Type;
string ManufacturingNumber = "出厂编号:" + dataGridRow.ManufacturingNumber;
string ManagementNumber = "管理编号:" + dataGridRow.ManagementNumber;
string SubordinateDepartments = "使用部门:" + dataGridRow.SubordinateDepartments;
string keeper = "保管人:" + dataGridRow.Keeper;
pageIndex.Canvas.DrawString(InstrumentName, font, pen, 120, 150);
pageIndex.Canvas.DrawString(Type, font, pen, 120, 165);
pageIndex.Canvas.DrawString(ManufacturingNumber, font, pen, 120, 180);
pageIndex.Canvas.DrawString(ManagementNumber, font, pen, 120, 195);
pageIndex.Canvas.DrawString(SubordinateDepartments, font, pen, 120, 210);
pageIndex.Canvas.DrawString(keeper, font, pen, 120, 225);
//创建BarcodeSettings对象
BarcodeSettings settings = new BarcodeSettings();
//设置条码类型为二维码
settings.Type = BarCodeType.QRCode;
//设置二维码数据
settings.Data = InstrumentName + " " + Type + " " + ManufacturingNumber + " " + ManagementNumber + " " + SubordinateDepartments +" "+keeper;
设置显示文本
settings.Data2D = "⠀";
//设置数据类型为数字
settings.QRCodeDataMode = QRCodeDataMode.Numeric;
//设置二维码错误修正级别
settings.QRCodeECL = QRCodeECL.H;
//设置宽度
settings.X = 2.0f;
//初始化BarCodeGenerator对象
BarCodeGenerator generator = new BarCodeGenerator(settings);
//创建图片并保存为PNG格式
System.Drawing.Image image = generator.GenerateImage();
//加载缩放后的图片到PdfImage对象
PdfImage pdfImage = PdfImage.FromImage(image);
//调整图片大小
int width = image.Width;
int height = image.Height;
float scale = 0.18f; //缩放比例
SizeF size = new SizeF(width * scale, height * scale);
//设置图片位置
float x = 250;
float y = 150;
//在指定位置绘入图片
pageIndex.Canvas.DrawImage(pdfImage, new PointF(x, y), size);
string filePath1 = LocalPath + "\\" + Common.Util.CommonUtils.GetUUId() + ".pdf";
document.SaveToFile(filePath1);
System.Diagnostics.Process.Start(filePath1);
}
}
打印的效果也是比较完美的。