How to print lines with line breaks in java

I need to print a string using java, so I love the following solution. I made some changes to print the line without displaying the print dialog. My problem is that although this method prints the line correctly, it does not break the lines as I defined. Please tell me how to print lines with line breaks.

public class PrintBill implements Printable { private static final String mText = "SHOP MA\n" + "----------------------------\n" + "Pannampitiya\n" + "09-10-2012 harsha no: 001\n" + "No Item Qty Price Amount\n" + "1 Bread 1 50.00 50.00\n" + "____________________________\n"; private static final AttributedString mStyledText = new AttributedString(mText); static public void main(String args[]) throws PrinterException { PrinterService ps = new PrinterService(); PrintService pss = ps.getCheckPrintService("Samsung-ML-2850D-2");//get the printer service by printer name PrinterJob printerJob = PrinterJob.getPrinterJob(); printerJob.setPrintService(pss); Book book = new Book(); book.append(new PrintBill(), new PageFormat()); printerJob.setPageable(book); try { printerJob.print(); System.out.println(printerJob.getPrintService().getName()); System.out.println("Print compleated.."); } catch (PrinterException exception) { System.err.println("Printing error: " + exception); exception.printStackTrace(); } @Override public int print(Graphics g, PageFormat format, int pageIndex) { Graphics2D g2d = (Graphics2D) g; g2d.translate(format.getImageableX(), format.getImageableY()); g2d.setPaint(Color.black); Point2D.Float pen = new Point2D.Float(); AttributedCharacterIterator charIterator = mStyledText.getIterator(); LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext()); float wrappingWidth = (float) format.getImageableWidth(); while (measurer.getPosition() < charIterator.getEndIndex()) { TextLayout layout = measurer.nextLayout(wrappingWidth); pen.y += layout.getAscent(); float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout.getAdvance()); layout.draw(g2d, pen.x + dx, pen.y); pen.y += layout.getDescent() + layout.getLeading(); } return Printable.PAGE_EXISTS; } } 

printer service class

 public class PrinterService { public PrintService getCheckPrintService(String printerName) { PrintService ps = null; DocFlavor doc_flavor = DocFlavor.STRING.TEXT_PLAIN; PrintRequestAttributeSet attr_set = new HashPrintRequestAttributeSet(); attr_set.add(new Copies(1)); attr_set.add(Sides.ONE_SIDED); PrintService[] service = PrintServiceLookup.lookupPrintServices(doc_flavor, attr_set); for (int i = 0; i < service.length; i++) { System.out.println(service[i].getName()); if (service[i].getName().equals(printerName)) { ps = service[i]; } } return ps; } } 
+6
source share
7 answers

OK, finally, I found a good solution for my billing task, and it works correctly for me.

This class provides a print service.

 public class PrinterService { public PrintService getCheckPrintService(String printerName) { PrintService ps = null; DocFlavor doc_flavor = DocFlavor.STRING.TEXT_PLAIN; PrintRequestAttributeSet attr_set = new HashPrintRequestAttributeSet(); attr_set.add(new Copies(1)); attr_set.add(Sides.ONE_SIDED); PrintService[] service = PrintServiceLookup.lookupPrintServices(doc_flavor, attr_set); for (int i = 0; i < service.length; i++) { System.out.println(service[i].getName()); if (service[i].getName().equals(printerName)) { ps = service[i]; } } return ps; } } 

This class demonstrates the task of printing an invoice,

 public class HelloWorldPrinter implements Printable { @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex > 0) { /* We have only one page, and 'page' is zero-based */ return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) graphics; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); //the String to print in multiple lines //writing a semicolon (;) at the end of each sentence String mText = "SHOP MA;" + "Pannampitiya;" + "----------------------------;" + "09-10-2012 harsha no: 001 ;" + "No Item Qty Price Amount ;" + "----------------------------;" + "1 Bread 1 50.00 50.00 ;" + "----------------------------;"; //Prepare the rendering //split the String by the semicolon character String[] bill = mText.split(";"); int y = 15; Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 8); graphics.setFont(f); //draw each String in a separate line for (int i = 0; i < bill.length; i++) { graphics.drawString(bill[i], 5, y); y = y + 15; } /* tell the caller that this page is part of the printed document */ return PAGE_EXISTS; } public void pp() throws PrinterException { PrinterService ps = new PrinterService(); //get the printer service by printer name PrintService pss = ps.getCheckPrintService("Deskjet-1000-J110-series-2"); PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintService(pss); job.setPrintable(this); try { job.print(); } catch (PrinterException ex) { ex.printStackTrace(); } } public static void main(String[] args) { HelloWorldPrinter hwp = new HelloWorldPrinter(); try { hwp.pp(); } catch (Exception e) { e.printStackTrace(); } } } 
+4
source

Do this: -

 String newline = System.getProperty("line.separator"); private static final String mText = "SHOP MA" + newline + + "----------------------------" + newline + + "Pannampitiya" + newline + + "09-10-2012 harsha no: 001" + newline + + "No Item Qty Price Amount" + newline + + "1 Bread 1 50.00 50.00" + newline + + "____________________________" + newline; 
+7
source
 private static final String mText = "SHOP MA" + "\n" + + "----------------------------" + "\n" + + "Pannampitiya" + newline + + "09-10-2012 harsha no: 001" + "\n" + + "No Item Qty Price Amount" + "\n" + + "1 Bread 1 50.00 50.00" + "\n" + + "____________________________" + "\n"; 

That should work.

+1
source
 String newline = System.getProperty("line.separator"); System.out.println("First line" + newline); System.out.println("Second line" + newline); System.out.println("Third line"); 
+1
source

You can try using StringBuilder : -

  final StringBuilder sb = new StringBuilder(); sb.append("SHOP MA\n"); sb.append("----------------------------\n"); sb.append("Pannampitiya\n"); sb.append("09-10-2012 harsha no: 001\n"); sb.append("No Item Qty Price Amount\n"); sb.append("1 Bread 1 50.00 50.00\n"); sb.append("____________________________\n"); // To use StringBuilder as String.. Use `toString()` method.. System.out.println(sb.toString()); 
0
source

I think you make it too complicated. AttributedString is used when you want to store attributes - in the print context. But you store data in it. AttributedString

Just save your data in a Document object and pass properties like Font, Bold, Italic, all to an AttributedString.

Hope this will be useful Quick tutorial AND In-depth tutorial

0
source

Use String buffer.

  final StringBuffer mText = new StringBuffer("SHOP MA\n" + "----------------------------\n" + "Pannampitiya\n" + "09-10-2012 harsha no: 001\n" + "No Item Qty Price Amount\n" + "1 Bread 1 50.00 50.00\n" + "____________________________\n"); 
-1
source

Source: https://habr.com/ru/post/927232/


All Articles