如何提高 Java 中收据打印机和 ESC/POS 命令的速度
How to improve speed with Receipt printer and ESC/POS commands in Java
我有一个与 Java 中的热敏打印机通信的应用程序,并且
使用 Star tsp 100 打印机使热敏打印机打印 barcode/emphasis/different 尺寸等的收据。
我可以让程序精确打印我喜欢的内容,但打印机速度很慢。我相信原因是我使用的是发送字节命令的非首选 way/method。
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 命令方面,我绝不是专家。但是,我觉得必须有一种 better/faster 方法来执行此操作,因为许多应用程序可以打印具有不同 size/barcode/style/logo 的收据,而无需花费 10-20 秒。
当收据打印机打印到收据的主要部分或 "body" 时,所有内容都相同 size/styling 然后它就很快了,这让我相信这是进展缓慢的原因对我来说是因为我正在 creating/executing 这么多个人 "print jobs".
那么有没有更快的方法将 ESC/POS 命令作为字节命令发送到热敏打印机?在这种情况下,热敏打印机是 Star tsp 100,但我认为这对答案没有任何影响。
任何答案将不胜感激。如果这是一个简单的问题,我很抱歉,因为我仍在学习如何编码。
我不知道这是否会提高您的打印速度,但是为了回答您关于减少 "print jobs" 数量的问题,您可以先将所有字节写入流,然后发送整个流到单个打印作业。我已尝试转换您的代码来执行此操作。
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 中的热敏打印机通信的应用程序,并且 使用 Star tsp 100 打印机使热敏打印机打印 barcode/emphasis/different 尺寸等的收据。
我可以让程序精确打印我喜欢的内容,但打印机速度很慢。我相信原因是我使用的是发送字节命令的非首选 way/method。
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 命令方面,我绝不是专家。但是,我觉得必须有一种 better/faster 方法来执行此操作,因为许多应用程序可以打印具有不同 size/barcode/style/logo 的收据,而无需花费 10-20 秒。
当收据打印机打印到收据的主要部分或 "body" 时,所有内容都相同 size/styling 然后它就很快了,这让我相信这是进展缓慢的原因对我来说是因为我正在 creating/executing 这么多个人 "print jobs".
那么有没有更快的方法将 ESC/POS 命令作为字节命令发送到热敏打印机?在这种情况下,热敏打印机是 Star tsp 100,但我认为这对答案没有任何影响。
任何答案将不胜感激。如果这是一个简单的问题,我很抱歉,因为我仍在学习如何编码。
我不知道这是否会提高您的打印速度,但是为了回答您关于减少 "print jobs" 数量的问题,您可以先将所有字节写入流,然后发送整个流到单个打印作业。我已尝试转换您的代码来执行此操作。
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);
}