2015-02-20 2 views
3

У меня есть приложение, которое взаимодействует с термопринтером на Java и делает принтеры для печати принтеров с штрих-кодом/акцентом/разными размерами и так далее, используя Принтер Star tsp 100.Как улучшить скорость работы с принтером чеков и командами ESC/POS в Java

Я могу сделать программу печати exaclty, что мне нравится, но принтер работает очень медленно. Я считаю, что причина в том, что я использую неприемлемый способ/метод отправки байтовых команд.

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);   
} 

Так я использовать этот метод, чтобы напечатать большую часть строки до тех пор, пока текст имеет тот же стиль (Etc никаких дополнительных команд, необходимых). Поэтому мой код, который печатает квитанции, выглядит примерно так.

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. Я чувствую, однако, что должен быть лучший/более быстрый способ сделать это, поскольку многие приложения могут печатать квитанцию ​​с разным размером/штрих-кодом/стилем/логотипом, не принимая 10-20 секунд.

Когда квитанционный принтер приходит к основному объему или «телу» чека, где все имеет одинаковый размер/стиль, тогда он быстро развивается, это заставляет меня поверить, что причина, по которой это идет медленно для меня, заключается в том, что я я создаю/выполняю так много отдельных «заданий печати».

Итак, есть ли более быстрый способ отправки команд ESC/POS на термальный принтер в виде команд байта? В этом случае термопринтер представляет собой Star tsp 100, но я не считаю, что он имеет какое-то значение для ответа.

Любые ответы были бы очень признательны. Прошу прощения, если это был простой вопрос, поскольку я все еще учу код.

+0

Можете ли вы PLS поделиться код для печати, я новичок, благодаря – Smith

+0

у меня нет кода больше, так как я модернизировал код давно: P Но почему вы имея трудное время получения это работать? –

+0

Что вы обновили до? было бы неплохо, если бы вы действительно могли помочь так или иначе – Smith

ответ

4

Я понятия не имею, улучшит ли скорость печати, но в ответ на ваш вопрос о сокращении числа «заданий на печать» вы можете сначала записать все байты в поток, а затем отправить весь поток на одиночное задание на печать. Я попытался преобразовать ваш код, чтобы сделать это.

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); 
    } 
+0

Спасибо, что это сработало, как сон! Я могу видеть по количеству downvotes, что это был не очень оцененный вопрос. Но хорошо, я все еще очень рад, что я спросил его ^^. –

+0

это был очень хороший вопрос – SDReyes

Смежные вопросы