V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Handle
V2EX  ›  Node.js

请问,用 Electron 打印标签有什么推荐库之类的么

  •  
  •   Handle · 2018-10-22 04:40:22 +08:00 via Android · 9645 次点击
    这是一个创建于 2226 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在已经浪费了 4 米纸卷…… 使用的是得力的机器,目前用官方给的标签打印软件倒是工作一切正常。 目前需求是 Electron 调用这台打印机打印一些带有一维码的标签, 标签尺寸为 40mm*30mm,水平 2 列,纸袋宽度约 82mm,纸张间距约为 1.5mm 现在尝试了: Word:无论如何都会莫名其妙旋转 90 度导致打印出现问题 Electron:

    content.print() - web 页面单位均已使用 cm,打印页面尺寸如果设置为 8.1*3.15cm,页面会被切分成无数的块 print 以及 node-print 在 electron 下,无法正常调用 DLL

    想问下 V2EX 这里有没有开发过标签打印软件的老司机指条明路,怎样才能让标签 正常 打印出来…… 先感谢一波……毕业设计要严重超时了……

    题外话提一句:怎么治宿舍里疯狂抽烟打游戏大吼大叫的室友……

    46 条回复    2019-01-10 04:19:04 +08:00
    zhenjiachen
        1
    zhenjiachen  
       2018-10-22 05:10:09 +08:00 via iPhone
    我搞过 tsc 打印机打印二维码打印,打印图片怎么都会出现问题,但是用 tsc 提供的工具就不会,因为这种打印机只能用代码发送命令,而不支持直接打印图片
    CEBBCAT
        2
    CEBBCAT  
       2018-10-22 05:31:40 +08:00 via Android
    没看懂
    egen
        3
    egen  
       2018-10-22 05:43:50 +08:00   ❤️ 1
    小票打印机我用的 escpos,图片也可以打印
    标签打印机不确定是否通用,可以试试
    ca1123
        4
    ca1123  
       2018-10-22 05:54:29 +08:00   ❤️ 1
    官方没有 SDK 么?这玩意什么原理?和普通打印机一样么?
    Handle
        5
    Handle  
    OP
       2018-10-22 05:57:30 +08:00
    @zhenjiachen 请问是 TSC 官方提供了 api 么?

    @CEBBCAT 需求是打印一些标签,标签中含有条码

    @egen escpos 么?感谢,我会去找找试试的

    @ca1123 按照得力官网来看,目前是没提供 sdk 之类的,只提供了一些专业标签条码打印软件……系统识别确实是普通连供纸打印机
    ca1123
        6
    ca1123  
       2018-10-22 05:57:46 +08:00
    @egen 我突然有一点点想建议楼主用喵喵机。。。
    Handle
        7
    Handle  
    OP
       2018-10-22 06:11:36 +08:00
    @ca1123 有特殊需求导致不能用热敏来着……

    @egen 想请问一下…… escpos 是否需要管理员权限来加载 DLL,我刚才尝试一直提示 dll 加载失败…… node-gyp 应该也是正确运行过了
    Handle
        8
    Handle  
    OP
       2018-10-22 06:43:07 +08:00
    @egen 特别刺激,似乎是 USB 驱动不兼容 node-usb 库,然后替换成兼容库之后打印机就完全不识别了……
    kokomo
        9
    kokomo  
       2018-10-22 06:44:40 +08:00 via Android
    标签字,我只推荐 Brother
    Handle
        10
    Handle  
    OP
       2018-10-22 06:52:07 +08:00
    @kokomo 最后希望实现的需求是希望能够适配不同打印机,在 Electron 中配置尺寸和信息后直接开打……所以机器型号啥的…… Brother 就嫌不奢求了吧
    jfcai
        11
    jfcai  
       2018-10-22 07:31:08 +08:00 via iPhone   ❤️ 1
    标签打印一般有两种方式:
    1、驱动打印,与普通打印机一样通过驱动方式打印。
    2、通过指令打印,不同厂家的的打印机指令集不一样,可查看厂家提供的手册。
    zxq2233
        12
    zxq2233  
       2018-10-22 07:38:48 +08:00   ❤️ 1
    已经有很成熟的商业解决方案 nicelabel。
    当然可以有办法免费使用。
    不懂 Electron,不过之前我使用 web 技术做过标签打印系统。
    使用纯 javascript 实现,

    设置网页大小为标签纸张尺寸(参考 http://jsfiddle.net/2wk6Q/3/)可以通过 js 动态生成连续这个页面。

    使用 css 布局标签上的内容,边距可以通过 padding 和 margin 控制。


    通过 js 变量生成连续编码。一二维码可以调用 js 库进行生成。
    然后调用 window.print();打印。
    OpenJerry
        13
    OpenJerry  
       2018-10-22 07:40:26 +08:00 via Android   ❤️ 1
    回答最后一个问题:加入一个社团,然后一天到晚都在实验室混就行了,我就是这样,该睡觉了才回宿舍
    zxq2233
        14
    zxq2233  
       2018-10-22 07:46:07 +08:00
    zxq2233
        15
    zxq2233  
       2018-10-22 07:47:38 +08:00 via Android
    你愿意学
    Handle
        16
    Handle  
    OP
       2018-10-22 07:48:39 +08:00
    @zxq2233 谢谢!测试了一下……一样出现了打印长度短于纸张宽度时,打印区域会自动旋转的问题……
    Handle
        17
    Handle  
    OP
       2018-10-22 07:54:45 +08:00
    @OpenJerry 很感谢,不过实际情况挺尴尬的……我今天通宵了……旁边那哥们也通宵打游戏喊了一晚上……
    Handle
        18
    Handle  
    OP
       2018-10-22 08:28:22 +08:00
    @zxq2233 刚才测试了一下,很感谢!虽然这个里面似乎对于 mm 的支持很差……但是至少终于可以在偏移不算离谱的情况下生成和打印少量标签了。不过这个和其他软件(例如 Word )具有相同问题,打印长度必须大于宽度……不知道怎样才能解决掉……
    yyss8
        19
    yyss8  
       2018-10-22 08:42:15 +08:00
    用 Html 排版个静态文件 然后用 chrome 打开看看能打印吗
    electron 自带的如果 Html 能打出来就能打出来 不然可能就要借用点第三方库了
    Handle
        20
    Handle  
    OP
       2018-10-22 08:50:20 +08:00 via Android
    @yyss8 都能打印,但就是和前文描述的一致,一旦页面高度小于宽度,整个页面打印的横向竖向就会翻转
    刚才在 word 又试了一会,发现 word 里面在页面高度小于宽度时会自作主张地把横竖向翻转,这样就导致了标签打印方向错误。猜测别的程序也有类似螺丝
    Handle
        21
    Handle  
    OP
       2018-10-22 08:50:47 +08:00 via Android
    @yyss8 抱歉,最后手滑了,猜测别的程序也有相似 逻辑
    sunorg
        22
    sunorg  
       2018-10-22 08:51:34 +08:00 via Android
    刚开发一个打印软件。用 pyqt 做成独立程序,可以打印图片,pdf,或者 html(不带图)。执行完美
    yyss8
        23
    yyss8  
       2018-10-22 08:54:00 +08:00
    @Handle 最好还是确认一下 不清楚 word 会不会加了自动排版
    drquest
        24
    drquest  
       2018-10-22 09:00:36 +08:00
    类似的事情我们做过,基本上不建议你在 Chrome 引擎里搞这些事情,因为 Web 标准打印相关的实现本来就很弱,加上浏览器引擎会自带一些 border 设置,基本上都会乱套,你可以考虑 html2canvas 之类的把要打印的内容先转位图再送进标签打印机,这样至少可以保证内文不乱。或者干脆写个 Windows service,大多数的打印机提供.Net 和 Java 的 SDK,开发起来方便很多。

    标签打印 SDK 最完善的是 zebra,我不建议你用没有 SDK 的型号自己 hack,从项目的角度讲增加很多成本和风险,比较得不偿失。
    09apple
        25
    09apple  
       2018-10-22 09:11:44 +08:00
    旋转 90 度...是不是打印方向跟你预期的不一样- -
    Handle
        26
    Handle  
    OP
       2018-10-22 09:15:13 +08:00
    @sunorg 请问方便详细说说么?

    @yyss8 Word,如果在页面高度高于宽度,页面设置为纵向,印刷一切正常
    如果高度小于宽度,无论横纵印刷均为旋转 90 度

    @drquest 谢谢!确实一开始就是打算把要打印的内容转为图像再打印出来,于是才先在 Word 一类的软件中尝试正常打印一场宽度 8cm 高度 3cm 左右的内容。关于机器的选用,理由很简单……穷学生只是想尽量省钱来入手一台热转印机……一开始没有考虑太多,错误地估计了这部分的难度……现在可能确实需要想办法 hack ……
    而且还有一点就是……明明都有专门的软件适配多种不同型号……其中应该也不会使用太多不同机种 api,我也很好奇这些软件地实现
    Handle
        27
    Handle  
    OP
       2018-10-22 09:15:48 +08:00
    @09apple 当高度小于宽度的时候,无论怎么设置,打印出来的方向都不太对……
    rockyou12
        28
    rockyou12  
       2018-10-22 09:21:24 +08:00
    @drquest lz 这个需求用 electron 没问题的,electron 的主进程是 node 运行时,调 dll 什么的完全没问题。我司现在在做个 pos 打印相关的项目,也是 electron 没什么坑。lz 其实能找到其他语言的库写了然后用 node 调就行了
    drquest
        29
    drquest  
       2018-10-22 09:29:14 +08:00
    @Handle 得力的这个机器很可能是贴牌的,你从驱动里找一下字符串或者从 device_id 或者拆开看一下主板找一下它是哪一家 OEM 的,基本上上游厂家都会给 SDK,国内很多小厂牌收据打印机都是贴牌芯烨 Xprinter 的,你可以找找看。
    egen
        30
    egen  
       2018-10-22 09:30:23 +08:00
    @Handle #8
    这个库编译比较麻烦,如果中途出错,最好清掉重新来一遍
    权限不记得了,当时是在 win7 上编译和使用的,默认就是 administrator 权限
    理论上只要普通的 usb 驱动可以识别到打印机就可以,因为走的是 ESC/POS 协议,应该符合标准的打印机都可以使用的
    Handle
        31
    Handle  
    OP
       2018-10-22 09:45:29 +08:00
    @rockyou12 谢谢!现在还在找库,笑


    @yyss8 刚才给得力打了个电话,对方表示 Word 无法正常打印,但是 Excel 可以。我实际测试了一下,确实 Excel 可以正常打印。此外对方明确表示短期不会提供二次开发相关 sdk 之类工具,无奈。

    @drquest 谢谢,vid 0x20d1, pid 0x7008,海鸥的驱动程序……
    找到了! Inf 部分显示为 TSC,我或许可以从这里切入试试

    @egen 之后尝试了多次,发现不是权限问题,是 USB 库不支持这台打印机,笑
    Handle
        32
    Handle  
    OP
       2018-10-22 10:13:16 +08:00
    @drquest 此外,excel 可以正常地打印和布局……如果可以实现 excel 的打印效果也就不需要限定打印机型号就能打印了……我个人更希望能这样,笑
    yyss8
        33
    yyss8  
       2018-10-22 11:12:03 +08:00
    @Handle 说明只是 word 的问题 如果考虑 electron 就试试 html 咯
    electron 自带的能用的库我之前找的只找到 node-printer 和自带的 但是 node-printer 要排版就得用 pdf 但是还只支持 linux
    如果有 c++基础可以自己写打印的 dll node-printer 本身也是调用那作者自己写的 c++文件 然而那时候赶业务也没时间去学 c++
    drquest
        34
    drquest  
       2018-10-22 11:32:42 +08:00   ❤️ 1
    sobigfish
        35
    sobigfish  
       2018-10-22 11:56:18 +08:00
    生成 pdf 再调用 chrome 自己的打印? https://github.com/diegomura/react-pdf
    或者菜鸟打印组件? https://www.cainiao.com/markets/cnwww/print
    sobigfish
        36
    sobigfish  
       2018-10-22 12:17:05 +08:00
    @sobigfish #35 欸,这个不是之前那个自己控制内容的 API 级别的了-,- 我再找找
    sunorg
        37
    sunorg  
       2018-10-22 16:33:58 +08:00 via Android
    @Handle 我走的是 qt 路线
    Handle
        38
    Handle  
    OP
       2018-10-22 18:07:50 +08:00
    @yyss8 现在就是发现 html 和 word 有相似逻辑,页面宽高会自作主张


    @drquest 谢谢!如果这个软件提供 sdk 的话开发一定能简单很多


    @sobigfish 这两个都是有个问题……页面高度都大于宽度,在 chrome 上打印正常。但这里需求是打印一些标签,宽度远大于高度的

    @sunorg 这样啊…… C 系语言果然还是在解决这种相对基础的问题上更容易一些啊
    Handle
        39
    Handle  
    OP
       2018-10-22 18:10:39 +08:00
    @drquest 这个 SDK 浏览了一下,似乎是依赖于机器上预先安装好 BarTender 才可以正常工作…… Excel 却没有这样的依赖
    Handle
        40
    Handle  
    OP
       2018-10-22 19:01:08 +08:00
    @yyss8 刚才测试了一下,如果直接打印标签的图像(宽 8cm 高 3cm )打印十分完美(使用系统自带的右键菜单中的图片打印入口)
    sunorg
        41
    sunorg  
       2018-10-22 20:06:08 +08:00 via Android
    @Handle 我的需求是无弹出对话框,直接出标签。目前完美实现
    Handle
        42
    Handle  
    OP
       2018-10-22 22:20:23 +08:00
    @sunorg 请问是走的 windows API 么?
    sunorg
        43
    sunorg  
       2018-10-22 22:53:05 +08:00
    @Handle

    Qprinter 组件,底层实现是 qt 已封装好。
    Handle
        44
    Handle  
    OP
       2018-10-23 03:47:47 +08:00
    @sunorg 谢谢,参考了这篇文章终于算是实现了一个 std 程序打印一些文本出来了。https://blog.csdn.net/Tobin_Wang/article/details/80585900
    Handle
        45
    Handle  
    OP
       2018-10-23 04:59:12 +08:00
    @jfcai @sunorg @drquest
    谢谢各位前辈悉心指教!已成功解决将位图文件打印出来且方向正确的基本需求
    windows API 实现打印图片,图片可以通过 canvas 生成所以不是什么太大的问题
    细节中,成功创建打印机 HDC 对象之后,使用下列语句创建一个虚拟的适配的 HDC 对象
    ( C++语言)
    HDC virtualDC = CreateCompatibleDC(hdcprint);

    然后通过以下语句来把位图( HBITMAP )拷贝到真实打印机上即可
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(virtualDC, img0);
    BitBlt(hdcprint, 0, 0, 647, 240, virtualDC, 0, 0, SRCCOPY);

    最终打印效果和系统内置图像浏览器的打印效果相同
    dsnake1984
        46
    dsnake1984  
       2019-01-10 04:19:04 +08:00
    知道有个 js lodop 快递鸟网站有破解版的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3023 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.