使用热敏打印机在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; } } 

主要课程:

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

嗯,我认为你应该使用你的打印机的ESC / POS命令,阅读Epson TM – T81的打印机技术手册。 我和TM-U220D有类似的问题,我为它写了一个类。 这可能没有帮助,因为打印机是不同的,无论如何我附加它作为参考:

 //------------------------ //-- 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());