JavaScript:将原始文本发送到打印机-无服务器请求/方法调用,能够脱机工作,纯客户端

JavaScript:将原始文本发送到打印机-无服务器请求/方法调用,能够脱机工作,纯客户端,javascript,html,printing,zpl,Javascript,Html,Printing,Zpl,我对网络的深入研究为我提供了一些想法,但在我的特定用例中似乎没有一个能正确工作。以下是我所拥有的: 1) Zebra打印机,使用ZPL作为其打印语言 2) javascript中的字符串,由3个ZPL表单组成,用于打印3个标签 我们的系统工程师已经验证了ZPL语法是正确的。 我试图实现的是将字符串作为纯文本发送给打印机,以接受它作为ZPL指令来打印标签。 到目前为止,我提出的最佳方案如下: var mywindow = window.open('', 'Printing', 'width=800

我对网络的深入研究为我提供了一些想法,但在我的特定用例中似乎没有一个能正确工作。以下是我所拥有的:

1) Zebra打印机,使用ZPL作为其打印语言

2) javascript中的字符串,由3个ZPL表单组成,用于打印3个标签

我们的系统工程师已经验证了ZPL语法是正确的。 我试图实现的是将字符串作为纯文本发送给打印机,以接受它作为ZPL指令来打印标签。 到目前为止,我提出的最佳方案如下:

var mywindow = window.open('', 'Printing', 'width=800,height=600');
//mywindow.write("testDirectWrite"); // not working
mywindow.document.open('text/plain');
////mywindow.document.write('<html><head><title>Printing</title><meta charset="ISO-8859-1">');
///*optional stylesheet*/ //mywindow.document.write('<link rel="stylesheet" href="main.css" type="text/css" />');
////mywindow.document.write('</head><body>');
var theDiv = $(".test-printirane-po-usb");
var printContents = theDiv[0].innerText;
mywindow.document.write(printContents);
////mywindow.document.write('</body></html>');

//mywindow.document.close(); // necessary for IE >= 10
//mywindow.focus(); // necessary for IE >= 10

//mywindow.print();
//mywindow.close();
我找到了各种各样的解决方案,但它们涉及到使用php、c#,甚至java,我不希望它像标题中提到的那样是服务器端的。 任何帮助都将不胜感激。 @原谅我,谢谢你的观点。在读了你的评论后,我看到了小“x”,我可以点击它删除我的评论,所以我在问题中添加了评论。
我错过了一件非常重要的事情:打印机是通过USB端口连接的

以下代码片段适用于我在FirefoxIE11上使用的情况,只是对打印机的属性做了一些更改

我正在使用打印机模拟器

Chrome中,当从Chrome的打印对话框打印时,我从emulator中得到错误。“使用系统”对话框提供有关Chrome打印失败的错误信息。CTRL+SHIFT+P(跳过Chrome对话框的快捷方式)没有错误,也不会发生任何事情。 所有这些错误可能都与emulator有关,但我并没有真正的打印机来测试它

在打印机属性中,我设置了以下选项:

  • 开始打印作业:
    ${
  • 结束打印作业:
    }$
正如您在下面的脚本中所看到的,ZPL代码被包装在
'${'
'}$'

<script type="text/javascript">
  function openWin() {
    var printWindow = window.open();
    printWindow.document.open('text/plain')
    printWindow.document.write('${^XA^FO50,100^BXN,10,200^FDYourTextHere^FS^XZ}$');
    printWindow.document.close();
    printWindow.focus();
    printWindow.print();
  }
</script>
<input type="button" value="Print code" onclick="openWin()" />

函数openWin(){
var printWindow=window.open();
printWindow.document.open('文本/普通')
printWindow.document.write(“${^XA^fo50100^BXN,10200^FDYourTextHere^FS^XZ}$”);
printWindow.document.close();
printWindow.focus();
printWindow.print();
}

如果您希望在不打开弹出窗口或用户提示的情况下始终如一地完成此任务,则需要在客户端PC上运行一个应用程序,作为应用程序javascript和客户端打印机之间的中介

一种流行的方法是通过浏览器插件(NPAPI)。但这种方法很快就过时了,因为许多浏览器已经开始完全删除NPAPI支持(,)

另一种方法是开发一个在客户端PC上运行的小型应用程序,用于侦听websocket连接。您的web应用程序将通过连接将ZPL发送到客户端的websocket服务器,后者将生成打印作业


第三种方法-一些打印机有一个内部IP地址,可以通过原始ZPL发送。如果您构建web应用程序以便用户可以配置此IP地址,则可以选择将ZPL发送到该地址。但是,如果您的用户使用的打印机不支持此功能,则此命令将不起作用。

您可以看到,这里的主要问题是,只有当您可以将原始的、未修改的字节直接发送到打印机端口时,Zebra命令才会起作用;不幸的是,浏览器不允许您这样做

您需要某种方式来获得这种直接访问:

  • 一种方法是通过浏览器扩展,这样您对硬件的访问限制就更少了;你可以通过NPAPI做到这一点,但Chrome不支持这一点,Mozilla和IE很快就会停止支持这一点;;Chrome可以通过浏览器直接访问硬件;Mozilla可能很快就会支持一个新的应用程序
  • 另一种选择是使用JavaJNLP应用程序来提供这样的访问,并且可以从浏览器中调用它

在Zebra打印机上打印时,忽略
^XA
之前和之后的所有内容。zpl周围的html标记不会产生干扰

您必须确保的唯一一件事是将原始文本打印到打印机上

为您的Zebra打印机使用内置windows
通用/纯文本
驱动程序
。而不是斑马司机

  • 普通zebra驱动程序:将打印作业渲染为位图
    • 结果:zpl代码的慢打印图像
  • 纯文本驱动程序:将zpl代码直接发送到打印机
    • 结果:打印机上呈现zpl的快速打印标签
例句


测试

  • 边缘
  • Internet Explorer
  • 火狐
不在以下地点工作:

    • Chrome在将图像发送到打印机驱动程序()之前创建图像

在打印机属性中选择通用/纯文本驱动程序:


Zebra创建了一个名为(浏览器打印)的应用程序,该应用程序于2016年4月发布。 它似乎是一个本地JAVA服务,在您的计算机上运行,并公开一个伪RESTAPI。它们提供了一个javascript api来隐藏细节并简化使用

目前支持(ZD500、ZD410、LP2824+、ZT230、ZT420、QLn320、GX420)

如果有多台打印机,它允许您选择打印机。 还允许双向通信,您可以询问打印机的状态并获得结果。他们最近增加了对连接到以太网的打印机的支持,但不支持通过Windows UNC路径映射的打印机


仅供参考,您可以编辑您的问题以添加该信息。有趣的问题。当我遇到类似的问题时,我不得不创建一个签名的Java小程序,它唯一的功能就是向打印机端口发送字节。另一种选择是编写特定于浏览器的扩展。出于安全考虑,我怀疑是否有办法仅使用javascript将字节直接发送到打印机
Page 1 o



    ^XA^PW400^LL37^





          12.4.2016
<script type="text/javascript">
  function openWin() {
    var printWindow = window.open();
    printWindow.document.open('text/plain')
    printWindow.document.write('${^XA^FO50,100^BXN,10,200^FDYourTextHere^FS^XZ}$');
    printWindow.document.close();
    printWindow.focus();
    printWindow.print();
  }
</script>
<input type="button" value="Print code" onclick="openWin()" />
function printZpl(zpl) {
  var printWindow = window.open();
  printWindow.document.open('text/plain')
  printWindow.document.write(zpl);
  printWindow.document.close();
  printWindow.focus();
  printWindow.print();
  printWindow.close();
}