【问题标题】:ESC/P Set Absolute Horizontal Print PositionESC/P 设置绝对水平打印位置
【发布时间】:2020-09-25 01:09:47
【问题描述】:

在 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' 1cm。

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

    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.4cm 直到 19.8cm。

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

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

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

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

更新

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

我又做了一个测试程序,直接输入nh和nl参数。

我意识到只要 nl 值超过 127,这个命令就会被忽略。

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

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

【问题讨论】:

    标签: printing dot-matrix


    【解决方案1】:

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

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

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

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

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

    要解决这个问题,你绝不能尝试使用 String() 类或任何其他字符集编码相关的类来编写控制代码(例如 .toString()、.toByteArray(charset)、Writer)。

    您可以尝试对 PrintStream() 进行 UTF-8 编码,看看它是否修复了错误。

    【讨论】:

      【解决方案2】:

      我发现的问题是 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");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        相关资源
        最近更新 更多