C#联合CODESOFT标签在线列印软件,源代码,适合自己做二次开发标签在线列印软件。 里面可以选择不同的图片进行输出。

最近在折腾标签打印系统的时候,发现CODESOFT这玩意儿对C#开发者是真香。特别是需要给产线做定制化打印工具的场景,直接拿它的COM组件撸代码,比从零造轮子省事太多了。先上段硬核操作——用C#动态替换标签里的图片,这需求在产线换标时绝对高频。

装好CODESOFT之后,先把COM引用怼进项目。NuGet里搜AxAutomation,直接命令行敲:

Install-Package AxAutomation -Version 2022.2.1

这时候工程里会出现个axCodeSoftDesigner控件,咱们在WinForm里拖个面板就能开始整活了。

核心代码段长这样:

var doc = new Document();
doc.Open(@"D:\Templates\label.lab"); //加载模板文件

//暴力替换图片节点
foreach (var obj in doc.Objects)
{
    if (obj.Type == ObjectType.Picture)
    {
        var pic = (PictureObject)obj;
        if (pic.Name == "productLogo") 
        {
            pic.Image = File.ReadAllBytes(selectedImagePath); //用户选择的图片
            pic.Stretch = true; //自动拉伸适应标签区域
        }
    }
}

//触发打印不要用默认队列
var printer = new Printer();
printer.Document = doc;
printer.PrintOut(Copies:3, WaitUntilFinished:true); //连打三份保平安

这里有个坑要注意——图片对象必须通过COM的PictureObject类型强转,直接取对象属性会丢元数据。有个骚操作是用LINQ过滤对象集合,比传统的for循环优雅不少:

var targetPic = doc.Objects.OfType<PictureObject>()
                    .FirstOrDefault(p => p.Name == "dynamicBarcode");
if(targetPic != null) 
{
    targetPic.Image = GenerateBarcodeImage(); //自己生成条码图的方法
}

实际部署时记得处理权限问题,在app.config里加上:

<runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>

否则某些老版本COM组件会抛访问异常。遇到过最玄学的问题是图片路径带中文时加载失败,后来发现得在注册表HKEYLOCALMACHINE\SOFTWARE\CODESOFT里把字符集改成GBK才搞定。

二次开发时建议封装个LabelPrinterService类,把打印队列、错误重试这些脏活隔离。比如这样处理打印超时:

public void SafePrint(Document doc)
{
    try
    {
        using (var printer = new Printer())
        {
            printer.Document = doc;
            printer.PrintOut(Timeout: 15000); //15秒超时
        }
    }
    catch (COMException ex) when (ex.ErrorCode == 0x80010105) //服务器忙错误
    {
        Thread.Sleep(2000);
        RetryCount++; //最多重试三次
    }
}

搞完这些再套个WPF的MVVM框架,配合Prism的事件聚合器,轻松实现多终端同步打印。最后扔个异步任务包装,UI再也不卡顿了:

async Task PrintLabelAsync()
{
    await Task.Run(() => 
    {
        //耗时的打印操作扔后台线程
        _printerService.ProcessQueue(); 
    });
}

这套组合拳打下来,产线小哥再也不用守着打印机狂按F5了。下次打算试试用Blazor搞个网页端配置界面,毕竟.NET全栈才是终极奥义。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐