JavaScript:将原始文本发送到打印机 - 无服务器 requests/method 调用,能够离线工作,纯客户端
JavaScript: Send raw text to printer - no server requests/method calls, able to work offline, purely clientside
我对网络的深入研究为我提供了一些想法,但其中 none 似乎在我的特定用例中可以正常工作。这是我拥有的:
1) Zebra打印机,使用ZPL作为打印语言;
2) java脚本中的一个字符串,由 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 字符串的容器。基本上,我明白,最好的解决方案是打开一个新的弹出窗口 window,用 ZPL 字符串填充它并调用 thePopupWindow.print();然后用户选择 zebra 打印机并点击 'Print'。
问题: 打印机似乎将正在打印的内容解释为 html 页(因为
<html><head></head><body>theZPLString comes here</body></html>
标签,例如,当我检查 Chrome 中的弹出窗口时)并将 ZPL 代码打印为纯文本,而不是解释它并打印标签。我想我需要像 thePopupWindow.write() 这样的东西来避免写入 window 的文档 属性,这显然将字符串包装在 html 代码中。
为了测试它,我只使用 Generic/Text driver 并将 "printed" 保存到 .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,我不希望它成为标题中提到的 server-side。
任何帮助将不胜感激。
@forgivenson,谢谢你的观点。看完你的后,我看到了'x',我可以点击删除我的评论,所以我在问题中添加了评论。
我错过了一些非常重要的事情:打印机是通过 USB 端口连接的!
以下代码片段在 Firefox 和 IE11 上对我有用,对打印机的属性稍作更改。
我正在使用 this 打印机模拟器。
在 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()" />
如果您想在不涉及打开弹出窗口或用户提示的情况下始终如一地完成此操作,您将需要在客户端 PC 上安装一个应用程序 运行 作为应用程序 javascript 之间的中介和客户的打印机。
一种流行的方法是通过浏览器插件 (NPAPI)。但是这种方法很快就会过时,因为许多浏览器已经开始完全删除 NPAPI 支持 (Chrome, Firefox)。
另一种方法是开发一个在您的客户端 PC 上运行的小型应用程序,用于侦听 websocket 连接。您的 Web 应用程序将通过连接将 ZPL 发送到客户端的 websocket 服务器,这反过来将生成打印作业。
第三种方法 - 某些打印机具有可以发送原始 ZPL 的内部 IP 地址。如果您构建 Web 应用程序以便用户可以配置此 IP 地址,则可以选择将 ZPL 发送到该地址。但是,如果您的用户使用不支持此功能的打印机,这将不起作用。
你看,这里的主要问题是 Zebra 命令只有在你可以将原始的、未修改的字节直接发送到打印机端口时才能工作;不幸的是,浏览器不允许您这样做。
您将需要一些方法来获得这种直接访问权限:
- 一种方法是通过浏览器扩展程序,这样您对硬件的访问就会受到更少的限制;您可以通过 NPAPI 做到这一点,但 Chrome 不支持它,Mozilla 和 IE 很快就会停止支持它;; Chrome 很快就可以允许通过 Native Messaging API; Mozilla may support a similar solution 直接访问硬件了;
- 另一种选择是使用 Java JNLP 应用程序来提供这种访问,并且可以从浏览器中调用它。
当打印到 Zebra 打印机时,^XA
之前和 ^XZ
之后的所有内容都将被忽略。 zpl 周围的 html 标签不会干扰。
您唯一必须确保将 RAW 文本打印到打印机。
为您的 Zebra 打印机使用 windows Generic / Text Only
内置驱动程序。而不是斑马驱动程序。
- 普通 Zebra 驱动程序:将打印作业呈现为位图
- 结果:打印速度较慢的 zpl 代码图像。
- 纯文本驱动程序:将 zpl 代码直接发送到打印机
- 结果:一张快速打印的贴纸,来自打印机上渲染的 zpl
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();
}
测试于
- 边缘
- Internet Explorer
- 火狐
不工作于:
- Chrome
- Chrome 在将图像发送到打印机驱动程序之前创建图像 (https://productforums.google.com/forum/#!topic/chrome/GYf6iI42Ug4)
Select 打印机属性中的通用/纯文本驱动程序:
Zebra 创建了一个名为 (BROWSER PRINT) 的应用程序,并于 2016 年 4 月发布。
它似乎是一个本地 JAVA 服务,在您的计算机上运行并公开伪休息 api。他们提供 javascript api 来隐藏细节并简化使用。
目前支持(ZD500、ZD410、LP2824+、ZT230、ZT420、QLn320、GX420)
如果有多台打印机,它允许您 select 打印机。
还允许 2 路通信,您可以在其中询问打印机的状态并获得结果。他们最近添加了对连接到以太网的打印机的支持,但不支持通过 Windows UNC 路径映射的打印机。
https://www.zebra.com/us/en/products/software/barcode-printers/link-os/browser-print.html
我对网络的深入研究为我提供了一些想法,但其中 none 似乎在我的特定用例中可以正常工作。这是我拥有的:
1) Zebra打印机,使用ZPL作为打印语言;
2) java脚本中的一个字符串,由 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 字符串的容器。基本上,我明白,最好的解决方案是打开一个新的弹出窗口 window,用 ZPL 字符串填充它并调用 thePopupWindow.print();然后用户选择 zebra 打印机并点击 'Print'。 问题: 打印机似乎将正在打印的内容解释为 html 页(因为
<html><head></head><body>theZPLString comes here</body></html>
标签,例如,当我检查 Chrome 中的弹出窗口时)并将 ZPL 代码打印为纯文本,而不是解释它并打印标签。我想我需要像 thePopupWindow.write() 这样的东西来避免写入 window 的文档 属性,这显然将字符串包装在 html 代码中。 为了测试它,我只使用 Generic/Text driver 并将 "printed" 保存到 .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,我不希望它成为标题中提到的 server-side。 任何帮助将不胜感激。 @forgivenson,谢谢你的观点。看完你的后,我看到了'x',我可以点击删除我的评论,所以我在问题中添加了评论。 我错过了一些非常重要的事情:打印机是通过 USB 端口连接的!
以下代码片段在 Firefox 和 IE11 上对我有用,对打印机的属性稍作更改。
我正在使用 this 打印机模拟器。
在 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()" />
如果您想在不涉及打开弹出窗口或用户提示的情况下始终如一地完成此操作,您将需要在客户端 PC 上安装一个应用程序 运行 作为应用程序 javascript 之间的中介和客户的打印机。
一种流行的方法是通过浏览器插件 (NPAPI)。但是这种方法很快就会过时,因为许多浏览器已经开始完全删除 NPAPI 支持 (Chrome, Firefox)。
另一种方法是开发一个在您的客户端 PC 上运行的小型应用程序,用于侦听 websocket 连接。您的 Web 应用程序将通过连接将 ZPL 发送到客户端的 websocket 服务器,这反过来将生成打印作业。
第三种方法 - 某些打印机具有可以发送原始 ZPL 的内部 IP 地址。如果您构建 Web 应用程序以便用户可以配置此 IP 地址,则可以选择将 ZPL 发送到该地址。但是,如果您的用户使用不支持此功能的打印机,这将不起作用。
你看,这里的主要问题是 Zebra 命令只有在你可以将原始的、未修改的字节直接发送到打印机端口时才能工作;不幸的是,浏览器不允许您这样做。
您将需要一些方法来获得这种直接访问权限:
- 一种方法是通过浏览器扩展程序,这样您对硬件的访问就会受到更少的限制;您可以通过 NPAPI 做到这一点,但 Chrome 不支持它,Mozilla 和 IE 很快就会停止支持它;; Chrome 很快就可以允许通过 Native Messaging API; Mozilla may support a similar solution 直接访问硬件了;
- 另一种选择是使用 Java JNLP 应用程序来提供这种访问,并且可以从浏览器中调用它。
当打印到 Zebra 打印机时,^XA
之前和 ^XZ
之后的所有内容都将被忽略。 zpl 周围的 html 标签不会干扰。
您唯一必须确保将 RAW 文本打印到打印机。
为您的 Zebra 打印机使用 windows Generic / Text Only
内置驱动程序。而不是斑马驱动程序。
- 普通 Zebra 驱动程序:将打印作业呈现为位图
- 结果:打印速度较慢的 zpl 代码图像。
- 纯文本驱动程序:将 zpl 代码直接发送到打印机
- 结果:一张快速打印的贴纸,来自打印机上渲染的 zpl
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();
}
测试于
- 边缘
- Internet Explorer
- 火狐
不工作于:
- Chrome
- Chrome 在将图像发送到打印机驱动程序之前创建图像 (https://productforums.google.com/forum/#!topic/chrome/GYf6iI42Ug4)
Select 打印机属性中的通用/纯文本驱动程序:
Zebra 创建了一个名为 (BROWSER PRINT) 的应用程序,并于 2016 年 4 月发布。 它似乎是一个本地 JAVA 服务,在您的计算机上运行并公开伪休息 api。他们提供 javascript api 来隐藏细节并简化使用。
目前支持(ZD500、ZD410、LP2824+、ZT230、ZT420、QLn320、GX420)
如果有多台打印机,它允许您 select 打印机。 还允许 2 路通信,您可以在其中询问打印机的状态并获得结果。他们最近添加了对连接到以太网的打印机的支持,但不支持通过 Windows UNC 路径映射的打印机。
https://www.zebra.com/us/en/products/software/barcode-printers/link-os/browser-print.html