繁体   English   中英

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

[英]JavaScript: Send raw text to printer - no server requests/method calls, able to work offline, purely clientside

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

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();

就目前而言(测试目的),theDiv是我放置ZPL字符串的容器。 基本上,我明白,最好的解决方案是打开一个新的弹出窗口,用ZPL字符串填充它并调用thePopupWindow.print(); 然后用户选择斑马打印机并点击“打印”。 问题是:看起来打印机会将正在打印的内容解释为html页面(因为

<html><head></head><body>theZPLString comes here</body></html>

标签,我看,当我检查Chrome中的弹出窗口时,并将ZPL代码打印为纯文本,而不是解释它并打印标签。 我想我需要类似thePopupWindow.write()来避免写入窗口的document属性,这显然将字符串包装在html代码中。 为了测试它,我使用Generic / Text Only驱动程序并将“打印”保存到.txt文件中。

在Chrome中,我收到一个空文件。

在Mozilla中,当我删除这一行时:mywindow.document.open('text / plain'); 我把ZPL作为字符,每行一个。 当我添加它时,我只得到一个日期和时间,每行再一个字符。

在IE中 - 我得到这个(有或没有mywindow.document.open('text / plain');):

Page 1 o



    ^XA^PW400^LL37^





          12.4.2016

我找到了各种解决方案,但它们涉及使用php,c#,甚至java,我不希望它是服务器端,如标题中所述。 任何帮助将不胜感激。 @forgivenson,谢谢你的观点。 读完你的后,我看到了小'x',我可以点击删除我的评论,所以我在问题中添加了评论。 我错过了一些非常重要的东西:打印机通过USB端口连接!

打印到Zebra打印机时, ^XA之前和^XZ之后的所有内容都将被忽略。 zpl周围的html标签不会干扰。

您必须确保唯一的事情是将RAW文本打印到打印机。

使用Zebra打印机的内置W​​indows Generic / Text Only驱动程序 而不是斑马司机。

  • 普通斑马驱动程序:将打印作业呈现为位图
    • 结果:zpl代码的慢速打印图像。
  • 仅文本驱动程序:将zpl代码直接发送到打印机
    • 结果:来自打印机上呈现的zpl的快速打印贴纸

关于jsfiddlegist.run的示例

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();
}

测试中

  • 边缘
  • IE浏览器
  • 火狐

不工作:


在打印机属性中选择Generic / Text Only驱动程序:

Zebra打印机 -  Generic / Text Only驱动程序

以下片段在FirefoxIE11上为我工作,对打印机的属性稍作改动。

我正在使用台打印机模拟器。

Chrome中 ,从Chrome的“打印”对话框打印时,我从模拟器中收到错误消息。 使用系统对话框会出现有关Chrome打印失败的错误。 CTRL + SHIFT + P(跳过Chrome对话框的快捷方式)没有错误,没有任何反应。 所有这些错误都可能与模拟器有关,但我没有真正的打印机来测试它。

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

  • 开始打印作业: ${
  • 结束打印作业: }$

正如您在下面的脚本中看到的那样,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()" />

的jsfiddle

如果要在不涉及打开弹出窗口或用户提示的情况下始终如一地完成此操作,则需要在客户端PC上运行的应用程序充当应用程序的javascript和客户端打印机之间的中介。

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

另一种方法是开发一个在客户端PC上运行的小应用程序,它可以监听websocket连接。 您的Web应用程序将通过与客户端的websocket服务器的连接发送ZPL,而后者将生成打印作业。

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

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

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

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

https://www.zebra.com/us/en/products/software/barcode-printers/link-os/browser-print.html

你看,这里的主要问题是Zebra命令只有在你可以将未经修改的原始字节直接发送到打印机端口时才能工作。 不幸的是,浏览器不允许你这样做。

你需要一些方法来获得这样的直接访问:

  • 一种方法是通过浏览器扩展,因此您对硬件的访问权限较少; 你可以通过NPAPI做到这一点,但Chrome不支持这一点,Mozilla和IE都将很快停止支持; Chrome可以允许通过Native Messaging API直接访问硬件; Mozilla可能很快就会支持类似的解决方案 ;
  • 另一种选择是使用Java JNLP应用程序来提供这种访问,并且可以从浏览器调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM