领导当时给了个任务,让做web打印,我们打印的是衣服上的洗水唛和不干胶。当时就蒙了,完全没接触过。没办法,网上查找了一些第三方的插件,最后使用的是lodop,官网是
http://www.lodop.net/,这个完全是用js来进行打印的,大部分功能是免费的,具体用法官网都有,也有专业人员解答。
我就来说说开发中遇到的一些问题。
条形码的宽度问题
二维码或条码是由竖条和横条组成,设定宽度后,自动计算每条应占用的宽度,计算后的合计宽度一般是小于等于设定宽度,所以条码或二维码的增大或缩小是受每个竖条或横条的宽度合计值影响,比如40个竖条,每一个增加1px,总宽度就增加了40px,所以宽度和高度跳跃式放大或缩小,是非线性的。
最小宽度小于1px时就无法再小了,就要调整条码纸的宽度以适应内容输出的宽度,或调整内容输出量达到调整输出宽度效果。
因为条形码是有类型的,之前我们使用的是code128的,但是lodop提供了三种code128的,经测试,code128auto生成的条码宽度是最小的(当时这个问题搞了好久)
后来做好之后给大家使用,因为有很多的加工厂,打印机的类型都不一样,导致打印的东西有的向左有的向右,因为不可能让加工厂换打印机,所以尝试另外一种方法,调用BT模板打印(他们之前使用的就是bartender打印,所以这个不会有打印机兼容的问题)
步骤:本地安装破解版的bartender打印软件,这个会在电脑上安装com组件,我们程序中(.NET)就可以进行引用
引用的程序集是Interop.BarTender.dll
代码如下:
public static void Print(string style,string metail,string templetId) { Var fullPath=”自己的模板路径”; //选择模板 BarTender.Format btFormat = btApp.Formats.Open(fullPath); btFormat.PrintSetup.IdenticalCopiesOfLabel = 1; //传递变量 btFormat.SetNamedSubStringValue("style",style);//货号 btFormat.SetNamedSubStringValue("metail", metail);//材料 //第二个参数表示是否跳出打印属性框 btFormat.PrintOut(false, true); //退出时是否保存标签 btFormat.Close(BarTender.BtSaveOptions.btSaveChanges); }
这样就可以调取本地的bt软件进行打印了。本以为可以了,发布到服务器,又是错误一大堆。
问题1: 检索 COM 类工厂中 CLSID 为 {B9425246-4131-11D2-BE48-004005A04EDF} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。
这个问题就是因为电脑没有注册这个BT软件的组件,将BT软件在服务器安装一下就可以解决。
问题2:权限问题,一直拒绝访问
首先我根据http://blog.csdn.net/hw1233456/article/details/25303303这位博主的提示,修改了com组件下的bartender的权限,但还是拒绝访问
后来根据http://blog.csdn.net/q646926099/article/details/52421273这位博主的提示,修改了iis应用程序池的权限,最后可以进行访问了
本以为可以了,错误是没有了,但是没反应,最后根据https://zhidao.baidu.com/question/258420452.html?qq-pf-to=pcqq.c2c
这篇文章明白服务器是不可以调取本地的打印机的
由于能力有限,这个方案也就放弃了
最后的解决方案是:洗水唛用lodop打印,因为这个是没有打印机兼容的问题,而且固定了模板,用户不会选错模板。
而不干胶的打印采用导出excel数据,然后bt软件连接excel进行打印。
记录一下,希望对大家有帮助,类似的情况可以采取类似的解决方案