# Problem mit Etikettendrucker



## night507 (22. Aug 2011)

Hallo, ich hab ein Problem mit dem Etikettendrucker von Zebra namens "ZDesigner ZM400 200dpi (ZPL)" 

Hier mal der code den ich bisher zum testen verwende. 


```
public class PrintBarcodes implements Printable {

	String[] typeSerials;
	PrinterJob printJob;
	
	public PrintBarcodes() {
		typeSerials = new String[4];
		
		printJob = PrinterJob.getPrinterJob();

		printJob.setPrintable(this);
		if (printJob.printDialog()) {
			try {
				printJob.print();
			} catch (Exception PrintException) {
				PrintException.printStackTrace();
			}
		}

	}

	public void printData(String serial1, String serial2, String serial3,
			String serial4, String typeName, String typeSerial) {
		typeSerials[0] = serial1;
		typeSerials[1] = serial2;
		typeSerials[2] = serial3;
		typeSerials[3] = serial4;
		
		printJob = PrinterJob.getPrinterJob();
		printJob.setPrintable(this);
		try {
			printJob.print();
		} catch (Exception PrintException) {
			PrintException.printStackTrace();
		}
		
	}

	public int print(Graphics g, PageFormat pageFormat, int page) {
		
		Graphics2D g2d;
		
		Font typeFont = new Font("Bar-Code 39 lesbar", 0, 10);

		if (page == 0) {

			g2d = (Graphics2D) g;
			g2d.setColor(Color.black);

			g2d.translate(pageFormat.getImageableX(), pageFormat
					.getImageableY());
			
			JLabel typeLabel = new JLabel("*" + typeSerials[0] + "*");
			
			typeLabel.setFont(scooterBarFont);

               typeLabel.print(g2d);
			
			return (PAGE_EXISTS);
		} else
			return (NO_SUCH_PAGE);
	}

}
```

wenn ich das ausführe, bekomme ich folgenden Fehler:

java.awt.print.PrinterException: Paper's imageable width is too small.
	at sun.print.RasterPrinterJob.printPage(Unknown Source)
	at sun.print.RasterPrinterJob.print(Unknown Source)
	at sun.print.RasterPrinterJob.print(Unknown Source)
	at PrintBarcodes.<init>(PrintBarcodes.java:44)

Der sagt mir, dass die Breite des Etikettes nicht ausreicht, allerdings kann ich den selben Text in Schriftgröße 24 in Excel eingeben und er druckt ohne Probleme. Muss ich irgendwie die Größe des Graphics2D-Objects festlegen (und wenn ja wie?) oder gibts nen anderen Fehler in dem Code den ich gerade einfach nicht sehe??

Wäre super, wenn mir da jemand weiterhelfen kann

mfg night507


----------



## night507 (25. Aug 2011)

Hmm, weiß anscheinend niemand... ne andere möglichkeit dieq ich mir überlegt hab ist,dass ich über apache poi in ne excel-tabelle schreib (da ja da das drucken geht) und dann das ausdrucke, allerdings weiß ich nicht wie ich excel über java dazu bringe zu drucken, da das automatisch ablaufen sollte. weiß dazu jemand ne lösung?


----------



## SamHotte (25. Aug 2011)

Wie sieht denn Deine "scooterBarFont" aus? Bei mir gibt's die nicht ...

/edit: und die Verwendung dieser Klasse könntest Du auch bitte mitliefern, ich hab' das mit dem Drucken seit Jahren nicht mehr angeschaut ;-)


----------



## hansmueller (25. Aug 2011)

Hallo,

du versuchst ein JLabel zu drucken. Kann sein, daß es wegen dem Rahmen und der Standardeinstellungen zu groß ist - das sollte aber eigendlich keine Fehlermeldung bringen, es wird halt nur nicht das ausgedruckt, was auf das Papier paßt. Allerdings mußt du dich in deinem Fall glaube ich selber um die Größe kümmern.
Versuch es doch mal klassisch mit .setFont() und .drawString() auf dein Graphics2D-Objekt.

Und setze mal ein Sysout rein, daß die Breite und Höhe von deinem PageFormat ausgibt.

MfG
hansmueller


----------



## night507 (25. Aug 2011)

also das sollte eig 
[JAVA=56]
typeLabel.setFont(typeFont);
[/code]
heißen, also einfach nur der Font für das Label

.setFont() auf dem graphics-object wird auch ein problem, da ich später mehrere codes auf einmal ausdrucken will und zumindest einer davon größer sein sollte, als die anderen, weshalb ich JLabel verwenden wollte, da man bei nem String den Font schlecht setzen kann ;-)
oder kann ich, sobald der code ne andere größe haben soll, .setFont() aufs graphics object machen und dann .drawString() ? Kenne mich mit dem java-drucken noch nicht sehr aus...ich werds mal ausprobieren und vllt gehts ja auch so

page format ist:
BxH
5 x 16 cm // 1.97 x 6.30 Zoll
oder in Pixel (wenn ich mich nicht verrechnet hab:
394x1260

habe nämlich erst ca um 16Uhr wieder zugriff auf den Drucker, ums zu testen

p.s.:
ich habs mal ganz am anfang mit dem kostenlosen barcode generator barbeque probiert, aber bei dem sind die barcodes auch zu lang(obwohl BarWidth =1) , falls jemand nen anderen generator kennt, der code39 berherrscht, dann würde das vllt auch weiterhelfen ^^


----------



## javabar (9. Nov 2011)

Ich hab grad dasselbe Problem, mit meinen Recherchen bin ich soweit gekommen:

Also im Quellcode von sun.print.RasterPrinterJob.java von 
Zeile 1198 bis 1214 fand ich diesen Code:


```
if (isSupportedValue(media, attributes) ||
    (!fidelity && media != null)) {
    if (media instanceof MediaSizeName) {
        MediaSizeName msn = (MediaSizeName)media;
        MediaSize msz = MediaSize.getMediaSizeForName(msn);
        if (msz != null) {
            float paperWid =  msz.getX(MediaSize.INCH) * 72.0f;
            float paperHgt =  msz.getY(MediaSize.INCH) * 72.0f;
            paper.setSize(paperWid, paperHgt);
            if (mpa == null) {
                paper.setImageableArea(72.0, 72.0,
                                       paperWid-144.0,
                                       paperHgt-144.0);
            }
        }
    }
}
```

mpa wird initialisiert in Zeile 1156/1157 und ist da vermutlich = null :


```
MediaPrintableArea mpa =
    (MediaPrintableArea)attributes.get(MediaPrintableArea.class);
```

Der Code wird vermutlich ausgeführt und ein Rand von 72pt = 1" an allen 4 Seitenkanten "erzwungen".
Wenn die Breite oder Höhe eines Formats dann <= 2" ist, was bei Etiketten oft der Fall ist, entsteht eine negative Breite bzw. Höhe, und kommt es zu dieser Exception in Zeile 1895 bzw. 1900.


----------



## javabar (9. Nov 2011)

Ich hab die Lösung gefunden!

Ihr müsst mit Pageable arbeiten, damit funktioniert's!
Da werden keine Randeinstellungen überschrieben und es funktionieren beliebige Seitenmasse,
auch die PDF-Printer übernehmen die festgelegte Größe!


```
package ettikettendruck;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author JavaBar
 */
public class Document implements Pageable, Printable {

    PageFormat pageFormat;
    static final double mm = 72.0 / 25.4;

    public Document() {
        pageFormat = new PageFormat();

        //pageFormat.setOrientation(PageFormat.LANDSCAPE);
        Paper paper = new Paper();
        paper.setSize(100 * mm, 50 * mm);
        paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight());
        pageFormat.setPaper(paper);
    }

    @Override
    public int getNumberOfPages() {
        return 5;
    }

    @Override
    public PageFormat getPageFormat(int pageIndex) {
        return pageFormat;
    }

    @Override
    public Printable getPrintable(int pageIndex) {
        return this;
    }

    @Override
    public int print(Graphics graphics, PageFormat format, int page) throws PrinterException {
        double x = format.getImageableX();
        double y = format.getImageableY();
        double w = format.getImageableWidth();
        double h = format.getImageableHeight();

        Graphics2D g = (Graphics2D) graphics;

        g.setColor(Color.BLACK);
        g.fill(new Rectangle2D.Double(x, y, w, h));

        g.setColor(Color.WHITE);
        g.drawString("Es klappt!", 40, 60);
        g.drawString("Seite " + (page + 1), 40, 80);

        return PAGE_EXISTS;
    }

    public static void main(String[] args) {
        PrinterJob job = PrinterJob.getPrinterJob();

        job.setJobName("Test");
        job.setPageable(new Document());

        if (job.printDialog()) {
            try {
                job.print();
            } catch (PrinterException ex) {
                Logger.getLogger(Document.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
```

Gruß

Egon Schmid


----------

