C#实现二维码打印模板(PDF格式)

做项目过程中,有一个需求,是要按照模板样式生成某个设备信息的二维码,并打印可以打印出来,于是用了以下代码实现:

1.需要按照模板打印,例如需要打印成这种布局:C#实现二维码打印模板(PDF格式)_第1张图片
可以看到,布局内不仅有文字,对象参数,二维码,方格等,所以思路是要先制作好一个固定的模板,然后打印时候将对象参数和二维码放到方格模板内即可。

于是用word制作了一个模板,并转成pdf格式
C#实现二维码打印模板(PDF格式)_第2张图片
模板制作完成后开始编码

        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);
            }
        }

这样就已经完成了,看看打印的效果:
C#实现二维码打印模板(PDF格式)_第3张图片

大功告成。

当然还有另一种情况,就是不需要模板的情况,单纯空白页面打印二维码或者参数,这个更容易些,附上代码:

        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);
            }
        }

打印的效果也是比较完美的。

你可能感兴趣的:(笔记,c#)