winform实现的调用bartender打印工具-标签模版管理

生产型企业基本都有条码追溯管理的需求,不同的产品有不同的标签样式规格以及内容,打印的条码往往需要追溯以及防重校验,因此市面有很多打印软件,今天分享基于winform开发的调用bartender标签的工具。

先上效果图

  /// <summary>
        /// 使用 BarTender进行打印,批量打印
        /// </summary>
        /// <param name="labelName"> BarTender标签名称</param>
        /// <param name="labelParamsValuesList">打印数据</param>
        /// <param name="msg">消息</param>
        /// <param name="printQty">打印数量</param>
        /// <returns>打印OK true</returns>
        public bool BTPrint(string labelName, Dictionary<string, string> labelParamsValues, out string msg, int printQty = 1, string printer = "")
        {
            try
            {
                bool checkLabelVar = true;
                string tmpMsg = "";
                this.TemplateFile = labelName;

                if (!File.Exists(TemplateFile))
                {
                    msg = "Error:Label File Not Exists" + TemplateFile;
                    this.ErrorMsg = msg;
                    return false;
                }
                if (!string.IsNullOrEmpty(printer))
                {
                    bool printerFlag = false;
                    foreach (string sPrint in System.Drawing.Printing.PrinterSettings.InstalledPrinters)//获取所有打印机名称
                    {
                        if (sPrint.Equals(printer))
                        {
                            printerFlag = true; 
                        }
                    }

                    if (!printerFlag)
                    {
                        msg = "Error:Printer Name Error";
                        return false;
                    }

             
                }
                //找到打印模板的标签页
                btFormat = btApp.Formats.Open(labelName, false, "");
                if (!string.IsNullOrEmpty(printer))
                {
                    btFormat.Printer = printer;
                }
                if (btApp != null)
                {
                 

                    //取模板所有的值
                    string strBT = btFormat.NamedSubStrings.GetAll("#", "$");

                    //将模板所有值进行拆分
                    strBT = strBT.Substring(0, strBT.Length - 1);
                    string[] strBTValue = strBT.Split(new char[] { '$' });

                    //循环将模板的值写入lbldicVar中
                    Dictionary<string, string> lbldicVar = new Dictionary<string, string>();
                    for (int i = 0; i < strBTValue.Length; i++)
                    {
                        string[] cc = strBTValue[i].Split(new char[] { '#' });

                        lbldicVar.Add(cc[0].ToString(), cc[1].ToString()); //0是模板的参数 1是参数值
                    }
                    if (labelParamsValues.Count > 0)
                    {
                        foreach (var item in lbldicVar)
                        {
                            if (labelParamsValues.Count(q => q.Key.ToUpper() == item.Key.ToUpper()) == 0)
                            {
                                tmpMsg = "数据源缺少参数:  " + item.Key;
                                if (checkLabelVar)
                                {
                                    this.ErrorMsg = tmpMsg;
                                    checkLabelVar = false;
                                }
                                else
                                {
                                    this.ErrorMsg = this.ErrorMsg + (char)10 + tmpMsg;
                                }
                            }
                        }
                        if (!checkLabelVar)
                        {
                            msg = this.ErrorMsg;
                            this.Status = false;
                            return false;
                        }
                        foreach (var param in labelParamsValues.Keys)
                        {
                            if (lbldicVar.Keys.Count(q => q.ToUpper() == param.ToUpper()) > 0)
                            {
                                var labvar = lbldicVar.Keys.First(q => q.ToUpper() == param.ToUpper());

                                if (string.IsNullOrEmpty(labelParamsValues[param]))
                                {
                                    tmpMsg = "数据源参数值为空:" + labvar;
                                    if (checkLabelVar)
                                    {
                                        this.ErrorMsg = tmpMsg;
                                        checkLabelVar = false;
                                    }
                                    else
                                    {
                                        this.ErrorMsg = this.ErrorMsg + (char)10 + tmpMsg;
                                    }
                                }
                                btFormat.SetNamedSubStringValue(param, labelParamsValues[param]);
                            }
                        }
                        if (!checkLabelVar)
                        {
                            msg = this.ErrorMsg;
                            this.Status = false;
                            return false;
                        }
                        btFormat.IdenticalCopiesOfLabel =printQty;

                        //第二个false设置打印时是否跳出打印属性
                        btFormat.PrintOut(true, false);
                        //退出是是否保存标签
                        btFormat.Close(BarTender.BtSaveOptions.btSaveChanges);
                        //lblDoc.FormFeed();
                        msg = "OK";
                        this.ErrorMsg = msg;
                        this.Status = true;
                        return true;
                    }
                    else
                    {
                        msg = "Print Data is null";
                        this.ErrorMsg = msg;
                        this.Status = false;
                        return false;
                    }
                }
                else
                {
                    msg = "Error:CodeSoft Application can't boot up";
                    this.ErrorMsg = msg;
                    this.Status = false;
                    return false;
                }
            }
            catch (Exception ex)
            {
                msg = ex.Message + ex.InnerException;
                this.ErrorMsg = msg;
                this.Status = false;
                return false;
            }
            finally
            {
                if (btApp != null)
                {
                    btApp.Quit(BarTender.BtSaveOptions.btSaveChanges);//界面退出时同步退出bartender进程
                    //lblApp.Documents.CloseAll(true);
                    //lblDoc = null;
                }
                GC.Collect();
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/573782.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考 - 系统架构设计师 - 设计模式

目录 概念 创建型设计模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 优点 缺点 应用场景 总结 构建器模式&#xff08;Builder Pattern&#xff09; 优点 缺点 应用场景 工厂方法模式&#xff08;factory method&#xff09; 优点 缺点 应…

AES 加解密(包含JS、VUE、JAVA、MySQL)工具方法

介绍 AES 是 Advanced Encryption Standard 的缩写&#xff0c;是最常见的对称加密算法。AES 在密码学中又称 Rijndael 加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的 DES&#xff0c;已经被多方分析且广为全世界所使用。 基本原理&#…

3.8设计模式——State 状态模式(行为型)

意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构 Context&#xff08;上下文&#xff09;定义客户感兴趣的接口&#xff1b;维护一个ConcreteState子类的实例&#xff0c;这个实例定义当前状态。State&#xff08;状态&#xff09;定义…

微软发布!提示工程进化为位置工程,有效提升RAG与上下文学习

别再光顾着优化提示工程啦&#xff01;微软最近推出位置工程研究思路&#xff0c;只需调整token的索引位置&#xff0c;而不修改文本本身&#xff0c;就能显著提高任务性能。 提示工程通过添加、替换或删除段落和句子改变提示&#xff0c;调整语义信息&#xff0c;激发LLMs的推…

Leetcode刷题之——队列Queue|先入先出FIFO|广度优先搜索BFS|栈Stack|后入先出LIFO|深度优先搜索DFS

Leetcode刷题之——队列Queue|先入先出FIFO|广度优先搜索BFS|栈Stack|后入先出LIFO|深度优先搜索DFS 1. 队列(Queue)——FIFO&#xff0c;先入先出的数据结构1.1 循环队列1.2 内置队列的常用方法&#xff08;C&#xff09;1.3 广度优先搜索&#xff08;BFS&#xff09; 2.栈(St…

Unity Meta Quest MR 开发(七):使用 Stencil Test 模板测试制作可以在虚拟与现实之间穿梭的 MR 传送门

文章目录 &#x1f4d5;教程说明&#x1f4d5;Stencil Test 模板测试&#x1f4d5;Stencil Shader&#x1f4d5;使用 Unity URP 渲染管线设置模板测试⭐Render Pipeline Asset 与 Universal Renderer Data⭐删除场景中的天空盒⭐设置虚拟世界的层级 Layer⭐设置模板测试 &#…

详解Qt中的鼠标事件

在Qt中&#xff0c;处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数&#xff0c;允许开发者捕获鼠标的各种动作&#xff0c;如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项&#xff0c;并附带C代码示例。 基础使用方法…

Git学习笔记(四)远程仓库

根据前面几篇文章的介绍&#xff0c;在本地使用Git基本不成问题了&#xff0c;常用的基本命令和一些基本概念基本也介绍完毕了。这一张主要讲讲远程仓库的创建和使用。 概念 其实在前面第一篇文章中&#xff0c;我们就简单介绍过远程仓库&#xff0c;它其实就是一个托管在远程服…

ROS标定海康威视摄像头

ROS视摄像头标定----海康威视 引言&#xff1a; ​ 摄像头标定是为了确保视觉系统能够准确反映现实世界中的对象&#xff0c;并消除图像中的畸变效果。在本实验中&#xff0c;我们使用了ROS中的功能包进行摄像头标定。标定的原理包括畸变校正和摄像头参数估计。通过移动标定板并…

java 创建和请求sse服务

主要依赖 <!--spring-boot父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><dependency><gro…

SAP采购订单-条件类型-配置开发步骤

由于采购业务变更&#xff0c;需要创建新的价格类型&#xff0c;并添加新的计算逻辑计算。首先在例程&#xff08;VOFM&#xff09;中创建计算逻辑&#xff0c;然后在系统配置&#xff08;SPRO&#xff09;中找到配置点&#xff0c;创建新的条件类型‘ZMM00’,创建定价过程‘ZM…

算法-动态规划专题

文章目录 前言 : 动态规划简述1 . 斐波那契模型1.1 泰波那契数列1.2 最小花费爬楼梯1.3 解码方法 前言 : 动态规划简述 动态规划在当前我们的理解下,其实就是一种变相的递归,我们查看一些资料也可以知道,动态规划其实属于递归的一个分支,通过把递归问题开辟的栈帧通过一定的手…

模拟信号的离散化

本文介绍模拟信号的离散化。 1.采样定理 定义&#xff1a;若想重建输入的模拟信号&#xff0c;采样频率必须大于等于输入模拟信号最高频率的2倍&#xff0c;即&#xff1a; 其中&#xff0c;为采样频率&#xff0c;为输入模拟信号最高频率 否则&#xff0c;信号会发生混叠 2…

榕城·江上图三居装修攻略,硬装费用18万。福州中宅装饰,福州装修

设计亮点 **方案分析:** 整体墙面采用纯白色为主&#xff0c;搭配木质元素设计&#xff0c;室内铺设浅色木地板。客厅区域设计了一个嵌入式工作区&#xff0c;满足日常办公需求。餐厅、走廊和卧室充分利用每一处空间&#xff0c;扩大收纳空间。 **改造方案:** 1. 采用白色和原木…

Emby for Mac 1.9.9中文激活永久使用(多媒体影音库)

Emby 是一款流媒体服务器软件&#xff0c;可以用于在不同设备上共享音乐、电影、电视节目和照片等多媒体资源。用户可以将自己的媒体文件添加到Emby服务器中&#xff0c;并通过网络将它们发送到其他设备&#xff0c;如电视、手机、平板电脑等。 Emby for Mac 1.9.9中文激活下载…

Linux多进程(三) 信号信号集与统一事件源

信号是由用户、系统或者进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由如下条件产生&#xff1a; 对于前台进程&#xff0c;用户可以通过输入特殊的终端字符来给它发送信号。比如输入CtrlC通常会给进程发送一个中断信号。系统异…

LeetCode:51. N 皇后

leetCode51.N皇后 题解分析 代码 class Solution { public:int n;vector<vector<string>> ans;vector<string> path;vector<bool> col, dg,udg;vector<vector<string>> solveNQueens(int _n) {n _n;col vector<bool> (n);dg …

如何在阿里云快速配置自动定时重启ECS云服务器?

背景 无论是电子商务、在线教育、游戏&#xff0c;还是流媒体等业务&#xff0c;服务器的稳定运行都是至关重要的。然而&#xff0c;在实际运行中&#xff0c;我们可能会遇到这样一些场景&#xff1a; 系统更新&#xff1a;一些操作系统或者软件的更新可能需要重启服务器才能…

政企版 WPS Pro 专业版注册安装教程

政企版 WPS Pro 专业版安装及激活步骤 第 1 步&#xff1a;下载压缩包&#xff08;内含注册码&#xff09;【无解压密码】。 第 2 步&#xff1a;解压缩后&#xff0c;运行 exe 文件&#xff0c;默认步骤安装即可。 第 3 步&#xff1a;安装完成后&#xff0c;新建一个 Word …

【Camera Sensor Driver笔记】五、点亮指南之Actuator配置

<slaveInfo> actuatorName dw9714v dirver IC 型号 slaveAddress 0x18 i2c write address i2cFrequencyMode FAST i2c 操作频率(400KHz) actuatorType VCM/BIVCM 马达类型 BIVCM&#xff08;中置马达&#xff…
最新文章