2012-10-09 150 views
6

我需要使用java打印字符串,所以我喜欢以下解决方案Google搜索之后很多。我已经做了一些更改来打印字符串而不显示打印对话框。我的问题是,虽然这种方法打印正确的字符串,它不会像我已定义的那样破坏线条。请告诉我如何用换行符打印字符串。如何在java中使用换行符打印字符串

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

打印机服务提供类

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; 
    } 
} 
+1

您是否试过'\ r \ n'而不是'\ n'? – Keppil

+0

尝试使用'StringBuilder'并使用'append'方法。 –

+0

@ Keppil - 它不工作。 – Harsha

回答

4

OK,终于让我找到我的票据打印任务一个很好的解决方案,它为我工作正常。

这个类提供打印服务

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

此类证明票据打印任务,

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

做到这一点的方法: -

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; 
+1

这也是行不通的。 – Harsha

+0

这适用于联机打印,但不适用于发送到打印机。 – KimvdLinde

-1

使用字符串缓冲区。

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

“AttributedString mStyledText”需要一个字符串 – Harsha

+0

这是行不通的 – Harsha

0

您可以尝试使用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

这不是工作 – Harsha

+0

@哈沙.. :(... –

+0

@哈沙你面临什么问题? –

0

我认为你是使它过于复杂。当您想要存储属性时使用AttributedString - 在打印上下文中。但是你在里面存储数据。 AttributedString

简单地说,将数据存储到Document对象中,然后在AttributedString中传递Font,Bold,Italic等属性。

希望这将有助于 A quick tutorialIn depth tutorial

1
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"; 

这应该工作。

1
String newline = System.getProperty("line.separator"); 
System.out.println("First line" + newline); 
System.out.println("Second line" + newline); 
System.out.println("Third line"); 
相关问题