2012-08-03 41 views
10

Ho problemi con la stampa su una stampante per etichette. Il codice sottostante stampa 4 "etichette" su una (Immagine dell'etichetta allegata).Stampa in Java sulla stampante per etichette

Il codice seguente stampa su una stampante di etichette Brother QL-500. Stampa su etichette da 3,5 "per 1,1".

Sarebbe anche bello se qualcuno potesse aiutarmi a capire meglio il codice.

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 

ecco quello che la stampa:

+1

E il problema è ?? – MadProgrammer

+0

Non posso impedirmi di stampare 4 della stessa cosa su un'etichetta, come l'immagine mostra –

+0

"Potresti" essere fortunato, mi capita solo di avere un DYMO LabelWriter 400, avrò un gioco e vedrò cosa può scoprire – MadProgrammer

risposta

16

Wow, non posso dirvi quanto io amo la stampa in Java, quando funziona, è grande ...

.

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

Sono a conoscenza di una serie di incongruenze con il PrintDialog fare le cose werid e meravigliose se si cerca di specificare i formati di carta ed i margini, ma onestamente, questa è una domanda per un altro giorno.

Il codice che ho postato è stato in grado di stampare due etichette una dopo l'altra senza problemi sul mio Dymo LabelWriter 400 Turbo

AGGIORNATO ricordare anche, penso che si erano fondamentalmente perdendo PageFormat.setPaper

AGGIORNATO con Barbaque BarCode

Stampa dal file di esempio ...

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; 

    } 

} 

stampa diretta al contesto Graphics

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; 

    } 

} 

Ultimo ma non meno importante, direttamente dalla directory "esempi" del download

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

Questo mi richiederà di selezionare una stampante? –

+0

come faccio a stampare direttamente sulla stampante? anche come faccio a creare un codice a barre? –

+0

@RileyChilds 1- si; 2- stampa direttamente sulla stampante e se esegui una rapida ricerca di Google per il generatore di codici a barre Java, troverai un numero di librerie open source che dovrebbero soddisfare le tue esigenze – MadProgrammer

Problemi correlati