ESC / P设置绝对水平打印位置

时间:2012-12-13 03:11:05

标签: printing dot-matrix

我在Epson LX-300 II点阵式打印机中设置水平打印位置时遇到问题。设置水平打印位置的命令有时不起作用。

我需要这样做才能将可打印数据与预打印纸张表格中的相应列对齐。

给出以下代码:

        // row 1
        escp.setAbsoluteHorizontalPosition(1);
        escp.print("Equipment");
        escp.setAbsoluteHorizontalPosition(10);
        escp.print("Serial");
        escp.setAbsoluteHorizontalPosition(13);
        escp.print("Remarks");

        // row 2
        escp.lineFeed();
        escp.setAbsoluteHorizontalPosition(1);
        escp.print("Equipment");
        escp.setAbsoluteHorizontalPosition(10);
        escp.print("Serial");
        escp.setAbsoluteHorizontalPosition(13);
        escp.print("Remarks");

这是预期的输出:

Equipment                  Serial     Remarks
Equipment                  Serial     Remarks

但是,这是实际打印输出:

EquipmentSerial                        Remarks
EquipmentSerial                        Remarks

我无法弄清楚为什么“Serial”没有打印在正确的位置。

为了解决这个问题,我做了一个测试程序,在一行中打印'x'1厘米。

以下是测试程序的示例代码:

    ESCPrinter escp = new ESCPrinter(sharedPrinterName, false);
    if((escp.initialize()) == false) {
        return;
    }
    escp.select10CPI();
    escp.set8LPI();
    escp.setCharacterSet(ESCPrinter.USA);                
    for(int x = 1; x < 15; x++) {
        escp.setAbsoluteHorizontalPosition(x);
        escp.print("x");
    }
    escp.formFeed();
    escp.close();

预期产出:

x    x    x    x    x    x    x    x    x    x    x    x    x    x

实际输出:

x    x    x    x    xxxxxx                    x    x    x    x

这是Epson ESC/P Reference Manual,和 这是我用来发送打印机命令的third-party code,我稍作修改后实现了set8LPI()方法。

在参考手册中,设置绝对水平打印位置的命令在C-31中。

我已经尝试了几天自己解决这个问题,但我并没有找到解决方案。

其他信息

我制作了另一个测试程序,从0.0cm到19.8cm的位置打印测试数据,增量为0.2cm,并在每个测试数据之间进行换行。

我打印的测试数据也是我指定的绝对水平位置(为了便于识别)。

向您展示确切的打印输出是不切实际的,所以我会尽可能地描述它们。

将水平位置设置为0.0直到5.4似乎有效,输出如下:

0.0
 0.2
  0.3
   0.4
   .
   .
   .
   -------->  5.4

之后,忽略将绝对水平位置设置为5.6cm直到10.8cm。 打印机只打印在纸张的最左侧部分。

“设置绝对水平位置”命令再次工作11.0cm至16.2cm。 再次被忽略16.4厘米,直到19.8厘米。

据我所知,上面已经链接过的ESC / P参考手册,当指定位置超出右边距时,打印机会忽略此命令。没有其他指定。

显然,我的价值都在边缘内。

那么,这可能是打印机的硬件问题吗?

- &GT;不是硬件问题。我使用不同的打印机得到了相同的结果。

更新

给出设置绝对水平位置的命令: ESC $ nl nh

我已经制作了另一个测试程序,我直接输入nh和nl参数。

我已经意识到只要nl值超过127,就会忽略此命令。

我觉得这很令人惊讶,因为参考手册指出nl的最大值是255。

这个发现与第一个测试程序一致,我以厘米为单位输入水平位置。当我将厘米转换为忽略的命令的相应nh和nl值时,生成的nl值大于127。

2 个答案:

答案 0 :(得分:1)

ESC / P设置绝对水平打印位置

从ESCPrinter.java上的给定第三方Java代码,将ESC / P控制代码发送到打印机端口的方法正在等待灾难。对于您的情况,当值大于7位数据(127 / 0x7F)时。

给出设置绝对水平位置的命令:

ESC $ nL nH
nL value: 0 <= nL < 256

当nL值超过127时,该值转换不正确并发送到打印机端口。 不正确的转换是由PrintStream()类引起的,它将根据您的系统区域设置调用默认的charset编码(在内部创建java.io.Writer()类)。这就是为什么值nL永远不会正确发送到打印机端口的原因。

要解决此问题,您必须永远不要尝试使用String()类或任何其他charset编码相关类来编写控制代码(例如.toString(),. toByteArray(charset),Writer)。

你可以为PrintStream()尝试UTF-8编码,看它是否修复了这个bug。

答案 1 :(得分:0)

我发现的问题是UTF-8是多字节编码,而ESC-P需要命令以0-256的单个字节为单位

ISO-8859-1是最多256个的单字节编码。

Java字节是带符号2的补码中的小数,因此127以上的数字为负。

public byte getN1(int total) {

    // a java byte can only be -127 > 127
    // so the negative numbers represent the numbers greater than 127

    int n1 = total % 256;
    if (n1 > 127) {
        n1 = n1 - 256;
    }
    return (byte) n1;
}

public byte getN2(int total) {

    // N2 is a factor of 256. so it is multiplied by 265 and added to N1.
    // generally it is either 1 or 0 but can be more for things like vertical
    // position.

    int n2 = total / 256;
    return (byte) n2;
}



public String setAbsoluteHorizontalPosition(int dots) throws UnsupportedEncodingException {

    byte[] x = { ESC, '$', this.getN1(dots), this.getN2(dots) };
    return new String(x, "ISO-8859-1");
}