Drucken mit Java

Ich muss irgendwie die getGraphics - Methode der BufferedImages nutzen können um das zu Zeichnen!!
Kennt dafür jemand einen Weg?

Was klappte denn an meiner Idee nicht?
Du kannst doch eines deiner Images sowohl auf deine Vorschau zeichnen, als auch auf das Graphics Objekt des PrintJobs.

Aber stimmt, besser du nutzt die javax Variante ;)
 
von Matze
Aber stimmt, besser du nutzt die javax Variante

Bist du jetzt auch der Meinung das javax.print besser ist oder sollte das Ironie sein?

Deine idee ist prinzipiell nicht verkehrt, nur das ich wenn ich diesen weg wähle mit dem Printable - Objekt, mir meistens alle Sagen ich sollte das Graphics in dem Printable - Objekt in der print - Methode zeichnen lassen, was ich aber für bloßen Bullshit, entschuldigt den Ausdruck, halte!

Wie kann ich denn mein BufferedImage Objekt auf ein Graphics zeichnen lassen Wie soll das gehen? Verstehe da deinen Ansatz nicht Matze!!

CU Nathaniell
 
Du hättest nur das machen müssen, was bei "Java ist auch eine Insel" erklärt wurde.

Java:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;

public class PrintableImage
    implements Printable
{

  private Image image = null;

  public PrintableImage(Image image)
  {
    super();
    this.image = image;
  }

  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException
  {
    if(pageIndex >= 2)
      return NO_SUCH_PAGE;
    graphics.drawImage(image, 0, 0, null);
    return PAGE_EXISTS;
  }

  /**
   * @return the image
   */
  public Image getImage()
  {
    return image;
  }

  /**
   * @param image the image to set
   */
  public void setImage(Image image)
  {
    this.image = image;
  }

}

Java:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.swing.JFrame;


public class PrintExample extends JFrame
{

  public PrintExample()
  {
    setSize(300,300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.setPrintable(new PrintableImage(createPrintImage()));
    try
    {
      printJob.print();
    }
    catch (PrinterException e)
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  
  private BufferedImage createPrintImage()
  {
    BufferedImage p = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g = p.createGraphics();
    g.setColor(Color.white);
    g.fillRect(0, 0, getWidth(), getHeight());
    
    g.setColor(Color.BLACK);
    g.drawString("Hallo ich bins der Test!", 50, 50);
    g.drawOval(90, 90, 100, 100);
    
    
    
    return p;
  }
  
  public static void main(String[] args)
  {
    new PrintExample().setVisible(true);
    
  }
}

MFG

Sascha
 
Zuletzt bearbeitet von einem Moderator:
Bist du jetzt auch der Meinung das javax.print besser ist oder sollte das Ironie sein?

javax - Klassen sind i.d.R besser als die awt's, hatte nur gedacht das hat einen Grund, warum du die andere benutzt.

Wie kann ich denn mein BufferedImage Objekt auf ein Graphics zeichnen lassen Wie soll das gehen?

graphicsObjekt.drawImage() ^^

Aber ist jetzt egal, hör lieber auf Sascha, der hat hier um einiges mehr Ahnung ;)
 
Java:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;

public class PrintExample
{
  public static void main(String args[]) throws Exception
  {
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.JPEG;
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
    DocPrintJob job = printService.createPrintJob();
   
    PrintJobListener listener = new PrintJobAdapter()
    {
      public void printDataTransferCompleted(PrintJobEvent e)
      {
        System.out.println("Druck beendet");
        System.exit(0);
      }
    };
    job.addPrintJobListener(listener);
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
    DocAttributeSet das = new HashDocAttributeSet();
    ServiceUI.printDialog(null, 300, 300, new PrintService[]{printService}, printService, flavor, pras);
    Doc doc = new SimpleDoc(createPrintImage(), flavor, das);
    job.print(doc, pras);
    Thread.sleep(5000);
  }

  private static byte[] createPrintImage()
  {
    BufferedImage p = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = p.createGraphics();
    g.setColor(Color.white);
    g.fillRect(0, 0, 300, 300);

    g.setColor(Color.BLACK);
    g.drawString("Hallo ich bins der Test!", 50, 50);
    g.drawOval(90, 90, 100, 100);

    ByteArrayOutputStream bous = new ByteArrayOutputStream();
    try
    {
      ImageIO.write(p, "jpeg", bous);
      bous.close();
    }
    catch (IOException e)
    {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    return bous.toByteArray();
  }
}

MFG

Sascha
 
@ Sascha
Der weg mit dem print wie du das gesagt hast funktioniert wunderbar, nur das bei mir in der Firma der Druck auf Kostenstellen aufgteilt ist und ich 3 mal für die 3 Seiten diese Nummer eingeben muss!! Ich probiere das Jetzt mal über java.awt.print.Book!!

Melde mich dazu später nochmal !!

Aber ich bekomme jede Seite 2 mal ausgedruckt und ich weiss noch nicht Warum!?
Dazu später mit dem fertigen Code mehr!!

@ Matze
Mit dem java.awt.print funktioniert das auch wie Sascha und du das schon gesagt haben. Mir ist aber leider immer noch nicht klar wie der Druck dann an die Images kommt und das ja eigentlich nur über die print - Methode. Eventuell kommt der Druck dann über diese g.drawImage - Funktion ran. Aber da will ich noch die Theorie dazu besser verstehen lernen!!

Ansonsten Danke ich euch für eure Mithilfe!! So gegen 16 - 17 Uhr dürfte ich mit allen Anpassungen fertig sein und stelle dann den Fertigen Quellcode hier in den Thread rein.

CU Nathaniell
 
Zuletzt bearbeitet:
Ok wenn ich das zweite Beispiel von dir nutze wie kann ich dann mehrere Dokumente auf einmal als ein Job absenden?

Weil nun habe ich eine Klasse die dieses Printable - Interface überschreibt und darin mein Bild liegen wie du es gesagt hast!! Kann ich das dann auch nutzen oder muss ich dann wieder komplett umschreiben

Ich habe versucht so mein Druck zu realiesieren aber ich bekomme nur meine selbst gezeichnete Fusszeile gedruckt ohne den Text der da noch enthalten ist!!

Java:
java.awt.print.PrinterJob printerJob = PrinterJob.getPrinterJob();
        javax.print.PrintService services[] = java.awt.print.PrinterJob.lookupPrintServices();
        boolean doPrint = printerJob.printDialog();
        String sprinter = null;
        int iprinter = -1;
        if (doPrint == true) {
            sprinter = printerJob.getPrintService().getName();
            for(int i = 0;i < services.length;i++) {
                if(services[i].getName().equals(sprinter) == true) {
                    iprinter = i;
                    break;
                }
            }
        }
        
        for(int i = 0;i < this.buffimages.capacity();i++) {
            printerJob.setPrintable(this.buffimages.get(i));           
            try {
               printerJob.print();
            } catch (PrinterException e) {
                e.printStackTrace();
            }
}

vorher der CODE funktionierte richtig beim drucken nur er brachte mir jede seite zweimal und eben das ich diese Kostenstellenummer mehrfach eingeben muss!!

Java:
//PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        java.awt.print.PrinterJob printerJob = PrinterJob.getPrinterJob();
        javax.print.PrintService services[] = java.awt.print.PrinterJob.lookupPrintServices();
        boolean doPrint = printerJob.printDialog();
        String sprinter = null;
        int iprinter = -1;
        if (doPrint == true) {
            sprinter = printerJob.getPrintService().getName();
            for(int i = 0;i < services.length;i++) {
                if(services[i].getName().equals(sprinter) == true) {
                    iprinter = i;
                    break;
                }
            }
        }
        
        
        this.book = new java.awt.print.Book();
        for(int i = 0;i < this.buffimages.capacity();i++) {
            this.book.append(this.buffimages.get(i), printerJob.defaultPage());            
        }
        printerJob.setPageable(this.book);
        try {
            printerJob.print();
        } catch (PrinterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
}

CU Nathaniell
 
Zuletzt bearbeitet:
Zurück