java - 如何使用 Java 中的收据打印机和 ESC/POS 命令提高速度

标签 java byte bytearray thermal-printer receipt

我有一个用 Java 与热敏打印机通信的应用程序,并且 使用 Star tsp 100 打印机使热敏打印机打印带有条形码/强调/不同尺寸等的收据。

我可以让程序精确打印我喜欢的内容,但打印机速度很慢。我相信原因是我使用了非首选的方式/方法来发送字节命令。

    public static void Command(byte[] bytes) throws Exception{
    //The bytes array is the argument, consisting of a byte[] array such as
    //byte[] Emphasis = {0x1B, 0x45}; //Which gives the text boldness.
    //And Command(Emphasis); To execute the command with this method.
    DocPrintJob job = PrintServiceLookup.lookupDefaultPrintService().createPrintJob();
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    Doc doc = new SimpleDoc(bytes, flavor, null);
    job.print(doc, null);
    }

当我想打印一个字符串时,我使用这个方法。

    public void PrintString(String s) throws Exception{
    DocPrintJob job = PrintServiceLookup.lookupDefaultPrintService().createPrintJob();
    System.out.println(job + " <- printer");
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    byte[] b = s.getBytes("CP437");
    Doc doc = new SimpleDoc(b, flavor, null);
    job.print(doc, null);          
}

所以我使用这种方法来打印大部分字符串,只要文本具有相同的样式(等等,不需要其他命令)。所以我打印收据的代码看起来有点像这样。

PrintClass P = new PrintClass();
String Greating = "Hello";
P.Command(P.Emphasis);
P.Command(P.DoubleSize);
P.Command(P.Underline);
P.PrintString(Greating);
P.Command(P.CancelEmphasis);
P.Command(P.ResetSize);
P.Command(P.CancelUnderline);
String body = GenerateReceiptBody();
P.PrintString(body);
P.Command(P.Halfsize);
String footer = Constants.getFooter();
P.PrintString(footer);
P.Command(P.Cut);

收据完全按照我想要的方式打印,但这是一个非常缓慢的过程。

在发送 POS/ESC 命令方面,我绝不是专家。然而,我觉得必须有更好/更快的方法来做到这一点,因为许多应用程序可以打印不同尺寸/条形码/样式/ Logo 的收据,而无需花费 10-20 秒。

当收据打印机打印到收据的主要部分或“正文”时,所有内容都具有相同的尺寸/样式,然后它会很快打印,这让我相信这对我来说变慢的原因是因为我正在创建/执行如此多的单独“打印作业”。

那么有没有更快的方法将 ESC/POS 命令作为字节命令发送到热敏打印机?在这种情况下,热敏打印机是 Star tsp 100,但我认为这对答案没有任何影响。

任何答案将不胜感激。如果这是一个简单的问题,我很抱歉,因为我仍在学习如何编码。

最佳答案

我不知道这是否会提高您的打印速度,但是为了回答您关于减少“打印作业”数量的问题,您可以先将所有字节写入一个流,然后将整个流发送到一个打印作业。我已尝试转换您的代码来执行此操作。

    public static void test() throws Exception
    {
        ByteArrayOutputStream printData = new ByteArrayOutputStream();

        printData.write(PrintClass.Emphasis);
        printData.write(PrintClass.DoubleSize);
        printData.write(PrintClass.Underline);
        printData.write("Hello".getBytes("CP437"));
        printData.write(PrintClass.CancelEmphasis);
        printData.write(PrintClass.ResetSize);
        printData.write(PrintClass.CancelUnderline);
        printData.write(GenerateReceiptBody().getBytes("CP437"));
        printData.write(PrintClass.Halfsize);
        printData.write(Constants.getFooter().getBytes("CP437"));
        printData.write(PrintClass.Cut);

        printBytes(printData.toByteArray());
    }

    public static void printBytes(final byte[] bytes) throws Exception
    {
        DocPrintJob job = PrintServiceLookup.lookupDefaultPrintService().createPrintJob();
        System.out.println(job + " <- printer");
        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
        Doc doc = new SimpleDoc(bytes, flavor, null);
        job.print(doc, null);
    }

关于java - 如何使用 Java 中的收据打印机和 ESC/POS 命令提高速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626414/

相关文章:

java - 如何使用 JNA 传递结构数组

Java Iterable 对象无法正确迭代

java - H2事务为什么总是自动提交?

java - 过滤 Kafka 流

arrays - 通过 http 发送字节数组时在另外两个字节之间插入的字节

c - 如何将一个字节写入特定内存地址的寄存器?

python 字节 b'....\x000 9' and b' ...\xa1q,)6\x01'

php - 如何以二进制安全的方式从多字节 PHP 字符串变量中获取单个字节?

c# - C#-将* .wav文件加载到字节数组时伪造数据

C# 将 uint[] 转换为 byte[]