Печать репитеров с термопринтером в java

Я должен печатать квитанции через термопринтер с использованием Java. Я сделал все. Моя программа берет данные из базы данных и преобразует их в одну строку с использованием специальных символов, вкладок и \ n. Затем строка передается другому методу, который преобразует его в графику.

Проблема в том, что когда я нажимаю кнопку печати, выходит белая бумага. Я заметил, что первые 4-5 символов моей строки печатаются на последней строке счета в правом углу в крайнем конце бумаги. Мой принтер – Epson TM – T81.

public void printThisBill() { DefaultTableModel mod = (DefaultTableModel) jTable1.getModel(); DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); DateFormat timeFormat = new SimpleDateFormat("HH:mm"); //get current date time with Date() Date date = new Date(); Date time = new Date(); String Date = dateFormat.format(date); String Time = timeFormat.format(time); String Header = " ****Super Market**** \n" + "Date: "+Date+" Time: "+Time+"\n" + "---------------------------------\n" + "Name Qty Rate Amt\n" + "---------------------------------\n"; String amt = "\n \n \nTotal Amount = "+ amt() +"\n" + "Tax =" + tax() + "\n" + "*********************************\n" + "Thank you. \n"; String bill = Header; int i = 0; do { String name = ""+ mod.getValueAt(i, 2); String qty = ""+ mod.getValueAt(i, 3); String rate = ""+ mod.getValueAt(i, 4); String amount = ""+ mod.getValueAt(i, 6); if(name.length() > 12) { name = name.substring(0, 12)+" "; } else { for(int j= name.length()-12; j<= name.length(); j++); { name = name+" "; } } if(qty.length()<=5) { for(int j= 0; j<= qty.length()-5; j++); { qty = qty+" "; } } rate = rate; String items = name+"\t"+qty+"\t"+rate+"\t"+amount+"\n"; bill = bill+ items; i++; } while(i <= mod.getRowCount()-1); bill = bill+amt; System.out.println(bill); printCard(bill); dispose(); } 

И метод, который печатает счет:

 public static void printCard(final String bill ) { Printable contentToPrint = new Printable(){ @Override public int print(Graphics graphics, PageFormat pageFormat, int page) throws PrinterException { if (page > 0) { return NO_SUCH_PAGE; } pageFormat.setOrientation(PageFormat.LANDSCAPE); Graphics2D g2d = (Graphics2D)graphics.create(); g2d.setPaint(Color.black); g2d.setFont(new Font("Arial", Font.BOLD, 10)); g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableX()); g2d.drawString(bill, 0, 0); return PAGE_EXISTS; } }; PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(contentToPrint); //You can show a print dialog before printing by job by wrapping the following blocks with a conditional statement if(job.printDialog()){...} try { job.print(); } catch (PrinterException e) { System.err.println(e.getMessage()); } } 

В чем проблема и как я могу ее решить? Я думаю, что я не устанавливаю правильные параметры в методе drawString ().

Или что-то еще? Любая помощь мне понравилась бы!

Я нашел это:

Пример термического принтера Java Pos

Это сработало для меня. Нет необходимости в внешних библиотеках.

 import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.util.ArrayList; import java.util.List; import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.SimpleDoc; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; public class PrinterService implements Printable { public List getPrinters(){ DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); PrintService printServices[] = PrintServiceLookup.lookupPrintServices( flavor, pras); List printerList = new ArrayList(); for(PrintService printerService: printServices){ printerList.add( printerService.getName()); } return printerList; } @Override public int print(Graphics g, PageFormat pf, int page) throws PrinterException { if (page > 0) { /* We have only one page, and 'page' is zero-based */ return NO_SUCH_PAGE; } /* * User (0,0) is typically outside the imageable area, so we must * translate by the X and Y values in the PageFormat to avoid clipping */ Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); /* Now we perform our rendering */ g.setFont(new Font("Roman", 0, 8)); g.drawString("Hello world !", 0, 10); return PAGE_EXISTS; } public void printString(String printerName, String text) { // find the printService of name printerName DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); PrintService printService[] = PrintServiceLookup.lookupPrintServices( flavor, pras); PrintService service = findPrintService(printerName, printService); DocPrintJob job = service.createPrintJob(); try { byte[] bytes; // important for umlaut chars bytes = text.getBytes("CP437"); Doc doc = new SimpleDoc(bytes, flavor, null); job.print(doc, null); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void printBytes(String printerName, byte[] bytes) { DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); PrintService printService[] = PrintServiceLookup.lookupPrintServices( flavor, pras); PrintService service = findPrintService(printerName, printService); DocPrintJob job = service.createPrintJob(); try { Doc doc = new SimpleDoc(bytes, flavor, null); job.print(doc, null); } catch (Exception e) { e.printStackTrace(); } } private PrintService findPrintService(String printerName, PrintService[] services) { for (PrintService service : services) { if (service.getName().equalsIgnoreCase(printerName)) { return service; } } return null; } } 

И основной class:

 public class Main { public static void main(String[] args) { PrinterService printerService = new PrinterService(); System.out.println(printerService.getPrinters()); //print some stuff. Change the printer name to your thermal printer name. printerService.printString("EPSON-TM-T20II", "\n\n testing testing 1 2 3eeeee \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); // cut that paper! byte[] cutP = new byte[] { 0x1d, 'V', 1 }; printerService.printBytes("EPSON-TM-T20II", cutP); } } 

hmmm ,,, я думаю, вы должны использовать команды ESC / POS для вашего принтера, прочитайте руководство по техническому обслуживанию принтера для Epson TM – T81 . У меня были аналогичные проблемы с TM-U220D, и я написал для него class. Это может не помочь, поскольку принтеры отличаются друг от друга, так или иначе присоединяем его как ссылку:

 //------------------------ //-- PrinterOptions.java //------------------------ public class PrinterOptions { String commandSet = ""; public String initialize() { final byte[] Init = {27, 64}; commandSet += new String(Init); return new String(Init); } public String chooseFont(int Options) { String s = ""; final byte[] ChooseFontA = {27, 77, 0}; final byte[] ChooseFontB = {27, 77, 1}; final byte[] ChooseFontC = {27, 77, 48}; final byte[] ChooseFontD = {27, 77, 49}; switch(Options) { case 1: s = new String(ChooseFontA); break; case 2: s = new String(ChooseFontB); break; case 3: s = new String(ChooseFontC); break; case 4: s = new String(ChooseFontD); break; default: s = new String(ChooseFontB); } commandSet += s; return new String(s); } public String feedBack(byte lines) { final byte[] Feed = {27,101,lines}; String s = new String(Feed); commandSet += s; return s; } public String feed(byte lines) { final byte[] Feed = {27,100,lines}; String s = new String(Feed); commandSet += s; return s; } public String alignLeft() { final byte[] AlignLeft = {27, 97,48}; String s = new String(AlignLeft); commandSet += s; return s; } public String alignCenter() { final byte[] AlignCenter = {27, 97,49}; String s = new String(AlignCenter); commandSet += s; return s; } public String alignRight() { final byte[] AlignRight = {27, 97,50}; String s = new String(AlignRight); commandSet += s; return s; } public String newLine() { final byte[] LF = {10}; String s = new String(LF); commandSet += s; return s; } public String reverseColorMode(boolean enabled) { final byte[] ReverseModeColorOn = {29, 66, 1}; final byte[] ReverseModeColorOff = {29, 66, 0}; String s = ""; if(enabled) s = new String(ReverseModeColorOn); else s = new String(ReverseModeColorOff); commandSet += s; return s; } public String doubleStrik(boolean enabled) { final byte[] DoubleStrikeModeOn = {27, 71, 1}; final byte[] DoubleStrikeModeOff = {27, 71, 0}; String s=""; if(enabled) s = new String(DoubleStrikeModeOn); else s = new String(DoubleStrikeModeOff); commandSet += s; return s; } public String doubleHeight(boolean enabled) { final byte[] DoubleHeight = {27, 33, 17}; final byte[] UnDoubleHeight={27, 33, 0}; String s = ""; if(enabled) s = new String(DoubleHeight); else s = new String(UnDoubleHeight); commandSet += s; return s; } public String emphasized(boolean enabled) { final byte[] EmphasizedOff={27 ,0}; final byte[] EmphasizedOn={27 ,1}; String s=""; if(enabled) s = new String(EmphasizedOn); else s = new String(EmphasizedOff); commandSet += s; return s; } public String underLine(int Options) { final byte[] UnderLine2Dot = {27, 45, 50}; final byte[] UnderLine1Dot = {27, 45, 49}; final byte[] NoUnderLine = {27, 45, 48}; String s = ""; switch(Options) { case 0: s = new String(NoUnderLine); break; case 1: s = new String(UnderLine1Dot); break; default: s = new String(UnderLine2Dot); } commandSet += s; return new String(s); } public String color(int Options) { final byte[] ColorRed = {27, 114, 49}; final byte[] ColorBlack = {27, 114, 48}; String s = ""; switch(Options) { case 0: s = new String(ColorBlack); break; case 1: s = new String(ColorRed); break; default: s = new String(ColorBlack); } commandSet += s; return s; } public String finit() { final byte[] FeedAndCut = {29, 'V', 66, 0}; String s = new String(FeedAndCut); final byte[] DrawerKick={27,70,0,60,120}; s += new String(DrawerKick); commandSet+=s; return s; } public String addLineSeperator() { String lineSpace = "----------------------------------------"; commandSet += lineSpace; return lineSpace; } public void resetAll() { commandSet = ""; } public void setText(String s) { commandSet+=s; } public String finalCommandSet() { return commandSet; } } 

feedPrinter () – метод

 private static boolean feedPrinter(byte[] b) { try { AttributeSet attrSet = new HashPrintServiceAttributeSet(new PrinterName("EPSON TM-U220 ReceiptE4", null)); //EPSON TM-U220 ReceiptE4 DocPrintJob job = PrintServiceLookup.lookupPrintServices(null, attrSet)[0].createPrintJob(); //PrintServiceLookup.lookupDefaultPrintService().createPrintJob(); DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; Doc doc = new SimpleDoc(b, flavor, null); PrintJobWatcher pjDone = new PrintJobWatcher(job); job.print(doc, null); pjDone.waitForDone(); System.out.println("Done !"); } catch (javax.print.PrintException pex) { System.out.println("Printer Error " + pex.getMessage()); return false; } catch(Exception e) { e.printStackTrace(); return false; } return true; } 

Теперь подготовьте счет 🙂

 PrinterOptions p=new PrinterOptions(); p.resetAll(); p.initialize(); p.feedBack((byte)2); p.color(0); p.alignCenter(); p.setText("The Dum Dum Name"); p.newLine(); p.setText("Restaurant Dining"); p.newLine(); p.addLineSeperator(); p.setText("Bling Bling"); p.newLine(); p.addLineSeperator(); p.newLine(); p.alignLeft(); p.setText("POD No \t: 2001 \tTable \t: E511"); p.newLine(); p.setText("Res Date \t: " + "01/01/1801 22:59"); p.newLine(); p.setText("Session \t: Evening Session"); p.newLine(); p.setText("Staff \t: Bum Dale"); p.newLine(); p.addLineSeperator(); p.newLine(); p.alignCenter(); p.setText(" - Some Items - "); p.newLine(); p.alignLeft(); p.addLineSeperator(); p.newLine(); p.setText("No \tItem\t\tUnit\tQty"); p.newLine(); p.addLineSeperator(); p.setText("1" + "\t" + "Aliens Everywhere" + "\t" + "Rats" + "\t" + "500"); p.setText("1" + "\t" + "Aliens Everywhere" + "\t" + "Rats" + "\t" + "500"); p.setText("1" + "\t" + "Aliens Everywhere" + "\t" + "Rats" + "\t" + "500"); p.setText("1" + "\t" + "Aliens Everywhere" + "\t" + "Rats" + "\t" + "500"); p.setText("1" + "\t" + "Aliens Everywhere" + "\t" + "Rats" + "\t" + "500"); p.setText("1" + "\t" + "Aliens Everywhere" + "\t" + "Rats" + "\t" + "500"); p.addLineSeperator(); p.feed((byte)3); p.finit(); feedPrinter(p.finalCommandSet().getBytes()); 
  • Печать непосредственно из браузера без всплывающего windows печати
  • Хорошие правила для настройки print css?
  • Удалить верхний и нижний колонтитулы из windows .print ()
  • Как использовать HTML для печати верхнего и нижнего колонтитула на каждой печатной странице документа?
  • Печать значка jLabel в принтере с помощью кнопки
  • «Тихая» печать в веб-приложении
  • Как создать метод println / print для пользовательского classа
  • Как отправить документ на принтер и распечатать его?
  • Разрывы страниц в Google Chrome
  • Каков самый простой способ печати массива Java?
  • Как печатать двоичную диаграмму дерева?
  • Давайте будем гением компьютера.