使用 POS 打印机打印 Javascript 收据

43

在一个Web应用程序中,我想使用POS(销售点)打印机打印收据。我想使用JavaScript来实现这个目标。有人可以提供一个例子吗?


这是相当苛刻的要求...你今天能以哪种方式通过POS打印机打印呢?我认为你需要一些服务器端处理(因此我的建议是通过AJAX调用一个服务器端脚本来进行打印)。 - mariusnn
2
我认为这已经超出了JavaScript的范围。您可以使用JavaScript来帮助创建格式化打印的HTML文档,甚至启动打印对话框,以便用户只需点击“打印”按钮...只要POS打印机已安装在PC上并在打印机列表中设置为选项。打印需要适用于该打印机的驱动程序,而JS无法深入到机器的硬件中,除非您在运行可用于接入硬件的API的环境中。但是这在浏览器中不会发生。 - jwatts1980
你是否能提供更多信息?你目前有什么进展了吗?你只是想要打印功能吗,还是这与POS有关?谷歌返回了很多使用JS进行打印的示例,这可能会有所帮助。 - Nick
爱普生似乎是少数几个能够进行此项检查的打印机之一,请查看 ePOS Javascript SDK 文档 https://download.epson-biz.com/modules/pos/index.php?page=single_soft&cid=6046&scat=57&pcat=52 - SomethingOn
我在爱普生网站上看到了JS SDK的链接:https://download.epson-biz.com/modules/pos/index.php?page=soft&pcat=52&scat=57 - Ayman Morsy
8个回答

18
我猜测您的问题描述不够详细,因此我需要冒昧地给出以下假设: a)您的收据打印机是一种需要原始数据的热敏打印机, b)您提到的“来自JavaScript”是指从Web浏览器打印, c)您无法从浏览器发送原始数据。
这里有一个Java Applet可以为您解决所有问题,如果我的假设是正确的,那么您需要使用Java、Flash或Silverlight。 http://code.google.com/p/jzebra/

在移动设备上,比如安卓手机中,从网页浏览器打印怎么样? - radztech
@radztech - 那里情况相同 - Scott Selby
2
https://github.com/qzind/tray/ - Erol Guzoğlu
@ErolGuzoğlu - 这仍然是来自浏览器。而不是作为JavaScript网站的一部分编写的客户端代码。运行在操作系统上的浏览器可以访问比浏览器执行的网站的JavaScript更多的内容。 - Scott Selby
@ScottSelby - ErolGuzoğlu 提供的链接会返回到桌面客户端,该客户端可以访问打印机等设备。 - tresf
1
现在 http://qz.io - Temitayo

13

我最近通过在网页上按下按钮来简单地实现了收据打印,而无需进入打印机选项。我使用了 EPSON javascript SDK for ePOS 来完成它。我已经在 EPSON TM-m30 收据打印机上进行了测试。

这是示例代码。

var printer = null;
var ePosDev = null;

function InitMyPrinter() {
    console.log("Init Printer");

    var printerPort = 8008;
    var printerAddress = "192.168.198.168";
    if (isSSL) {
        printerPort = 8043;
    }
    ePosDev = new epson.ePOSDevice();
    ePosDev.connect(printerAddress, printerPort, cbConnect);
}

//Printing
function cbConnect(data) {
    if (data == 'OK' || data == 'SSL_CONNECT_OK') {
        ePosDev.createDevice('local_printer', ePosDev.DEVICE_TYPE_PRINTER,
            {'crypto': false, 'buffer': false}, cbCreateDevice_printer);
    } else {
        console.log(data);
    }
}

function cbCreateDevice_printer(devobj, retcode) {
    if (retcode == 'OK') {
        printer = devobj;
        printer.timeout = 60000;
        printer.onreceive = function (res) { //alert(res.success);
            console.log("Printer Object Created");

        };
        printer.oncoveropen = function () { //alert('coveropen');
            console.log("Printer Cover Open");

        };
    } else {
        console.log(retcode);
        isRegPrintConnected = false;
    }
}

function print(salePrintObj) {
    debugger;
    if (isRegPrintConnected == false
        || printer == null) {
        return;
    }
    console.log("Printing Started");


    printer.addLayout(printer.LAYOUT_RECEIPT, 800, 0, 0, 0, 35, 0);
    printer.addTextAlign(printer.ALIGN_CENTER);
    printer.addTextSmooth(true);
    printer.addText('\n');
    printer.addText('\n');

    printer.addTextDouble(true, true);
    printer.addText(CompanyName + '\n');

    printer.addTextDouble(false, false);
    printer.addText(CompanyHeader + '\n');
    printer.addText('\n');

    printer.addTextAlign(printer.ALIGN_LEFT);
    printer.addText('DATE: ' + currentDate + '\t\t');

    printer.addTextAlign(printer.ALIGN_RIGHT);
    printer.addText('TIME: ' + currentTime + '\n');

    printer.addTextAlign(printer.ALIGN_LEFT);

    printer.addTextAlign(printer.ALIGN_RIGHT);
    printer.addText('REGISTER: ' + RegisterName + '\n');
    printer.addTextAlign(printer.ALIGN_LEFT);
    printer.addText('SALE # ' + SaleNumber + '\n');

    printer.addTextAlign(printer.ALIGN_CENTER);
    printer.addTextStyle(false, false, true, printer.COLOR_1);
    printer.addTextStyle(false, false, false, printer.COLOR_1);
    printer.addTextDouble(false, true);
    printer.addText('* SALE RECEIPT *\n');
    printer.addTextDouble(false, false);
....
....
....

}

1
可以通过USB打印TM T-20吗? - vicasas
isSSL来自哪里?为什么isRegPrintConnected变量丢失了? - Jim Vercoelen
1
对于这个问题,爱普生有一个支持打印机和接口的列表,适用于他们的ePOS Javascript SDK。https://download.epson-biz.com/modules/pos/index.php?page=single_soft&cid=6046&scat=57&pcat=52 - SomethingOn
@teapeng同意,没错,爱普生的ePOS型号支持JavaScript打印。 - Habib Sheikh
@HabibSheikh 你用模拟器测试了吗?如果有,用的是哪一个? - Vandana Chadha
显示剩余4条评论

7

编辑:2017年11月27日 ─ 链接失效

David Kelley所写的文章下面的链接已经失效

存储库有缓存版本,只需在Chrome浏览器中在URL之前加上cache:,然后按回车键即可。


此解决方案仅适用于Google Chrome基于Chromium的浏览器。

编辑:

(*)链接已失效。幸运的是我找到了这个存储库,其中包含以下markdown文件的帖子来源:A | B

此链接* 解释了如何使用Chrome / Chromium USB API制作用于ESC / POS打印机的Javascript接口(1)(2)此链接* 解释了如何使用chrome.usb.* API连接USB设备。


1
看起来chrome.usb* API仅适用于Chrome扩展,而不是JavaScript。 - Karthik Sankar
@FelipeAlarcon 抱歉,我没有链接内容的副本。希望这里有人有一份副本。 - Richard Cotrina
1
@FelipeAlarcon 找到了源代码!答案已更新。 :) - Richard Cotrina

7
如果您在谈论基于浏览器的POS应用程序,则基本上无法直接完成。有很多替代方案。
1. 使用像Scott Selby所说的小应用程序。 2. 从服务器打印。如果这是云服务器,即无法连接到收据打印机,则可以做以下事情: - 从服务器生成PDF文件,可以在浏览器中弹出打印对话框。 - 使用类似Google Cloud Print的东西,它将允许连接打印机到云服务。

除了PDF,使用media="print"来样式化CSS的内容也可以胜任这项工作。 - clapas
可能可以。您能否在通常打印页面时关闭页眉和页脚,并使用 media="print" 精确控制页面大小? - Craig

4
我使用JavaScript将内容打印到Star Micronics Webprnt TSP 654ii热敏打印机。该打印机是有线网络打印机,您可以将内容绘制到HTML画布并发出HTTP请求进行打印。唯一的问题是,该打印机尚不支持HTTPS协议,因此在生产中会收到混合内容警告。联系了Star Micronics支持团队,他们表示正在开发HTTPS支持,并很快将提供固件升级。另外,看起来Epson Omnilink TM-88V打印机与TM-I将支持JavaScript打印。
以下是示例代码:https://github.com/w3cloud/starwebprint

能够直接从JavaScript打印的热敏打印机价格昂贵。此外,混合内容警告也很麻烦。因此,我得出结论:目前直接从JavaScript打印不是一个好主意。相反,我使用了媒体打印标签,并调用window.print来打开打印对话框。此外,在亭子模式下,Chrome甚至可以在不显示打印预览对话框的情况下进行打印。这很酷,效果几乎与直接打印相同。 - Karthik Sankar
我也使用过这些打印机。价格有点让人烦恼。我已经和Star公司沟通过了,他们表示将会推出支持HTTPS的更新。 - Craig
我非常需要JavaScript HTML5画布打印。如果你们中有人尝试过Epson TM-20ii-I Omni link打印机,请分享一下你的经验。想知道它是否支持HTTPS。 - Karthik Sankar
我还没有尝试过这台打印机。我想测试和支持更多的打印机,但它们很昂贵! - Craig
我浏览了一下代码,但是不知道在打印机通过USB端口连接时应该在打印机URL中使用什么。 - Serge Pedroza
@KarthikSankar 我也想使用Star Micronics打印机。我正在使用连接到PC的SK1打印机,使用USB进行连接。我该如何配置本地主机端口以发送打印命令?我在这里卡住了。 - Nikhil Mohanan

3

你发布的关于EPSON ePOS的链接已经失效。 - chipit24

1

1

3
有没有PrintNode的版本可以在您自己的服务器上托管,以确保您的文档隐私? - phyzalis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接