web-dev-qa-db-ja.com

JavaScript:生のテキストをプリンターに送信-サーバー要求/メソッド呼び出しはなく、純粋にクライアントサイドでオフラインで作業可能

Webで徹底的に調査した結果、いくつかのアイデアが得られましたが、特定のユースケースでは正しく機能しないようです。ここに私が持っているものがあります:

1)印刷言語としてZPLを使用するZebraプリンター。

2)3つのラベルを印刷するための3つのZPLフォームで構成されるjavascriptの文字列。

システムエンジニアは、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()のようなものが必要だと思います。これは明らかにHTMLコードで文字列をラップします。それをテストするために、Generic/Text Onlyドライバーを使用して、「印刷」されたものを.txtファイルに保存します。

In Chrome空のファイルを取得します。

Mozillaで次の行を削除すると、mywindow.document.open( 'text/plain'); ZPLを1行に1つずつ文字として取得します。追加すると、日付と時刻のみが取得され、1行に1文字が再び表示されます。

In IE-mywindow.document.open( 'text/plain');の有無にかかわらず):

Page 1 o



    ^XA^PW400^LL37^





          12.4.2016

さまざまな解決策を見つけましたが、php、c#、さらにはJavaを使用する必要があります。タイトルに記載されているように、サーバー側になりたくありません。ご容赦ください。ポイントを読んだ後、クリックしてコメントを削除できる小さな「x」が表示されたので、質問内にコメントを追加しました。 !

12
user2177283

Zebraプリンターに印刷する場合、^XA 以降 ^XZは無視されます。 zplの周囲のhtmlタグは干渉しません。

確認する必要があるのは、RAWテキストをプリンターに印刷することだけです。

Windowsでビルドを使用するGeneric / Text Only Zebraプリンターのドライバー。ゼブラドライバーの代わり。

  • 通常のゼブラドライバー:印刷ジョブをビットマップにレンダリングします
    • 結果:zplコードの遅い印刷画像。
  • テキストのみのドライバー:zplコードをプリンターに直接送信します
    • 結果:プリンターでレンダリングされたzplからの高速印刷ステッカー

jsfiddle または Gist.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();
}

テスト済み

  • インターネットエクスプローラ
  • Firefox

働いていない:


プリンターのプロパティでGeneric/Text Onlyドライバーを選択します。

Zebra printer - Generic / Text Only driver

12
Lakerfield

次のスニペットは、FirefoxおよびIE11で機能しましたが、少し変更されましたプリンタのプロパティに。

this プリンターエミュレーターを使用していました。

Chromeで、Chromeの[印刷]ダイアログから印刷すると、エミュレーターからエラーが発生します。システムダイアログを使用すると、Chromeからの印刷エラーに関するエラーが発生します。 CTRL + SHIFT + P(スキップするショートカットChromeダイアログ)エラーなし、何も起こりません。これらのエラーはすべてエミュレーターに関連している可能性がありますが、テストする実際のプリンターはありません。

Printer's Propertiesで、次のオプションを設定します。

  • 印刷ジョブの開始:${
  • 印刷ジョブの終了:}$

以下のスクリプトでわかるように、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

2
lukbl

ポップアップやユーザープロンプトを開かずに一貫してこれを達成したい場合は、クライアントPCで実行されているアプリケーションが、アプリケーションのjavascriptとクライアントのプリンター間のメディエーターとして機能する必要があります。

これを行う一般的な方法の1つは、ブラウザプラグイン(NPAPI)を使用することです。しかし、多くのブラウザーがNPAPIサポートを完全に削除し始めたため、このアプローチはすぐに時代遅れになります( ChromeFirefox )。

別のアプローチは、Websocket接続をリッスンするクライアントのPCで実行される小さなアプリケーションを開発することです。 Webアプリケーションは、クライアントのWebSocketサーバーへの接続を介してZPLを送信します。これにより、印刷ジョブが生成されます。

3番目のアプローチ-一部のプリンターには、生のZPLを送信できる内部IPアドレスがあります。ユーザーがこのIPアドレスを設定できるようにWebアプリケーションを構築する場合、ZPLをそのアドレスに送信するオプションになります。ただし、ユーザーがこの機能をサポートしていないプリンターを使用している場合、これは機能しません。

2
gmacster

Zebraは、2016年4月にリリースされた(BROWSER PRINT)というアプリケーションを作成しました。ローカルでJavaサービスであり、コンピューターで実行され、擬似REST 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

1
Nathan Smith

ご覧のとおり、ここでの主な問題は、未修正の未加工バイトを直接プリンターポートに送信できる場合にのみ、Zebraコマンドが機能することです。残念ながら、ブラウザではそれができません。

このような直接アクセスを取得するには、いくつかの方法が必要です。

  • 1つの方法は、ブラウザー拡張機能を使用することです。そのため、ハードウェアへのアクセスが制限されなくなります。 NPAPIを介してそれを行うことができますが、Chromeはそれをサポートしておらず、MozillaとIEはすぐにサポートを中止します;; Chromeは Native Messaging API を介してハードウェアへの直接アクセスを許可できます; Mozillaは 類似のソリューション をすぐにサポートするかもしれません。
  • 別のオプションは、Java JNLPアプリケーションを使用してこのようなアクセスを提供することであり、ブラウザから呼び出すことができます。
0
Haroldo_OK