zplCloud Blog
あらゆるラベルプリンターで ZPL を印刷: TSC、Honeywell、SATO、Brother、Toshiba ほか
ラベルは ZPL でも、プリンターがすべて Zebra とは限りません。TSPL、DPL、SBPL、EPL2、CPCL、ESC/POS、Brother ラスター、PCL、Easy Plug、TPCL、JScript を使うプリンターで、まったく同じラベルを印刷する方法を紹介します。出力は PNG、PDF、またはポート 9100 向けの RAW ジョブです。
1 つのラベル、11 のプリンター言語
ZPL は最も広く使われているラベル言語であり、もともと Zebra プリンター向けに作られました。倉庫のプリンターがすべて Zebra なら、それで問題ありません。ところが現実には、TSC のプリンターが安い見積もりで導入され、隣国の工場では SATO が稼働し、梱包場ではどの机にも Brother QL が置かれ、ラベル自動貼付ラインには Avery Dennison や Novexx の印字ヘッドが並び、返品ラベルはオフィスのレーザープリンターで印刷されています。一方でラベルそのものは 1 つしかありません。ERP、ネットショップ、または zplCloud デザイナーが生成した ZPL です。
このガイドでは、その 1 つの ZPL ラベルをこれらすべてのプリンターにドット単位でまったく同じに印刷する方法と、その際の注意点を説明します。
ZPL に対応していないプリンターで ZPL を印刷する 3 つの方法
1. エミュレーション。 多くのメーカーが ZPL エミュレーションを提供しています。Honeywell ZSim、SATO SZPL、Godex GZPL、Citizen Cross-Emulation、TSC や cab の ZPL モードなどです。シンプルなラベルならこれで動きます。それ以外のラベルでは、エミュレーションは他社による ZPL の再実装にすぎません。フォントメトリクス、バーコードの幅、^FB フィールド内のテキストの折り返し、^GFA グラフィック、保存済みフォントの挙動がわずかに異なり、結局すべてのテンプレートをすべての機種でテストすることになります。
2. コマンドの変換。 コンバーターが ^FO…^A0…^FD を別の言語のテキストコマンドとバーコードコマンドに書き換えます。これが機能するのは対応するコマンドが存在する場合だけで、しかもプリンターは自分のフォントと自分のバーコード生成機能を使います。結果は似ていても、同一ではありません。
3. 画像を送る。 ラベルを対象プリンターの解像度で一度だけ描画し、そのプリンター独自のグラフィックコマンドでモノクロのビットマップとして送ります。こうしたコマンドはどのプリンター言語にもあります。プリンターはもう何も解釈せず、ドットを印刷するだけです。フォント、Unicode、ロゴ、バーコードはプレビューとまったく同じに仕上がります。
zplCloud はこの 3 つ目の方法を 2 つの方式で提供しています。ドライバーのあるすべての機器には画像ファイルとして、ネットワーク上のすべての機器にはプリンターの言語による RAW ジョブとして出力します。
方式 1: PNG、JPG、PDF
オフィスのプリンター、メールの添付ファイル、アーカイブ向けには、ラベルを単純にファイルにします。
- ZPL から PDF へ: 1 ラベルを 1 ページとして描画するか、ラベルを元のサイズのまま、カットライン付きで A4 またはレターサイズの用紙に配置します。オフィスのレーザープリンターで返品ラベルを印刷する最も手早い方法です。
- ZPL から PNG へ と ZPL から JPG へ: 単一のラベルを 203、300、600 dpi で描画します。たとえば、ドライバー経由で印刷するネットショップのシステム向けです。
どの機器でファイルを印刷しても、印刷されるのは同じ画像です。この方式の限界は、間に入るドライバーです。拡大縮小し、余白を追加し、コンピューターを必要とします。
方式 2: プリンター独自の言語によるビットマップ
ネットワーク上のラベルプリンターにはドライバーは不要です。プリンター用ツールと対応する API エンドポイントは、TCP ポート 9100 に直接送れる完成したジョブを作成します。
1. 描画。 zplCloud エンジンが各 ^XA…^XZ ラベルを対象の印字ヘッドの解像度で描画します。サーマルヘッドの印刷と同じく、アンチエイリアスは使いません。1 ドットの線は、正確に 1 ドット幅のままです。
2. 1 ビット化。 すべてのドットが黒か白になります。
3. 格納。 ビットマップを、ジョブの印刷に必要な最小限のコマンドとともに、対象言語のグラフィックコマンドに格納します。
4. 送信。 ファイルをそのままプリンターのポート 9100 に送ります。
| プリンター | 言語 | ツール | 画像コマンド | 圧縮 |
|---|---|---|---|---|
| TSC、Printronix T シリーズ | TSPL | ZPL から TSPL へ | BITMAP | PCX (DOWNLOAD + PUTPCX) |
| Honeywell、Datamax-O'Neil | DPL | ZPL から DPL へ | <STX>I + 画像フィールド | 常に PCX |
| SATO | SBPL | ZPL から SBPL へ | ESC GB / ESC GH | PCX (ESC GP) |
| Zebra の EPL プリンター | EPL2 | ZPL から EPL2 へ | GW | - |
| Zebra と Honeywell のモバイルプリンター | CPCL | ZPL から CPCL へ | CG / EG バンド | PCX (PCX) |
| Epson TM、Star、Bixolon | ESC/POS | ZPL から ESC/POS へ | GS v 0 | - |
| Brother QL、TD-4、P-touch | Brother ラスター | ZPL から Brother ラスターへ | ラスター行 | TIFF PackBits |
| HP LaserJet と PCL 対応レーザープリンター | PCL 5 | ZPL から PCL へ | ESC*b#W | TIFF PackBits |
| Avery Dennison、Novexx | Easy Plug | ZPL から Easy Plug へ | #YIB | RLE (#YIR) |
| Toshiba Tec | TPCL | ZPL から TPCL へ | {SG;…} | TOPIX |
| cab | JScript | ZPL から JScript へ | 画像のアップロード + I フィールド | PCX |
各ジョブはメーカーのプログラミングマニュアルに準拠しています。すべての言語について、完成したジョブをビットマップにデコードし直し、描画したラベルとドット単位で一致することをテストしています。Toshiba の TOPIX と Novexx の RLE のドキュメントに掲載されている計算例も、このテストに含まれます。
画像にはどれくらいのデータが必要か
画像は ZPL より大きくなります。テキスト、DataMatrix、QR コード、GS1-128 バーコード、日本語・ロシア語・アラビア語のテキスト 1 行を含む、100 × 150 mm、203 dpi (812 × 1,218 ドット) の典型的な出荷ラベルで測った、ありのままの数値です。
| ジョブ | 非圧縮 | 圧縮 |
|---|---|---|
| ZPL ソース (比較用) | 859 バイト | - |
| TSPL | 121 KB | 52 KB (PCX) |
| EPL2 | 121 KB | - |
| SBPL | 122 KB | 52 KB (PCX) |
| DPL | - | 52 KB (PCX) |
| CPCL | 81 KB (空白行を省略) | 52 KB (PCX) |
| JScript | 124 KB (BMP) | 52 KB (PCX) |
| Brother ラスター、TD-4420DN | 128 KB | 45 KB (TIFF) |
| PCL (300 dpi) | 64 KB (空白行を省略) | 44 KB (TIFF) |
| Easy Plug | 121 KB | 16 KB (RLE) |
| TPCL | 121 KB | 9.5 KB (TOPIX) |
注目すべき点は 3 つあります。
- 非圧縮ではおよそ 1 ドットあたり 1 ビット。 812 × 1,218 ドットは、言語にかかわらず 121 KB になります。
- 隣接する行を参照する圧縮が有利。 PCX と PackBits は 1 行の中でしか圧縮しません。Toshiba の TOPIX は前の行から変化したバイトだけを送り、Easy Plug の RLE は同一の行を繰り返し指定します。ラベルにはその両方が多く含まれます。
- 有線ネットワークではほとんど影響しない。 121 KB の転送は、100 Mbit の Ethernet で約 10 ms です。圧縮が効果を発揮するのは、Wi-Fi や Bluetooth、数千枚単位のバッチ、受信バッファーの小さいプリンターです。
Web サイトのツールは各ジョブのサイズを表示し、圧縮を有効にした場合はその削減量も表示します。
手順
Web サイトの場合 (アカウント不要):
1. お使いのプリンター用のツールを開きます。たとえば ZPL から TSPL へ です。
2. ZPL を貼り付けるか、.zpl ファイルを開きます。
3. プリンターの解像度を選びます (203、300、600 dpi。Brother の場合は機種)。
4. 必要に応じて圧縮を有効にし、変換します。
5. プレビューを確認します。プレビューには送信されるドットがそのまま表示されます。確認できたらジョブをダウンロードします。
6. プリンターに送信します。
# Linux / macOS
nc -q 1 192.168.1.50 9100 < label.tspl
# Windows PowerShell
$c = [Net.Sockets.TcpClient]::new('192.168.1.50', 9100)
$b = [IO.File]::ReadAllBytes("$PWD\label.tspl")
$c.GetStream().Write($b, 0, $b.Length); $c.Close()
API 経由の場合 (独自のソフトウェアから): 各ツールは api.zplcloud.com 上のエンドポイント POST /v1/tools/zpl-to-<language> として利用できます。レスポンスは RAW ジョブそのものです。
jq -Rs '{zpl: ., dpi: 203, compress: true}' label.zpl \
| curl -X POST https://api.zplcloud.com/v1/tools/zpl-to-tpcl \
-H "X-API-Key: $ZPLCLOUD_API_KEY" -H "Content-Type: application/json" \
--data-binary @- -o label.tpcl
nc -q 1 192.168.1.60 9100 < label.tpcl
複数のラベルを含むファイルは、複数のラベルを持つ 1 つのジョブになります。ラベルの枚数はヘッダー X-ZplCloud-Label-Count で確認できます。すべてのフィールドと言語ごとの正確なコマンドは API リファレンスに記載しています。
毎日の印刷: zplCloud CLI、監視フォルダー、リモートプリンター
nc はテストには十分です。日々の印刷では、無料の zplCloud CLI が、こうしたジョブで重要になるただ 1 つの点を引き受けます。ジョブにはバイナリの画像データが含まれているため、プリンターには1 バイトも変えずに届ける必要があります。テキストとしてのエンコードも、末尾への改行の追加も許されません。CLI はこれを、ネットワーク経由でも、USB 経由でも、監視フォルダーからでも、さらにエージェントを通じて別のネットワークにあるプリンターに対しても行います。
完成したジョブを送信する - アカウント不要:
zplcloud send --target 192.168.1.50 --file label.tspl
zplcloud send --usb --file label.bin # USB 接続の Brother QL
CLI はツールが使うファイル名 (.tspl、.epl、.dpl、.sbpl、.cpcl、.escpos、.bin、.pcl、.ezp、.tpcl、.jscript) を認識し、変更せずにそのまま送信します。--raw を指定すれば、それ以外のファイルも同じように送信できます。
変換と送信を 1 ステップで - API の呼び出しは CLI が代わりに行います:
zplcloud send --target 192.168.1.50 --file label.zpl --language tspl --dpi 300 --compress
監視フォルダー: ERP はこれまでどおり ZPL を書き出す。 エージェント (zplcloud proxy) がフォルダーを監視し、ZPL ファイルを 1 つずつ、印刷前にプリンターの言語に変換します。ラベルを生成するソフトウェアには一切変更が要りません。これまでどおり ZPL ファイルを書き出し、TSC プリンターは TSPL を受け取ります:
{
"name": "tsc-shipping",
"enabled": true,
"folder": "/labels/tsc",
"pattern": "*.zpl",
"targetHost": "192.168.1.50",
"convert": { "language": "tspl", "dpi": 300, "compress": true }
}
リモートプリンター: クラウドから別のネットワークにあるプリンターへ。 エージェントは zplCloud への送信方向の接続を 1 本維持するため、別の倉庫や店舗、顧客先にあるプリンターにも、ポートを開放せずに届きます。お使いのソフトウェアが呼び出すのは 1 つのエンドポイントだけです - 完成したジョブを渡すことも、ZPL と言語を渡すこともできます:
curl -X POST https://api.zplcloud.com/v1/remote-printers/4/raw \
-H "X-API-Key: $ZPLCLOUD_API_KEY" -H "Content-Type: application/json" \
-d '{"zpl": "^XA^FO50,50^A0N,40,40^FDHello TSC^FS^XZ", "language": "tspl", "dpi": 203}'
エージェントはジョブを TCP 9100 または USB でプリンターに渡し、届いたかどうかを報告します。
| ジョブの送り先 | コマンドまたはエンドポイント |
|---|---|
| ローカルネットワーク上のプリンター | zplcloud send --target <ip> --file label.tspl |
| USB プリンター | zplcloud send --usb --file label.bin |
| ERP、ネットショップ、配送業者のソフトウェアから出力される ZPL ファイル | "convert": { "language": "tspl" } を指定した監視フォルダー |
| 別のネットワークにあるプリンター | POST /v1/remote-printers/{id}/raw または zplcloud send --remote-printer <id> |
| API 経由の監視フォルダー | language または base64 を指定した POST /v1/print/folder |
CLI とエージェントはバージョン 1.2.26 以降が必要です。それより古いバージョンはすべてのファイルをテキストとして読み込むため、画像データが壊れてしまいます。TCP 接続のプリンターは、バージョン 1.2.22 以降のエージェントですでに利用できます。
注意点
- 解像度を合わせる。 203 dpi 用に描画したラベルを 300 dpi のプリンターで印刷すると、約 3 分の 1 小さくなります。ツールは実在する印字ヘッドの解像度だけを選択肢にしているため、サイズは 1:1 に保たれます。お使いのプリンターの解像度を選んでください。
- メディア設定はプリンター側のまま。 ジョブは、プリンターに保存されたギャップ、センサー、ブラックマークの設定を意図的に上書きしません。他のジョブと同じように、プリンターを一度ラベルサイズに合わせて設定してください。
- バーコードは元のラベルと同じように読み取れる。 ビットマップのバーコードは、ZPL が生成したときとまったく同じ幅になります。バーは最初から整数個のドットで構成されているためです。ただし、これは正しい解像度の場合に限ります。プリンターの dpi を選ぶべきもう 1 つの理由です。
- 機種ごとにテストラベルを 1 枚印刷する。 ファームウェアのバージョンによって細部が異なります。PCX 画像の読み取り方、Easy Plug プリンターでの画像の原点、Toshiba のリボン設定などです。ツールは各ジョブの横にこうした注意事項を表示します。
- Brother は機種の指定が必要。 ヘッド幅、余白、メディアは Brother のコマンドリファレンスに基づいています。ラベルは、収まる中で最も幅の狭いメディアの中央に配置されます。P-touch のテーププリンターは、テープを横切る向きに印刷します。
- プリンターが ZPL にネイティブ対応しているなら ZPL を送る。 そのほうがデータが小さく、プリンターは自身のフォントを使えます。ビットマップ方式は、ZPL に対応していないプリンター、あるいは「ほぼ同じ」では不十分なラベルのためのものです。
エミュレーションで十分なのはどんなときか
ラベルが数行のラテン文字のテキストと Code 128 だけで構成され、プリンターに ZPL エミュレーションがあるなら、まずそれを試してください。Unicode テキスト、TrueType フォント、ロゴ、^FB テキストブロック、あるいは機種の混在したフリートが関わってくると、ビットマップのほうが確実です。1 回の描画で、どのプリンターでも同じ結果が得られます。
よくある質問
プリンターに特別なファームウェアは必要ですか?
いいえ。ジョブは各言語の標準的なグラフィックコマンドだけを使用しており、そのファミリーのプリンターならどれでも解釈できます。
バーコードは問題なく読み取れますか?
はい。バーコードは zplCloud エンジンが正確なドット幅で描画し、ドット単位でそのまま印刷されます。念のため確認したい場合は、バーコードチェックで検証してください。
プリンター上でもテキストはテキストのままですか?
いいえ。プリンターが受け取るのは画像です。それこそが狙いで、プリンター側のフォントがレイアウトを変えることはありません。ただしその反面、プリンターがカウンターやフィールドを自分で埋めることもできません。代わりにデータレコードごとに 1 枚のラベルを描画してください。多数のラベルを含むファイルなら、API が 1 回の呼び出しで処理します。
当社のソフトウェアは ZPL ファイルしか書き出せません。それでも TSC や Brother のプリンターで印刷できますか?
はい。出力先を zplCloud エージェントの監視フォルダーにして、"convert": { "language": "tspl" } (または brother、dpl …) を設定してください。エージェントが印刷前にすべてのファイルを変換するため、ソフトウェアはプリンターが Zebra ではないことに気づきません。
180 dpi のプリンターはどうですか?
該当する機種がある場合はサポートしています。Epson TM-T88 シリーズ向けの 180 dpi の ESC/POS と、180 dpi および 360 dpi の Brother P-touch 各機種です。
無料ですか?
Web サイトのツールは無料で、アカウントも不要です。ただし匿名での利用にはフェアユースの制限があります。API 経由では、ラベル 1 枚が 1 レンダリングとしてカウントされます。詳しくは料金をご覧ください。
ご自身のラベルで試してみてください。 ツールでお使いのプリンターを選び、ZPL を貼り付けて、結果をポート 9100 に送信します。機種の混在したフリートを管理しているなら、zplCloud プラットフォームでデザインを一元管理できます。そしてプリンター用ツールが、どのプリンターにも同じラベルを届けます。