仮に未加工の ZPL / EPL コマンドをプリンター デバイスに送信することもできますが、ZPL / EPL をまだ知らず、環境で既にイメージを生成できる場合は、送信しない方がよいでしょう。
あなたのコードは、あなたが Unix ライクなシステムを使用していることを暗示しています。最近のUnix ライクなシステムを使用している場合、印刷はCUPSで制御する必要があります。Zebra は、サポートされていないがほとんど機能する CUPS サポート ファイルを公開しています。
CUPS でプリンターをセットアップしてから、プリンター名に設定され/usr/bin/lp
た-d
フラグ、プリンター-o ppi=...
の DPI を設定する値、および位置合わせまたは縦向き/横向きモードを強制するその他のものを使用してシェルアウトします。その GK420s は 203 DPI のプリンターなので、 -o ppi=203
最低限必要です。
その後、画像や PDF ドキュメントなど、CUPS が認識できるプリンターで何でも印刷できます。これにより、プリンターが理解できるコマンド言語に制限されることなく、PHP 側で必要なものを合成できます。たとえば、wkhtmltoimageを使用して配送ラベルを作成し、GD と PEAR の先史時代のImage_Barcodeを使用して小さなバーコード ラベルを作成します。ところで、それにはより良いオプションがあります。
または、CUPS で「Generic Raw」仮想プリンターをセットアップすることもできます。その後、コマンド言語のテキスト ファイルをそのプリンターから直接印刷できます。おそらく、EPL または ZPL に慣れていて慣れている場合にのみ、この方法を使用する必要があります。
次のコードは、Zebra を含むすべてのプリンターで印刷するために使用する、実際のライブ コードの一部を抜粋したものです。最初の引数として、印刷したいデータ (画像やテキストなどの内容など) を指定して以下の関数を呼び出すだけです。
function print_example($data) {
// You'll need to change these according to your local names and options.
$server = 'printserver.companyname.com';
$printer_name = 'Zebra_ZP_500_KB'; // That's effectively the same thing as your GK420d
$options_flag = '-o position=bottom-left,ppi=203,landscape';
$process_name = 'LC_ALL=en_US.UTF-8 /usr/bin/lp -h %s -d %s %s';
$command = sprintf($process_name, $server, $printer_name, (string)$options_flag);
$pipes = array();
$process = proc_open($command, $handles, $pipes);
// Couldn't open the pipe -- shouldn't happen
if (!is_resource($process))
trigger_error('Printing failed, proc_open() did not return a valid resource handle', E_USER_FATAL);
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// As we've been given data to write directly, let's kinda like do that.
fwrite($pipes[0], $data);
fclose($pipes[0]);
// 1 => readable handle connected to child stdout
$stdout = fgets($pipes[1]);
fclose($pipes[1]);
// 2 => readable handle connected to child stderr
$stderr = fgets($pipes[2]);
fclose($pipes[2]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
// We've asked lp not to be quiet about submitting jobs so we can make
// sure that the print job was submitted.
$request_match = array();
if (!preg_match('/request id is\b(.+)/', $stdout, $request_match)) {
add_warning("Print to '$printer' failed. Please check the printer status.");
return false;
}
add_notice("Print to '$printer' succeeded. Job $request_match[1].");
return true;
}
関数add_warning
とadd_notice
はコードに実装されているため、実際に印刷するものに合わせて適切に置き換える必要があります。