2012-08-03 125 views
10

我无法打印到标签打印机。下面的代码打印4个“标签”(附图标签)。在Java中打印到标签打印机

下面的代码打印到兄弟QL-500标签打印机。它打印到3.5英寸×1.1英寸的标签上。

如果有人能够帮助我更好地理解代码,这也会很棒。

import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.print.PageFormat; 
import java.awt.print.Paper; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import java.text.DateFormat; 
import java.util.Date; 
import java.util.Locale; 
import javax.print.PrintService; 



public class DYMOLabelPrintConnector implements Printable { 

public static final String PRINTERNAME = "DYMO LabelWriter 400"; 


public static final boolean PRINTMENU = false; 

public static void main(String[] args) { 
PrinterJob printerJob = PrinterJob.getPrinterJob(); 
PageFormat pageFormat = printerJob.defaultPage(); 
Paper paper = new Paper(); 

final double widthPaper = (1.2 * 72); 
final double heightPaper = (1.5 * 72); 

paper.setSize(widthPaper, heightPaper); 
paper.setImageableArea(0, 0, widthPaper, heightPaper); 

pageFormat.setPaper(paper); 

pageFormat.setOrientation(PageFormat.LANDSCAPE); 

if (PRINTMENU) { 
    if (printerJob.printDialog()) { 
    printerJob.setPrintable(new DYMOLabelPrintConnector(), pageFormat); 

    try { 
     printerJob.print(); 
    } catch (PrinterException e) { 
     e.printStackTrace(); 
    } 
    } 
} else { 
    PrintService[] printService = PrinterJob.lookupPrintServices(); 

    for (int i = 0; i < printService.length; i++) { 
    System.out.println(printService[i].getName()); 

    if (printService[i].getName().compareTo(PRINTERNAME) == 0) { 
     try { 
     printerJob.setPrintService(printService[i]); 
     printerJob.setPrintable(new DYMOLabelPrintConnector(), pageFormat); 
     printerJob.print(); 
     } catch (PrinterException e) { 
     e.printStackTrace(); 
     } 
    } 
    } 
} 

System.exit(0); 
} 

    public String getValue(final int elementOnLabel, final int labelCounter) { 
    String value = ""; 

switch (elementOnLabel) { 
case 0: 
    // what ever you want to have in this line 
    value = "SetupX"; 

    break; 

case 1: 
    // what ever you want to have in this line 
    value = "fiehnlab.ucd"; 

    break; 

case 2: 
    // what ever you want to have in this line 
    value = "id: " + labelCounter; 

    break; 

case 3: 
    // what ever you want to have in this line 
    // TODO - add DB connection 
    value = "label:" + elementOnLabel; 

    break; 

case 4: 
    // what ever you want to have in this line 
    value = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).format(new Date()); 

    break; 

default: 
    break; 
} 

return value; 
} 


public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) 
throws PrinterException { 
System.out.println("printing page: " + pageIndex); 

    if (pageIndex < getPageNumbers()) { 
    Graphics2D g = (Graphics2D) graphics; 

    // g.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
    g.translate(20, 10); 

    String value = ""; 
    pageIndex = pageIndex + 1; 

    // specific for four circular labels per page 
    for (int x = 0; x < 80; x = x + 50) { 
    for (int y = 0; y < 80; y = y + 36) { 
     int posOnPage = 4; // BottomRight, TopRight, BottomLeft, TopLeft 

     if (x > 0) { 
     posOnPage = posOnPage - 2; 
     } 

     if (y > 0) { 
     posOnPage = posOnPage - 1; 
     } 

     // current counter for the label. 
     int id = (posOnPage - 1) + ((pageIndex - 1) * 4); 

     // setupx 
     g.setFont(new Font(g.getFont().getFontName(), g.getFont().getStyle(), 3)); 
     value = this.getValue(0, id); 
     g.drawString("  " + value, x, y); 

     // fiehnlab 
     g.setFont(new Font(g.getFont().getFontName(), g.getFont().getStyle(), 3)); 
     value = this.getValue(1, id); 
     g.drawString(" " + value, x, y + 4); 

     // ID 
     g.setFont(new Font(g.getFont().getFontName(), Font.BOLD, 7)); 
     value = this.getValue(2, id); 
     g.drawString("" + value, x, y + 10); 

     // label 
     g.setFont(new Font(g.getFont().getFontName(), g.getFont().getStyle(), 5)); 
     value = this.getValue(3, id); 
     g.drawString(" " + value, x, y + 16); 

     // date 
     g.setFont(new Font(g.getFont().getFontName(), Font.PLAIN, 3)); 
     value = this.getValue(4, id); 
     g.drawString("  " + value, x, y + 20); 
    } 
    } 

    return PAGE_EXISTS; 
} else { 
    return NO_SUCH_PAGE; 
} 
} 

public int getPageNumbers() { 
return 5; 
} 
} 

enter code here 

这里是它打印什么:

+1

的“例子”目录和问题? – MadProgrammer 2012-08-03 22:26:28

+0

我无法防止它在标签上打印4个同样的东西,如图所示 – 2012-08-03 23:08:59

+0

你“可能”很幸运,我恰好有一个DYMO LabelWriter 400,我会有一个游戏,看看我是什么可以发现 – MadProgrammer 2012-08-04 00:13:10

回答

16

哇,我不能告诉你我有多么爱在Java中打印,当它的工作原理,这是伟大的......

public class PrinterTest { 

    public static void main(String[] args) { 

     PrinterJob pj = PrinterJob.getPrinterJob(); 
     if (pj.printDialog()) { 
      PageFormat pf = pj.defaultPage(); 
      Paper paper = pf.getPaper();  
      double width = fromCMToPPI(3.5); 
      double height = fromCMToPPI(8.8);  
      paper.setSize(width, height); 
      paper.setImageableArea(
          fromCMToPPI(0.25), 
          fromCMToPPI(0.5), 
          width - fromCMToPPI(0.35), 
          height - fromCMToPPI(1));     
      System.out.println("Before- " + dump(paper));  
      pf.setOrientation(PageFormat.PORTRAIT); 
      pf.setPaper(paper);  
      System.out.println("After- " + dump(paper)); 
      System.out.println("After- " + dump(pf));     
      dump(pf);  
      PageFormat validatePage = pj.validatePage(pf); 
      System.out.println("Valid- " + dump(validatePage));     
      //Book book = new Book(); 
      //book.append(new MyPrintable(), pf); 
      //pj.setPageable(book);  
      pj.setPrintable(new MyPrintable(), pf); 
      try { 
       pj.print(); 
      } catch (PrinterException ex) { 
       ex.printStackTrace(); 
      }  
     }  
    } 

    protected static double fromCMToPPI(double cm) {    
     return toPPI(cm * 0.393700787);    
    } 

    protected static double toPPI(double inch) {    
     return inch * 72d;    
    } 

    protected static String dump(Paper paper) {    
     StringBuilder sb = new StringBuilder(64); 
     sb.append(paper.getWidth()).append("x").append(paper.getHeight()) 
      .append("/").append(paper.getImageableX()).append("x"). 
      append(paper.getImageableY()).append(" - ").append(paper 
     .getImageableWidth()).append("x").append(paper.getImageableHeight());    
     return sb.toString();    
    } 

    protected static String dump(PageFormat pf) {  
     Paper paper = pf.getPaper();    
     return dump(paper);  
    } 

    public static class MyPrintable implements Printable { 

     @Override 
     public int print(Graphics graphics, PageFormat pageFormat, 
      int pageIndex) throws PrinterException {  
      System.out.println(pageIndex);     
      int result = NO_SUCH_PAGE;  
      if (pageIndex < 2) {      
       Graphics2D g2d = (Graphics2D) graphics;      
       System.out.println("[Print] " + dump(pageFormat));      
       double width = pageFormat.getImageableWidth(); 
       double height = pageFormat.getImageableHeight();  
       g2d.translate((int) pageFormat.getImageableX(), 
        (int) pageFormat.getImageableY());      
       g2d.draw(new Rectangle2D.Double(1, 1, width - 1, height - 1));      
       FontMetrics fm = g2d.getFontMetrics(); 
       g2d.drawString("0x0", 0, fm.getAscent());  
       result = PAGE_EXISTS;  
      }  
      return result;  
     } 
    } 
} 

我知道了一些与PrintDialog类做werid和美好的事情,如果你尝试,并指定纸张尺寸和利润率不一致的,但说实话,那是另一天的问题。

我已经发布的代码是能够为我戴莫LabelWriter 400涡轮打印两个标签,一前一后没有问题

修订 还应该提到,我认为你是缺少基本PageFormat.setPaper

与Barbaque条码

从文件例如打印更新中...

Barcode b = BarcodeFactory.createCode128("Hello"); 
b.setResolution(72); 

File f = new File("mybarcode.png"); 
// Let the barcode image handler do the hard work 
BarcodeImageHandler.savePNG(b, f); 

. 
. 
. 

public static class PrintFromFile implements Printable { 

    @Override 
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 

     int result = NO_SUCH_PAGE; 
     if (pageIndex == 0) { 

      graphics.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY()); 

      result = PAGE_EXISTS; 

      try { 

       // You may want to rescale the image to better fit the label?? 
       BufferedImage read = ImageIO.read(new File("mybarcode.png")); 
       graphics.drawImage(read, 0, 0, null); 

      } catch (IOException ex) { 

       ex.printStackTrace(); 

      } 

     } 

     return result; 

    } 

} 

打印直接对图形环境

Barcode b = BarcodeFactory.createCode128("Hello"); 
b.setResolution(72); 

. 
. 
. 

public static class PrintToGraphics implements Printable { 

    private Barcode b; 

    private PrintToGraphics(Barcode b) { 

     this.b = b; 

    } 

    @Override 
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 

     int result = NO_SUCH_PAGE; 
     if (pageIndex == 0) { 

      result = PAGE_EXISTS; 

      int x = (int)pageFormat.getImageableX(); 
      int y = (int)pageFormat.getImageableY(); 

      int width = (int)pageFormat.getImageableWidth(); 
      int height = (int)pageFormat.getImageableHeight(); 

      graphics.translate(x, y); 
      try { 
       b.draw((Graphics2D)graphics, 0, 0); 
      } catch (OutputException ex) { 

       ex.printStackTrace(); 

      } 

     } 

     return result; 

    } 

} 

最后但并非最不重要的,直接从下载

public class PrintingExample 
{ 

    public static void main(String[] args) 
    { 
     try 
     { 
      Barcode b = BarcodeFactory.createCode128("Hello"); 
      PrinterJob job = PrinterJob.getPrinterJob(); 
      job.setPrintable(b); 
      if (job.printDialog()) 
      { 
       job.print(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 

} 
+0

这会提示我选择打印机吗? – 2012-08-04 14:12:14

+0

如何使其直接打印到打印机?我如何让它创建一个条形码? – 2012-08-04 17:13:17

+0

@RileyChilds 1- yes; 2-它确实直接打印到打印机上,如果您快速搜索Java条形码生成器,您会发现许多开放源代码库,可以满足您的需求 – MadProgrammer 2012-08-04 19:47:37