首页 > 其他分享 >记一次打印机功能实现

记一次打印机功能实现

时间:2023-08-12 11:37:03浏览次数:29  
标签:打印机 转换 wb 实现 功能 二维码 zpl pdf new

使用的是芝柯打印机,无驱动,除了文本打印外,若想打印其他表格或者模板,我的做法是利用excel填充数据,然后转换为pdf,pdf再转为zpl命令。

  1.  核心代码分为三部分:
    1. 加载打印模板,填充打印数据到模板并保存成新的打印文件
    2. 将需要打印的文件,转换为PDF格式。这一步主要是因为芝柯打印机是无驱动的,需要转换成ZPL命令发送至服务端进行打印。而PDF转换起来最为简单方便。
    3. 将PDF文件转换成ZPL命令。然后发送至服务端即可打印
  2. 第三方组件库:
    1. ZXing.Net.Bindings.Windows.Compatibility。主要用于生成二维码和条形码。网上很多教程说是ZXing.Net。但是并不行,可能跟系统有关?查了好久才发现要引用ZXing.Net.Bindings.Windows.Compatibility这个!如果只需要二维码的话,可以使用QRCoder,net6以上的话,可能得安装1.4.2版本,最新的和net6不匹配,用不了,详细可以看作者的说明。
                          #region 二维码
                          //实例一个对象,配置二维码的参数
                          var qR = new BarcodeWriter
                          {
                              //类型,QRCODE二维码,下面的条形码也是一样的,不知道类型百度一下
                              Format = BarcodeFormat.QR_CODE
                          };
                          // 设置生成的二维码的一些参数(可选)
                          EncodingOptions encodingOptions = new()
                          {
                              Width = 120, // 宽度
                              Height = 120, // 高度
                              Margin = 0 // 边距
                          };
                          qR.Options = encodingOptions;
                          //填充数据
                          Bitmap qrBitmap = qR.Write(datas[i].ID);
                          // 将 Bitmap 转换为文件流(这里是epplus插入图片的方式,其他操作excel组件自行修改)
                          using (MemoryStream qrStream = new())
                          {
                              //保存进文件流
                              qrBitmap.Save(qrStream, System.Drawing.Imaging.ImageFormat.Png);
                              //wb是一个Worksheet工作簿,往里面添加图片
                              var qrImg = wb.Drawings.AddPicture("QR", qrStream);
                              //图片的位置,四个参数(行,偏移量,列,偏移量)注意点在于,设置了第一行第一列,图片的位置会从右下角开始
                              qrImg.SetPosition(22, 0, 6, 0);
                          }
      
                          #endregion 二维码
      
                          #region 条形码
      
                          var writer = new BarcodeWriter
                          {
                              Format = BarcodeFormat.CODE_128
                          };
                          QrCodeEncodingOptions options = new()
                          {
                              DisableECI = true,
                              CharacterSet = "UTF-8",
                              Width = 180,
                              Height = 90,
                              Margin = 1
                          };
                          writer.Options = options;
                          Bitmap zx = writer.Write($"{datas[i].WAREID ?? "0000"}");
                          //插入二维码
                          using (MemoryStream stream = new())
                          {
                              zx.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                              var zximg = wb.Drawings.AddPicture("zx", stream);
                              zximg.SetPosition(9, 0, 2, 0);
                          }
      
                          #endregion 条形码
      View Code
    2.  PDFtoZPL。国外大神搞得一个转换zpl命令的包。zpl挺难搞的,主要是不懂。只能借用别人写好的了,目前这个包是我认为最简单操作的了。不过只能从PDF转换

                      #region 转换为ZPL命令
                      //加载pdf路径,转换成Base64字符串
                      byte[] pdfBytes = File.ReadAllBytes(pdfPath);
                      string base64String = Convert.ToBase64String(pdfBytes);   
                      // 设置标签尺寸(单位:点,1英寸 = 203点)
                      int labelWidthDots = 5 * 203;  // 宽度为4.5英寸
                      int labelHeightDots = (int)(7.5 * 203);   // 高度为6英寸
                      var zplCode = PDFtoZPL.Conversion.ConvertPdf(base64String, width: labelWidthDots, height: labelHeightDots);
                      //保存zpl指令
                      string zpl = string.Empty;
                      foreach (var str in zplCode)
                      {
                          zpl += str;
                      }
      
                      #endregion
                      // 将字符串转换为 GBK 编码的字节数组
                      if (zpl.Length != 0) if (zpl.LastIndexOf('\n') != zpl.Length - 1) zpl += "\n";
                      byte[] byteData = System.Text.Encoding.GetEncoding("GBK").GetBytes(zpl);
      View Code
    3. FreeSpire.XLS。Spire的免费版,用于excel转换为pdf。网上说只能转换前十页PDF,不然还是有水印。当然网上也有一堆去除水印的方法,可惜我没实验成功。也幸好我一次性不需要转换很多,所以我选择了这个。
              /// <summary>
              /// Excel转换Pdf
              /// </summary>
              /// <param name="xlsPath">输入excel地址</param>
              /// <param name="pdfPath">输出pdf地址</param>
              public static string ToPDF(string xlsPath, string pdfPath = null)
              {
                  pdfPath ??= xlsPath.Replace("xlsx", "pdf");
                  //加载模板
                  Workbook wb = new();
                  wb.LoadFromFile(xlsPath);
                  //转换成PDF
                  Worksheet ws = wb.Worksheets[0];
                  ws.SaveToPdf(pdfPath);
                  return pdfPath;
              }
      View Code
  3. 核心就这么多了。上面三段代码组合起来就可以实现一个基本的打印功能了。因为写这个博客的时候使用的是芝柯打印机,使用的是ZPL命令。若是换成其他打印机,只要支持zpl命令,也是可以使用的。但是具体怎么方便,视情况而定。

 

标签:打印机,转换,wb,实现,功能,二维码,zpl,pdf,new
From: https://www.cnblogs.com/zhang-3/p/17624542.html

相关文章

  • Vue中实现矩形和虚线的分离
    要在Vue中实现矩形和虚线的分离,你可以使用Vue的模板语法和样式绑定来实现。下面是一个示例代码,展示了如何使用Vue实现一个具有矩形和虚线的分离效果:<!DOCTYPEhtml><html><head><title>矩形和虚线分离</title><style>.rectangle{width:200px;......
  • lazarus、delphi文件Http下载断点续传的实现
    下载大文件时,断点续传是很有必要的,特别是网速度慢且不稳定的情况下,很难保证不出意外,一旦意外中断,又要从头下载,会很让人抓狂。断点续传就能很好解决意外中断情况,再次下载时不需要从头下载,从上次中断处继续下载即可,这样下载几G或十几G大小的一个文件都没问题。本文介绍利用minifra......
  • go项目实现mysql接入以及web api
    创建go项目,并在go项目中接入mysql,将mysql的配置项单独整理放到一个胚子和文件中,支持项目启动时,通过加载配置文件中的值,然后创建数据库连接。之后使用net/http相关的库,创建路由,并在路由中通过不同的http方法,实现mysql连接的test数据库中users表的增删改查的webapi1.在ide......
  • 【专题】研发驱动中国消费电子品牌 加速实现国际化与高端化报告PDF合集分享(附原数据表
    在后疫情时代,全球经济和消费力的增长面临巨大考验。2022年,电脑、手机等产品的市场规模出现了小幅收缩调整。然而,在这样的环境下,各种消费电子的细分领域却展现出了强大的韧性。阅读原文,获取专题报告合集全文,解锁文末29份消费电子行业相关报告。智能手表、真无线耳机、AR/VR眼镜、户......
  • 怎么实现一个登录页面
    怎么实现一个登录页面在api目录下面,建立一个login.js文件,配置三个发送axios请求的函数并导出获取token使用token兑换info退出登录//login.js//获取axios实例requestimportrequestfrom'@/util/request';//登录,获取tokenconstreqLogin=(username,passw......
  • 基于FFT傅里叶变换的64QAM基带信号频偏估计和补偿算法FPGA实现,包含testbench和matlab
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,并使用matlab2022a对结果进行星座图的显示:    将FPGA的频偏基带QPSK信号和频偏补偿后的QPSK基带信号使用matlab显示星座图,结果如下:   2.算法涉及理论知识概要        FFT傅里叶变换是一种高效的......
  • 使用 Spring 实现控制反转和依赖注入
    概述在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。什么是控制反转?控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。与传统编程相比,传统编程中我们的自定义代......
  • C++实现一键关闭桌面
    方法一:C++关闭桌面,explorer.exe#include<Windows.h>#include<TlHelp32.h>#include"resource.h"#pragmawarning(disable:4996)voidtaskkill(constchar*name){ HANDLEinfo_handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//拍摄系统中所有进......
  • Socket客户端实现
    1importsocket#1.导入内置的socket模块23#2.创建Socket对象4client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)56#3.连接服务器7server_address=('localhost',18080)8client_socket.connect(server_address)910try:1......
  • Pycharm Debug功能详解
    初学Python时,我们可能都是通过print来调试程序,但这种方法效率不高。入门Python后,Pycharm的Debug功能还是有必要学一下的,可以提高调试代码的效率。什么是Debug模式:简单说Debug模式和正常运行唯一的区别,就是会在断点处停下来,可以通过控制一行一行的去运行代码,而且可以看到整个运行......