6

だから私は私たちのウェブサーバー(これもオフィスにある)からオフィスのネットワーク化されたサーマルプリンターに印刷しているので、クライアントはウェブサイトで注文でき、営業部のデスクに飛び出します。これが私が使用するコードで、非常にうまく機能します。ただし、伝票にアイテムを印刷する場合は、アイテムのテキストを中央に揃え、価格のテキストを正しく揃えたいのですが、それができません(同じ行だと思います)ので、新しい行をどのように言うことができますか(\ n)しかし、それを逆にします。すでに\033Fと\Fを試しましたが、うまくいきませんでした。何かアドバイスはありますか?

$texttoprint = "";
//center,bold,underline - close underline, close bold
$texttoprint .= "\x1b\x61\x01\x1b\x45\x01\x1b\x2d\x02\x1b\x21\x10\x1b\x21\x20 Company name \x1b\x2d\x00\x1b\x45\x00";
$texttoprint .= "\n";
//normal text
$texttoprint .= "\x1b\x21\x00 Address";
$texttoprint .= "\n"; 
//normal text
$texttoprint .= "\x1b\x21\x00 Adress2";
$texttoprint .= "\n";
//normal text
$texttoprint .= "\x1b\x21\x00 Tel : ...";
$texttoprint .= "\n";
$texttoprint .= "\n";
//normal text
$texttoprint .= "\x1b\x21\x00 Website order";
$texttoprint .= "\n";
$texttoprint .= "\n";
//center,bold,underline - close underline, close bold
$texttoprint .= "\x1b\x61\x01\x1b\x45\x01\x1b\x2d\x02\x1b\x21\x10\x1b\x21\x20 Tax Invoice \x1b\x2d\x00\x1b\x45\x00";
$texttoprint .= "\n";
$texttoprint .= "\n";
//align center, normal text
$texttoprint .= "\x1b\x61\x01\x1b\x21\x00 1x product";
//align right, normal text
$texttoprint .= "\x1b\x61\x02\x1b\x21\x00 $200";
...

あなたがここで見ることができるように、最後の2つは同じライン上にあり、私は製品センターと価格を正当化しようとしています。どちらも中央に配置されます。/nを間に入れると、間違った行で正しく正当化されます。

$texttoprint = stripslashes($texttoprint);

$fp = fsockopen("192.168.0.168", 9100, $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "\033\100");
$out = $texttoprint . "\r\n";
fwrite($fp, $out);
fwrite($fp, "\012\012\012\012\012\012\012\012\012\033\151\010\004\001");
fclose($fp);
}
4

1 に答える 1

7

プリンターにすべてのことを任せることもできますが、プリンターの特性に関する知識を出力ルーチンに実装することをお勧めします。1行に何文字印刷できるかを知っておく必要があります。

sprintf()次に、製品情報を左側に配置し、最大フィールドサイズを配置し、価格を右側に配置して、行全体をフォーマットするために使用できます。

$texttoprint .= sprintf('%s %f', $article, $price); // very basic start: A string and a float
$texttoprint .= sprintf('%-30.30s %8.2f', $article, $price); 
// 30 chars for the string, will not exceed this length, and 8 chars for the price, with decimal dot and 2 decimal digits.

stripslashes()最終結果には使用しないでください。スラッシュが存在することに問題がある場合、スラッシュは「魔法の引用符」によって導入され、最後ではなく最初に削除する必要があります。

別の解決策は、プリンタを「Windows」モードに切り替えて、完全な行の印刷にCR/LFが必要になるようにすることです。このように、CRのみを印刷することで、用紙を移動せずに行全体を印刷できます。これにより、プリンターヘッドが再び行の先頭に移動します。その後、LFを印刷するまで、すでに印刷された行の上に再度印刷できます。実際のプリンタヘッドが関係している場合、1行を印刷するためだけに追加のヘッドの動きが発生する可能性があるため、状況が悪化する可能性があることに注意してください。プリンタは通常、次々と1行の頭の動きを最適化することができます。

于 2013-03-19T20:56:10.393 に答える