管理网站建设,wordpress 主题未翻译,做网站360好还是百度好,如何利用网络广告提升营销竞争力使用GDI画图片生成合成图片并调用打印机进行图片打印
新建窗体应用程序PrinterDemo#xff0c;将默认的Form1重命名为FormPrinter#xff0c;添加对
Newtonsoft.Json.dll用于读写Json字符串
zxing.dll#xff0c;zxing.presentation.dll用于生成条形码#xff0c;二维码…使用GDI画图片生成合成图片并调用打印机进行图片打印
新建窗体应用程序PrinterDemo将默认的Form1重命名为FormPrinter添加对
Newtonsoft.Json.dll用于读写Json字符串
zxing.dllzxing.presentation.dll用于生成条形码二维码
三个类库的引用。
一、新建打印配置类PrintConfig
PrintConfig.cs源程序为
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace PrinterDemo
{/// summary/// 打印某一个矩形Rectangle的配置所有文本图片条码都认为是一个矩形区域由(x,y,width,height)组成/// /summarypublic class PrintConfig{/// summary/// 打印的具体内容条形码二维码对应的字符串内容/// /summarypublic string PrintMessage { get; set; }/// summary/// 打印的左上角X坐标以像素为单位/// /summarypublic int X { set; get; }/// summary/// 打印的左上角Y坐标以像素为单位/// /summarypublic int Y { set; get; }/// summary/// 宽度以像素为单位/// /summarypublic int Width { set; get; }/// summary/// 高度以像素为单位/// /summarypublic int Height { set; get; }/// summary/// 打印模式枚举条形码二维码纯文本图片【显示枚举类型为字符串而不是整数】/// /summary[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]public PrintMode PrintMode { set; get; }/// summary/// 字体大小/// /summarypublic float FontSize { set; get; }/// summary/// 图片路径当打印模式为图片PrintMode.Image时有效其他默认为空/// /summarypublic string ImagePath { get; set; }}/// summary/// 打印模式枚举/// /summary[Flags]public enum PrintMode{/// summary/// 条形码Code128/// /summaryCode128 1,/// summary/// 二维码QRCode/// /summaryQRCode 2,/// summary/// 纯文本/// /summaryText 4,/// summary/// 图片/// /summaryImage 8}
}二、新建打印配置读写类CommonUtil
CommonUtil.cs源程序如下
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace PrinterDemo
{public class CommonUtil{/// summary/// 打印配置json文件路径/// /summaryprivate static string configJsonPath AppDomain.CurrentDomain.BaseDirectory printConfig.json;/// summary/// 读取打印配置/// /summary/// returns/returnspublic static ListPrintConfig ReadPrintConfig() {ListPrintConfig printConfigList new ListPrintConfig();if (!File.Exists(configJsonPath)){return printConfigList;}string contents File.ReadAllText(configJsonPath, Encoding.UTF8);printConfigList Newtonsoft.Json.JsonConvert.DeserializeObjectListPrintConfig(contents);return printConfigList;}/// summary/// 保存打印配置/// /summary/// param nameprintConfigList/param/// returns/returnspublic static void SavePrintConfig(ListPrintConfig printConfigList){string contents Newtonsoft.Json.JsonConvert.SerializeObject(printConfigList, Newtonsoft.Json.Formatting.Indented);File.WriteAllText(configJsonPath, contents, Encoding.UTF8);}}
}三、对应的配置json文件 printConfig.json printConfig.json的测试内容是
[{PrintMessage: Snake123456789ABCDEF,X: 10,Y: 10,Width: 320,Height: 80,PrintMode: Code128,FontSize: 16.0,ImagePath: },{PrintMessage: Snake123456789ABCDEF,X: 80,Y: 120,Width: 180,Height: 180,PrintMode: QRCode,FontSize: 15.0,ImagePath: },{PrintMessage: 打印图片,X: 370,Y: 80,Width: 120,Height: 120,PrintMode: Image,FontSize: 12.0,ImagePath: images\\test.png},{PrintMessage: 这是测试纯文本ABC8,需要在Paint事件中显示文字,X: 10,Y: 320,Width: 400,Height: 30,PrintMode: Text,FontSize: 13.0,ImagePath: }
]
四、新建关键类文件PrinterUtil用于合成图片【文本条形码均为图片】
PrinterUtil.cs源程序如下
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZXing;
using ZXing.QrCode;namespace PrinterDemo
{/// summary/// 调用打印机打印图片和文字/// /summarypublic class PrinterUtil{/// summary/// 使用打印机打印由文本、二维码等合成的图片/// 自动生成图片后打印/// 斯内科 20240206/// /summary/// param nameprintConfigList打印设置列表/param/// param nameprinterName打印机名称/param/// returns/returnspublic static bool PrintCompositePicture(ListPrintConfig printConfigList, string printerName){ try{Bitmap printImg GeneratePrintImage(printConfigList);return PrintImage(printerName, printImg);}catch (Exception ex){System.Windows.Forms.MessageBox.Show($打印异常{ex.Message}, 出错);return false;}}/// summary/// 生成需要打印的条码和文本等组合的图片/// /summary/// param namelistPrintset/param/// returns/returnspublic static Bitmap GeneratePrintImage(ListPrintConfig printConfigList){ListBitmap listbitmap new ListBitmap();//合并图像for (int i 0; i printConfigList.Count; i){Bitmap bitmap new Bitmap(10, 10);switch (printConfigList[i].PrintMode){case PrintMode.Code128:bitmap GenerateBarcodeImage(printConfigList[i].PrintMessage, printConfigList[i].Width, printConfigList[i].Height, BarcodeFormat.CODE_128, 1);break;case PrintMode.QRCode:bitmap GenerateBarcodeImage(printConfigList[i].PrintMessage, printConfigList[i].Width, printConfigList[i].Height, BarcodeFormat.QR_CODE, 1);break;case PrintMode.Text:bitmap GenerateStringImage(printConfigList[i].PrintMessage, printConfigList[i].Width, printConfigList[i].Height, printConfigList[i].X, printConfigList[i].Y, printConfigList[i].FontSize);break;case PrintMode.Image:bitmap (Bitmap)Image.FromFile(AppDomain.CurrentDomain.BaseDirectory printConfigList[i].ImagePath);break;}listbitmap.Add(bitmap);}//创建要显示的图片对象,根据参数的个数设置宽度Bitmap backgroudImg new Bitmap(600, 400);Graphics g Graphics.FromImage(backgroudImg);//清除画布,背景设置为白色g.Clear(System.Drawing.Color.White);//设置为 抗锯齿 g.SmoothingMode SmoothingMode.AntiAlias;g.SmoothingMode SmoothingMode.HighQuality;g.CompositingQuality CompositingQuality.HighQuality;g.InterpolationMode InterpolationMode.HighQualityBicubic;for (int i 0; i printConfigList.Count; i){g.DrawImage(listbitmap[i], printConfigList[i].X, printConfigList[i].Y, listbitmap[i].Width, listbitmap[i].Height);}return backgroudImg;}/// summary/// 生成条码图片【barcodeFormat一维条形码二维码】/// /summary/// param namecodeContent打印条码对应的字符串/param/// param namewidth/param/// param nameheight/param/// param namebarcodeFormat条码格式CODE_128代表一维条码QR_CODE代表二维码/param/// param namemargin/param/// returns/returnspublic static Bitmap GenerateBarcodeImage(string codeContent, int width, int height, BarcodeFormat barcodeFormat, int margin 1){// 1.设置QR二维码的规格QrCodeEncodingOptions qrEncodeOption new QrCodeEncodingOptions();qrEncodeOption.DisableECI true;qrEncodeOption.CharacterSet UTF-8; // 设置编码格式否则读取中文乱码qrEncodeOption.Height height;qrEncodeOption.Width width;qrEncodeOption.Margin margin; // 设置周围空白边距qrEncodeOption.PureBarcode true;// 2.生成条形码图片BarcodeWriter wr new BarcodeWriter();wr.Format barcodeFormat; // 二维码 BarcodeFormat.QR_CODEwr.Options qrEncodeOption;Bitmap img wr.Write(codeContent);return img;}/// summary/// 生成字符串图片/// /summary/// param namecodeContent/param/// param namewidth/param/// param nameheight/param/// param namex/param/// param namey/param/// param nameemSize/param/// returns/returnspublic static Bitmap GenerateStringImage(string codeContent, int width, int height, int x, int y, float emSize 9f){Bitmap imageTxt new Bitmap(width, height);Graphics graphics Graphics.FromImage(imageTxt);Font font new Font(黑体, emSize, FontStyle.Regular);Rectangle destRect new Rectangle(x, y, width, height);LinearGradientBrush brush new LinearGradientBrush(destRect, Color.Black, Color.Black, 0, true);RectangleF rectangleF new RectangleF(x, y, width, height);graphics.DrawString(codeContent, font, brush, rectangleF);return imageTxt;}/// summary/// 调用打印机 打印条码和文本 图片/// /summary/// param nameprinterName打印机名称/param/// param nameimage/param/// returns/returnsprivate static bool PrintImage(string printerName, Bitmap image){if (image ! null){PrintDocument pd new PrintDocument();//打印事件设置pd.PrintPage new PrintPageEventHandler((w, e) {int x 0;int y 5;int width image.Width;int height image.Height;Rectangle destRect new Rectangle(x, y, width 200, height 200);e.Graphics.DrawImage(image, destRect, 2, 2, image.Width, image.Height, System.Drawing.GraphicsUnit.Millimeter);});PrinterSettings printerSettings new PrinterSettings{PrinterName printerName};pd.PrinterSettings printerSettings;pd.PrintController new StandardPrintController();//隐藏打印时屏幕左上角会弹出的指示窗try{//设置纸张高度和大小int w 800;//(int)(PaperWidth * 40);原600300int h 200;//(int)(PaperHeight * 40);20pd.DefaultPageSettings.PaperSize new PaperSize(custom, w, h);pd.Print();return true;}catch (Exception ex){pd.PrintController.OnEndPrint(pd, new PrintEventArgs());System.Windows.Forms.MessageBox.Show($【PrintImage】打印出错{ex.Message}, 使用打印机打印);return false;}}else{return false;}}}
}五、新建打印内容配置窗体FormPrintSetting
窗体设计器源程序如下
FormPrintSetting.Designer.cs文件 namespace PrinterDemo
{partial class FormPrintSetting{/// summary/// Required designer variable./// /summaryprivate System.ComponentModel.IContainer components null;/// summary/// Clean up any resources being used./// /summary/// param namedisposingtrue if managed resources should be disposed; otherwise, false./paramprotected override void Dispose(bool disposing){if (disposing (components ! null)){components.Dispose();}base.Dispose(disposing);}#region Windows Form Designer generated code/// summary/// Required method for Designer support - do not modify/// the contents of this method with the code editor./// /summaryprivate void InitializeComponent(){this.btnSave new System.Windows.Forms.Button();this.dgvConfig new System.Windows.Forms.DataGridView();this.btnRead new System.Windows.Forms.Button();this.dgvcPrintMessage new System.Windows.Forms.DataGridViewTextBoxColumn();this.dgvcX new System.Windows.Forms.DataGridViewTextBoxColumn();this.dgvcY new System.Windows.Forms.DataGridViewTextBoxColumn();this.dgvcWidth new System.Windows.Forms.DataGridViewTextBoxColumn();this.dgvcHeight new System.Windows.Forms.DataGridViewTextBoxColumn();this.dgvcPrintMode new System.Windows.Forms.DataGridViewComboBoxColumn();this.dgvcFontSize new System.Windows.Forms.DataGridViewTextBoxColumn();this.dgvcImagePath new System.Windows.Forms.DataGridViewTextBoxColumn();((System.ComponentModel.ISupportInitialize)(this.dgvConfig)).BeginInit();this.SuspendLayout();// // btnSave// this.btnSave.Font new System.Drawing.Font(宋体, 16F);this.btnSave.Location new System.Drawing.Point(238, 3);this.btnSave.Name btnSave;this.btnSave.Size new System.Drawing.Size(113, 32);this.btnSave.TabIndex 0;this.btnSave.Text 保存配置;this.btnSave.UseVisualStyleBackColor true;this.btnSave.Click new System.EventHandler(this.btnSave_Click);// // dgvConfig// this.dgvConfig.ColumnHeadersHeightSizeMode System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;this.dgvConfig.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {this.dgvcPrintMessage,this.dgvcX,this.dgvcY,this.dgvcWidth,this.dgvcHeight,this.dgvcPrintMode,this.dgvcFontSize,this.dgvcImagePath});this.dgvConfig.Location new System.Drawing.Point(3, 41);this.dgvConfig.Name dgvConfig;this.dgvConfig.RowTemplate.Height 23;this.dgvConfig.Size new System.Drawing.Size(1085, 397);this.dgvConfig.TabIndex 1;this.dgvConfig.DataError new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dgvConfig_DataError);// // btnRead// this.btnRead.Font new System.Drawing.Font(宋体, 16F);this.btnRead.Location new System.Drawing.Point(93, 3);this.btnRead.Name btnRead;this.btnRead.Size new System.Drawing.Size(113, 32);this.btnRead.TabIndex 2;this.btnRead.Text 刷新配置;this.btnRead.UseVisualStyleBackColor true;this.btnRead.Click new System.EventHandler(this.btnRead_Click);// // dgvcPrintMessage// this.dgvcPrintMessage.HeaderText 打印内容;this.dgvcPrintMessage.Name dgvcPrintMessage;this.dgvcPrintMessage.Width 180;// // dgvcX// this.dgvcX.HeaderText X坐标;this.dgvcX.Name dgvcX;this.dgvcX.Width 120;// // dgvcY// this.dgvcY.HeaderText Y坐标;this.dgvcY.Name dgvcY;this.dgvcY.Width 120;// // dgvcWidth// this.dgvcWidth.HeaderText 宽度;this.dgvcWidth.Name dgvcWidth;this.dgvcWidth.Width 120;// // dgvcHeight// this.dgvcHeight.HeaderText 高度;this.dgvcHeight.Name dgvcHeight;this.dgvcHeight.Width 120;// // dgvcPrintMode// this.dgvcPrintMode.HeaderText 打印模式枚举;this.dgvcPrintMode.Items.AddRange(new object[] {Code128,QRCode,Text,Image});this.dgvcPrintMode.Name dgvcPrintMode;// // dgvcFontSize// this.dgvcFontSize.HeaderText 字体大小;this.dgvcFontSize.Name dgvcFontSize;// // dgvcImagePath// this.dgvcImagePath.HeaderText 图片路径;this.dgvcImagePath.Name dgvcImagePath;this.dgvcImagePath.Width 180;// // FormPrintSetting// this.AutoScaleDimensions new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode System.Windows.Forms.AutoScaleMode.Font;this.ClientSize new System.Drawing.Size(1093, 450);this.Controls.Add(this.btnRead);this.Controls.Add(this.dgvConfig);this.Controls.Add(this.btnSave);this.Name FormPrintSetting;this.Text 打印内容配置;this.Load new System.EventHandler(this.FormPrintSetting_Load);((System.ComponentModel.ISupportInitialize)(this.dgvConfig)).EndInit();this.ResumeLayout(false);}#endregionprivate System.Windows.Forms.Button btnSave;private System.Windows.Forms.DataGridView dgvConfig;private System.Windows.Forms.Button btnRead;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcPrintMessage;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcX;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcY;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcWidth;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcHeight;private System.Windows.Forms.DataGridViewComboBoxColumn dgvcPrintMode;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcFontSize;private System.Windows.Forms.DataGridViewTextBoxColumn dgvcImagePath;}
}
FormPrintSetting.cs文件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace PrinterDemo
{public partial class FormPrintSetting : Form{public FormPrintSetting(){InitializeComponent();}private void FormPrintSetting_Load(object sender, EventArgs e){btnRead_Click(null, null);}private void btnRead_Click(object sender, EventArgs e){dgvConfig.Rows.Clear();ListPrintConfig printConfigList CommonUtil.ReadPrintConfig();for (int i 0; i printConfigList.Count; i){dgvConfig.Rows.Add(printConfigList[i].PrintMessage, printConfigList[i].X, printConfigList[i].Y, printConfigList[i].Width, printConfigList[i].Height,printConfigList[i].PrintMode.ToString(), printConfigList[i].FontSize, printConfigList[i].ImagePath);}}/// summary/// 检查输入的配置信息/// /summary/// returns/returnsprivate bool CheckInput() {int validCount 0;for (int i 0; i dgvConfig.Rows.Count; i){string strPrintMessage Convert.ToString(dgvConfig[dgvcPrintMessage, i].Value);string strX Convert.ToString(dgvConfig[dgvcX, i].Value);string strY Convert.ToString(dgvConfig[dgvcY, i].Value);string strWidth Convert.ToString(dgvConfig[dgvcWidth, i].Value);string strHeight Convert.ToString(dgvConfig[dgvcHeight, i].Value);string strPrintMode Convert.ToString(dgvConfig[dgvcPrintMode, i].Value);string strFontSize Convert.ToString(dgvConfig[dgvcFontSize, i].Value);string strImagePath Convert.ToString(dgvConfig[dgvcImagePath, i].Value);if (string.IsNullOrWhiteSpace(strPrintMessage)) {continue;}int X;int Y;int Width;int Height;float FontSize;if (!int.TryParse(strX, out X)) {dgvConfig[dgvcX, i].Selected true;MessageBox.Show(X坐标必须为整数, 出错);return false;}if (!int.TryParse(strY, out Y)){dgvConfig[dgvcY, i].Selected true;MessageBox.Show(Y坐标必须为整数, 出错);return false;}if (!int.TryParse(strWidth, out Width) || Width 0){dgvConfig[dgvcWidth, i].Selected true;MessageBox.Show(宽度必须为正整数, 出错);return false;}if (!int.TryParse(strHeight, out Height) || Height 0){dgvConfig[dgvcHeight, i].Selected true;MessageBox.Show(高度必须为正整数, 出错);return false;}if (!float.TryParse(strFontSize, out FontSize) || FontSize 0){dgvConfig[dgvcFontSize, i].Selected true;MessageBox.Show(字体大小必须为正实数, 出错);return false;}if (string.IsNullOrWhiteSpace(strPrintMode)) {dgvConfig[dgvcPrintMode, i].Selected true;MessageBox.Show(请选择打印模式, 出错);return false;}if (Enum.TryParse(strPrintMode, out PrintMode printMode) printMode PrintMode.Image string.IsNullOrWhiteSpace(strImagePath)) {dgvConfig[dgvcImagePath, i].Selected true;MessageBox.Show(已选择打印模式为Image必须配置图片路径, 出错);return false;}validCount;}if (validCount 0) {MessageBox.Show(没有设置任何打印配置, 出错);return false;}return true;}private void btnSave_Click(object sender, EventArgs e){if (!CheckInput()) {return;}ListPrintConfig printConfigList new ListPrintConfig();for (int i 0; i dgvConfig.Rows.Count; i){string strPrintMessage Convert.ToString(dgvConfig[dgvcPrintMessage, i].Value);string strX Convert.ToString(dgvConfig[dgvcX, i].Value);string strY Convert.ToString(dgvConfig[dgvcY, i].Value);string strWidth Convert.ToString(dgvConfig[dgvcWidth, i].Value);string strHeight Convert.ToString(dgvConfig[dgvcHeight, i].Value);string strPrintMode Convert.ToString(dgvConfig[dgvcPrintMode, i].Value);string strFontSize Convert.ToString(dgvConfig[dgvcFontSize, i].Value);string strImagePath Convert.ToString(dgvConfig[dgvcImagePath, i].Value);if (string.IsNullOrWhiteSpace(strPrintMessage)){continue;}printConfigList.Add(new PrintConfig(){PrintMessage strPrintMessage.Trim(),X int.Parse(strX),Y int.Parse(strY),Width int.Parse(strWidth),Height int.Parse(strHeight),PrintMode (PrintMode)Enum.Parse(typeof(PrintMode), strPrintMode),FontSize float.Parse(strFontSize),ImagePath strImagePath.Trim()});}CommonUtil.SavePrintConfig(printConfigList);//重新刷新btnRead_Click(null, null);MessageBox.Show(保存打印配置信息成功, 提示);}private void dgvConfig_DataError(object sender, DataGridViewDataErrorEventArgs e){MessageBox.Show($出错的列索引【{e.ColumnIndex}】,行索引【{ e.RowIndex}】,{e.Exception.Message});}}
}六、窗体 FormPrinter设计器与源程序如下
FormPrinter.Designer.cs文件 namespace PrinterDemo
{partial class FormPrinter{/// summary/// 必需的设计器变量。/// /summaryprivate System.ComponentModel.IContainer components null;/// summary/// 清理所有正在使用的资源。/// /summary/// param namedisposing如果应释放托管资源为 true否则为 false。/paramprotected override void Dispose(bool disposing){if (disposing (components ! null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗体设计器生成的代码/// summary/// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// /summaryprivate void InitializeComponent(){this.lblCode new System.Windows.Forms.Label();this.pictureBox1 new System.Windows.Forms.PictureBox();this.btnConfig new System.Windows.Forms.Button();this.btnManualPrint new System.Windows.Forms.Button();this.rtxtMessage new System.Windows.Forms.RichTextBox();((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();this.SuspendLayout();// // lblCode// this.lblCode.AutoSize true;this.lblCode.Font new System.Drawing.Font(宋体, 12F);this.lblCode.Location new System.Drawing.Point(12, 429);this.lblCode.Name lblCode;this.lblCode.Size new System.Drawing.Size(152, 16);this.lblCode.TabIndex 27;this.lblCode.Text NG1234567890ABCDEF;// // pictureBox1// this.pictureBox1.BorderStyle System.Windows.Forms.BorderStyle.FixedSingle;this.pictureBox1.Location new System.Drawing.Point(3, 9);this.pictureBox1.Name pictureBox1;this.pictureBox1.Size new System.Drawing.Size(600, 400);this.pictureBox1.TabIndex 26;this.pictureBox1.TabStop false;this.pictureBox1.Paint new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);// // btnConfig// this.btnConfig.Font new System.Drawing.Font(宋体, 16F);this.btnConfig.Location new System.Drawing.Point(125, 524);this.btnConfig.Name btnConfig;this.btnConfig.Size new System.Drawing.Size(171, 41);this.btnConfig.TabIndex 70;this.btnConfig.Text 打印模板配置;this.btnConfig.UseVisualStyleBackColor true;this.btnConfig.Click new System.EventHandler(this.btnConfig_Click);// // btnManualPrint// this.btnManualPrint.Font new System.Drawing.Font(宋体, 16F);this.btnManualPrint.Location new System.Drawing.Point(95, 460);this.btnManualPrint.Name btnManualPrint;this.btnManualPrint.Size new System.Drawing.Size(306, 52);this.btnManualPrint.TabIndex 69;this.btnManualPrint.Text 根据打印模板配置进行打印;this.btnManualPrint.UseVisualStyleBackColor true;this.btnManualPrint.Click new System.EventHandler(this.btnManualPrint_Click);// // rtxtMessage// this.rtxtMessage.Location new System.Drawing.Point(620, 9);this.rtxtMessage.Name rtxtMessage;this.rtxtMessage.ReadOnly true;this.rtxtMessage.Size new System.Drawing.Size(553, 559);this.rtxtMessage.TabIndex 71;this.rtxtMessage.Text ;// // FormPrinter// this.AutoScaleDimensions new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode System.Windows.Forms.AutoScaleMode.Font;this.ClientSize new System.Drawing.Size(1185, 580);this.Controls.Add(this.rtxtMessage);this.Controls.Add(this.btnConfig);this.Controls.Add(this.btnManualPrint);this.Controls.Add(this.lblCode);this.Controls.Add(this.pictureBox1);this.Name FormPrinter;this.Text 条码打印示教;((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();this.ResumeLayout(false);this.PerformLayout();}#endregionprivate System.Windows.Forms.Label lblCode;private System.Windows.Forms.PictureBox pictureBox1;private System.Windows.Forms.Button btnConfig;private System.Windows.Forms.Button btnManualPrint;private System.Windows.Forms.RichTextBox rtxtMessage;}
}
FormPrinter.cs文件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace PrinterDemo
{public partial class FormPrinter : Form{public FormPrinter(){InitializeComponent();}FormPrintSetting formPrintSetting;private void btnConfig_Click(object sender, EventArgs e){if (formPrintSetting null || formPrintSetting.IsDisposed){formPrintSetting new FormPrintSetting();formPrintSetting.Show();}else{formPrintSetting.Activate();}}/// summary/// 显示推送消息/// /summary/// param namemsg/paramprivate void DisplayMessage(string msg){this.BeginInvoke(new Action(() {if (rtxtMessage.TextLength 20480){rtxtMessage.Clear();}rtxtMessage.AppendText(${DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss.fff)}-{msg}\n);rtxtMessage.ScrollToCaret();}));}private async void btnManualPrint_Click(object sender, EventArgs e){ListPrintConfig printConfigList CommonUtil.ReadPrintConfig();Taskint task Task.Run(() {pictureBox1.Tag printConfigList;//为标签Tag赋值用于PictureBox对文字的显示处理【Paint重绘事件】DisplayMessage($即将打印【{printConfigList.Count}】个内容,该内容描述集合为:\n{string.Join(,\n, printConfigList.Select(x x.PrintMessage))});int okCount 0;try{string printContents string.Join(,, printConfigList.Select(x x.PrintMessage));//开始打印this.BeginInvoke(new Action(() {lblCode.Text printContents;pictureBox1.SizeMode PictureBoxSizeMode.CenterImage;Bitmap bitmap PrinterUtil.GeneratePrintImage(printConfigList);pictureBox1.Image bitmap;}));bool rst PrinterUtil.PrintCompositePicture(printConfigList, printerName: Zebra 8848T);DisplayMessage($条码打印{(rst ? 成功 : 失败)}.打印内容{printContents});if (rst){okCount;}}catch (Exception ex){DisplayMessage($条码打印出错原因{ex.Message});}return okCount;});await task;DisplayMessage($条码打印已完成打印成功条码个数{task.Result});}/// summary/// 在PictureBox上显示文本需要在Paint重绘事件中/// /summary/// param namesender/param/// param namee/paramprivate void pictureBox1_Paint(object sender, PaintEventArgs e){PictureBox pictureBox sender as PictureBox;if (pictureBox null || pictureBox.Tag null) {return;}ListPrintConfig printConfigList pictureBox.Tag as ListPrintConfig;for (int i 0; printConfigList ! null i printConfigList.Count; i){//因PictureBox不能直接显示文本需要在Paint事件中独自处理文字显示if (printConfigList[i].PrintMode PrintMode.Text) {Graphics graphics e.Graphics;Font font new Font(黑体, printConfigList[i].FontSize, FontStyle.Regular);Rectangle destRect new Rectangle(printConfigList[i].X, printConfigList[i].Y, printConfigList[i].Width, printConfigList[i].Height);System.Drawing.Drawing2D.LinearGradientBrush brush new System.Drawing.Drawing2D.LinearGradientBrush(destRect, Color.Black, Color.Black, 0, true);RectangleF rectangleF new RectangleF(printConfigList[i].X, printConfigList[i].Y, printConfigList[i].Width, printConfigList[i].Height);graphics.DrawString(printConfigList[i].PrintMessage, font, brush, rectangleF);}}}}
}七、程序运行如图
打印内容配置 显示图片与打印界面