2011-01-06 9 views
2

Drucken Ich habe einen Java-Code, der Barcode-Bild mit dem Namen barcode.jpg in dem gleichen Ordner wie die residente JAR-Datei generiert. Ich mache dieDrucken kontinuierlich Barcode-Bilder über einen Thermodrucker mit Java

Image bcode = Toolkit.getDefaultToolkit().getImage("barcode.jpg"); 
if (bcode != null) { 
    oTokenPrinter.setTokenParameters(strTokenNumber, bcode); 
} 
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
aset.add(OrientationRequested.PORTRAIT); 
aset.add(new MediaPrintableArea((float) 16.0, (float) 20.5, (float) 184.0, (float) 228.5, 1000)); 
System.out.println(aset); 
PrinterJob oJob = PrinterJob.getPrinterJob(); 
PageFormat pf = oJob.defaultPage(); 
oJob.setPrintable(oTokenPrinter, pf); 
System.out.println(aset); 
System.out.println("Printing Started...\n"); 


try { 
    oJob.print(aset); 
} catch (PrinterException ex) { 
    Logger.getLogger(EntryHandler.class.getName()).log(Level.SEVERE, null, ex); 
} 

setTokenParameters Funktion

public void setTokenParameters(String strTokenId, Image barcode) { 
    strTokenID = strTokenId; 
    BarcodeImage = barcode; 
} 

ist, und dies liegt in der gleichen Klasse, die den Druck() Methode enthält.

public int print(Graphics g, PageFormat pf, int iPage) throws 
     PrinterException { 
    if (iPage > 0) { 
     return NO_SUCH_PAGE; 
    } 

    /* User (0,0) is typically outside the imageable area, so we must 
    * translate by the X and Y values in the PageFormat to avoid clipping 
    */ 
    Graphics2D g2d = (Graphics2D) g; 

    g2d.translate(pf.getImageableX(), pf.getImageableY()); 


    /* Now we perform our rendering */ 


    g.setFont(new Font("Arial", Font.BOLD, 10)); 

    /*Printing Begins*/ 

    if (BarcodeImage != null) { 
     System.out.println("Started Printing...\n"); 

     g.drawImage(BarcodeImage, 16, -10, 130, 60, null); 
     g.drawString("Token ID: " + strTokenID, 18, 60); 
     g.dispose(); 
     System.out.println("Finished Printing"); 

    } else { 

     System.out.print("Image not loaded"); 

    } 
    /*Finished Printing.*/ 

    /* tell the caller that this page is part of the printed document */ 
    return PAGE_EXISTS; 
} 

Das ist was ich tue. Die Erzeugung eines Bildes ist in einem Thread und es überschreibt weiterhin und ich kann das sehen, wenn ich das Bild öffne. Aber das Problem ist, dass während des Druckens das gleiche Bild gedruckt wird. Nur das Bild ist immer gleich, die Token-ID ändert sich ständig.

Jede Lösung hierfür. Ich habe versucht, das Bild jedes Mal nach dem Drucken zu löschen. Aber das funktioniert nicht. Ich habe auch versucht, Druckerspooler zu löschen, indem ich eine .bat-Datei durch mein Java-Programm laufen lasse. Kein Erfolg.

HINWEIS: Dies geschieht nur, wenn der Drucker ein Thermodrucker ist. Ich habe einen normalen HP LaserJet ausprobiert und es funktioniert einwandfrei. Aber da ist das Problem, ich muss A4-Blätter verschwenden. Ich brauche dieses Ding in Empfangsgröße auf einem Thermodrucker.

+0

Haben Sie versucht, die Aufgabe zu vereinfachen? zum Beispiel um "Hallo, Welt" auf demselben Drucker zu drucken. Ist es ein Problem der Druckerpuffergröße? – AlexR

+0

Wie gesagt, ich bin in der Lage, beliebige Strings zu drucken, auch wenn sie variieren .... NUR DAS BILD HÄLT AUF WIEDERHOLUNG [es ist immer das erste Bild] ... und beachte auch, dass dieses Ding auf HP Laserjet funktioniert ...NUR AUF THERMALDRUCKER funktioniert das nicht .... – tattu

+0

auch beachten, das bild regeneriert sich richtig ... als ob ich barcode.jpg öffne und eine Vorschau auf den neuen .... nur es druckt den ersten .. Ich weiß nicht, wo der Drucker [oder was auch immer] das erste mit ihm hält ... – tattu

Antwort

0

Klingt wie der Drucker das Bild zwischenspeichert. Versuchen Sie, jedes Mal eine Zufallszahl an den Bildnamen anzuhängen?

Edit:

Eine weitere Möglichkeit besteht darin, dass in der Leitung:

Toolkit.getDefaultToolkit().getImage("barcode.jpg"); 

Das Toolkit, das Bild ist das Caching, anstatt sie neu zu laden.

Edit 2:

Vom javadoc für getImage:

Gibt ein Bild, das Pixeldaten aus der angegebenen Datei entweder GIF JPEG oder PNG können wird, wobei das Format . Das zugrundeliegende Toolkit versucht, mehrere Anfragen mit demselben Dateiname zu demselben zurückgegebenen Image aufzulösen. Da der Mechanismus zum erleichtert diese gemeinsame Nutzung von Bild erforderlich Objekte können weiterhin auf Bilder halten, die nicht mehr von für eine unbestimmte Zeit nicht benutzt, werden Entwickler ermutigt durch die Verwendung ihre eigenen Caching von Bildern zu implementieren Die createImage-Variante, wo immer verfügbar ist.

Für mich klingt das wie das Zwischenspeichern des Bildes - haben Sie stattdessen versucht mit createImage()?

+0

Ja, ich habe das gleiche versucht ... ich änderte ständig den Namen des Bildes mit der aktuellen Zeit. In der jetzigen Zeit wäre das neame des Bildes. Auch ich habe das selbe nach dem Drucken gelöscht. So wird jedes Mal ein neues Bild mit der aktuellen Uhrzeit als Name erzeugt und nach dem Drucken gelöscht. Aber nichts. – tattu

+0

Wie gesagt, ich habe auch eine Fledermausdatei durch das Programm laufen lassen, um den Spooler zu löschen und neu zu starten. Aber keine Änderung mehr. – tattu

+0

Ive bearbeitet - ist das Toolkit das Bild zwischenspeichern? (obwohl wenn Sie das Problem auf allen Druckern sehen würden ...) – PaulJWilliams

Verwandte Themen