/ n的对面? - ESC / POS和PHP右/左对齐在同一行

时间:2013-03-19 20:10:24

标签: php string printing epson

所以我从我们的网络服务器(也在办公室)打印到办公室的网络热敏打印机,这样客户就可以在网站上下订单,然后在销售部门桌面上弹出。这是我使用的代码,它工作得很好。然而,当涉及到打印单上的项目时,我希望项目文本对齐中心和价格文本对齐,但它不会让我这样做(因为它与我想的相同)所以我怎么能说新行(\ 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";
...

正如你在这里看到的那样,最后两个是在同一条线上,我试图证明产品中心和价格合理。它们都以中心为中心,如果我在它们之间加上一个/ 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);
}

1 个答案:

答案 0 :(得分:4)

您可以让打印机完成所有工作,但我认为最好将一些有关打印机特性的知识应用到输出例程中。你应该知道每行可以打印多少个字符。

然后,您可以使用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。请注意,如果涉及实际的打印机头,这可能会使事情变得更糟,因为它可能会触发额外的磁头移动,仅用于打印一行。打印机通常能够优化一条接一条线的头部运动。