SWT StyledText - PrinterChooser?!

Status
Nicht offen für weitere Antworten.

Prengepower

Aktives Mitglied
Moin!

Also drucken funktioniert bei StyledText ja wunderbar, aber gibt es soetwas wie einen PrinterChooser? Also das nicht vom Default Printer gedruckt wird sondern der User seinen Drucker aussuchen kann?

Vielen Dank!
 

Developer_X

Top Contributor
Schau dir mal diesen Arktikel an, wenn dir meine Antwort net reicht.
Drucken mit Java

Meine Antwort:
Java:
PrintService prserv = ServiceUI.printDialog( null, 50, 50, prservices, prservDflt, null, aset );
// Damit wird ein Dialog gestartet/geoeffnet, indem du alles einstellen kannst, unter anderem auch das Drucken
Am besten schaust du dir beide klassen mal an und startest die eine Klasse namens PrintWithJ2SE14Graphics aus dem Beispiel.
Hilfsklasse MyPrintableObject
Java:
package producers;
import java.awt.*;
import java.awt.print.*;

public class MyPrintableObject implements Printable
{
  public int iResMul = 4;  // 1 = 72 dpi; 4 = 288 dpi

  public int print( Graphics g, PageFormat pf, int iPage )
  throws PrinterException
  {
    final int    FONTSIZE = 12;
    final double PNT_MM   = 25.4 / 72.;
    if( 0 != iPage )
      return NO_SUCH_PAGE;
    try {
      int iPosX = 1;
      int iPosY = 1;
      int iAddY = FONTSIZE * 3/2 * iResMul;
      int iWdth = (int)Math.round( pf.getImageableWidth()  * iResMul ) - 3;
      int iHght = (int)Math.round( pf.getImageableHeight() * iResMul ) - 3;
      int iCrcl = Math.min( iWdth, iHght ) - 4 * iResMul;
      Graphics2D g2    = (Graphics2D)g;
      PrinterJob prjob = ((PrinterGraphics)g2).getPrinterJob();
      g2.translate( pf.getImageableX(), pf.getImageableY() );
      g2.scale( 1.0 / iResMul, 1.0 / iResMul );
      g2.setFont( new Font( "SansSerif", Font.PLAIN, FONTSIZE * iResMul ) );
      g2.setColor( Color.black );
      g2.drawRect( iPosX, iPosY, iWdth, iHght );
      g2.drawLine( iPosX, iHght/2 + iWdth/50, iPosX + iWdth, iHght/2 - iWdth/50 );
      g2.drawLine( iPosX, iHght/2 - iWdth/50, iPosX + iWdth, iHght/2 + iWdth/50 );
      g2.drawOval( iPosX + 2*iResMul, iHght - iCrcl - 2*iResMul, iCrcl, iCrcl );
      iPosX += iAddY;
      iPosY += iAddY / 2;
      g2.drawString( "PrinterJob-UserName: " + prjob.getUserName(),
                     iPosX, iPosY+=iAddY );
      g2.drawString( "Betriebssystem: "
                     + System.getProperty( "os.name" ) + " "
                     + System.getProperty( "os.version" ), iPosX, iPosY+=iAddY );
      g2.drawString( "Java-Version: JDK "
                     + System.getProperty( "java.version" ), iPosX, iPosY+=iAddY );
      g2.drawString( "Width/Height: "
                     + dbldgt( pf.getWidth() )  + " / "
                     + dbldgt( pf.getHeight() ) + " points = "
                     + dbldgt( pf.getWidth()  * PNT_MM ) + " / "
                     + dbldgt( pf.getHeight() * PNT_MM ) + " mm",
                     iPosX, iPosY+=iAddY );
      g2.drawString( "Imageable Width/Height: "
                     + dbldgt( pf.getImageableWidth() )  + " / "
                     + dbldgt( pf.getImageableHeight() ) + " points = "
                     + dbldgt( pf.getImageableWidth()  * PNT_MM ) + " / "
                     + dbldgt( pf.getImageableHeight() * PNT_MM ) + " mm",
                     iPosX, iPosY+=iAddY );
      g2.drawString( "Imageable X/Y: "
                     + dbldgt( pf.getImageableX() ) + " / "
                     + dbldgt( pf.getImageableY() ) + " points = "
                     + dbldgt( pf.getImageableX() * PNT_MM ) + " / "
                     + dbldgt( pf.getImageableY() * PNT_MM ) + " mm",
                     iPosX, iPosY+=iAddY );
      g2.drawString( "versuchte Druckauflösung: "
                     + 72 * iResMul + " dpi", iPosX, iPosY+=iAddY );
    } catch( Exception ex ) {
      throw new PrinterException( ex.getMessage() );
    }
    return PAGE_EXISTS;
  }

  private static double dbldgt( double d )
  {
    return Math.round( d * 10. ) / 10.;  // show one digit after point
  }
}
PrintWithJ2SE14Graphics
Java:
package producers;
import java.util.*;
import java.io.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;

public class PrintWithJ2SE14Graphics
{
  public static void main( String args[] )
  {
    new PrintWithJ2SE14Graphics( args );
  }

  public PrintWithJ2SE14Graphics( String args[] )
  {
    final String sCrLf              = System.getProperty( "line.separator" );
    final String sPrintFile         = "PrintFile.ps";
    final String sErrNoPrintService = sCrLf
                                    + "Es ist kein passender Print-Service installiert.";
    System.out.println(
      sCrLf + "Drucken eines Grafikobjekts entweder mit dem Drucker oder als PostScript-Datei."
    + sCrLf + "Ohne Kommandozeilenparameter werden alle gefundenen Print-Services aufgelistet"
    + sCrLf + "und ein Druckerdialog gestartet."
    + sCrLf + "Eine Zahl >= 0 steuert den zu dieser Zahl gehoerenden PrintService/Drucker an."
    + sCrLf + "Mit irgendeinem Buchstaben als Kommandozeilenparameter wird eine Ausgabedatei "
    + sCrLf + "im PostScript-Format erzeugt."
    + sCrLf + "Wird als zweiter Parameter np (no printing) angegeben, wird nicht gedruckt."
    + sCrLf );

    // Commandline parameter:
    String s2ndParm = null;    // second commandline parameter
    int idxPrintService = -1;  // -1 means: no parameter
    if( null != args && 0 < args.length )
    {
      // Check first commandline parameter (PrintService index):
      if( null != args[0] )
      {
        idxPrintService = -2;  // -2 means: not a number
        try {                  // nr means: PrintService index
          idxPrintService = Integer.parseInt( args[0] );
        }
        catch( Exception ex ) {
        }
      }
      // Check second commandline parameter ('np'):
      if( 1 < args.length )
        s2ndParm = args[1];
    }

    // Set DocFlavor and print attributes:
    DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    aset.add( MediaSizeName.ISO_A4 );

    try {

      if( -2 == idxPrintService )
      {
        // Print to Stream (here to PostScript File):
        StreamPrintServiceFactory[] prservFactories =
          StreamPrintServiceFactory.lookupStreamPrintServiceFactories(
            flavor, DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType() );
        if( null == prservFactories || 0 >= prservFactories.length )
        {
          System.err.println( sErrNoPrintService );
          System.exit( 2 );
        }
        System.out.println( "Stream-PrintService-Factory:" );
        for( int i=prservFactories.length-1; i>=0; i-- )
          System.out.println( "  " + prservFactories[i]
                            + " (" + prservFactories[i].getOutputFormat() + ")" );
        FileOutputStream   fos = new FileOutputStream( sPrintFile );
        StreamPrintService sps = prservFactories[0].getPrintService( fos );
        System.out.println( "Stream-PrintService:" );
        System.out.println( "  " + sps + " (" + sps.getOutputFormat() + ")" );
        printPrintServiceAttributesAndDocFlavors( sps );
        DocPrintJob pj = sps.createPrintJob();
        Doc doc = new SimpleDoc( new MyPrintableObject(), flavor, null );
        pj.print( doc, aset );
        fos.close();
        System.out.println( "Ausgabedatei '" + sPrintFile
                          + "' ist erfolgreich generiert." );
      }
      else
      {
        // Print to PrintService (e.g. to Printer):
        PrintService   prservDflt = PrintServiceLookup.lookupDefaultPrintService();
        PrintService[] prservices = PrintServiceLookup.lookupPrintServices( flavor, aset );
        if( null == prservices || 0 >= prservices.length )
          if( null != prservDflt )
          {
            System.err.println( "Nur Default-Printer, da lookupPrintServices fehlgeschlagen." );
            prservices = new PrintService[] { prservDflt };
          }
          else
          {
            System.err.println( sErrNoPrintService );
            System.exit( 3 );
          }
        System.out.println( "Print-Services:" );
        for( int i=0; i<prservices.length; i++ )
          System.out.println( "  " + i + ":  " + prservices[i]
                              + (( prservDflt != prservices[i] ) ? "" : " (Default)") );
        PrintService prserv = null;
        if( 0 <= idxPrintService && idxPrintService < prservices.length )
          prserv = prservices[idxPrintService];
        else
        {
          if( !Arrays.asList( prservices ).contains( prservDflt ) )  prservDflt = null;
          prserv = ServiceUI.printDialog( null, 50, 50, prservices, prservDflt, null, aset );
        }
        if( null != prserv )
        {
          System.out.println( "Ausgewaehlter Print-Service:" );
          System.out.println( "      " + prserv );
          printPrintServiceAttributesAndDocFlavors( prserv );
          if( null == s2ndParm || !s2ndParm.equalsIgnoreCase( "np" ) )
          {
            DocPrintJob pj = prserv.createPrintJob();
            Doc doc = new SimpleDoc( new MyPrintableObject(), flavor, null );
            pj.print( doc, aset );
            System.out.println( "Grafik ist erfolgreich gedruckt." );
          }
        }
      }

    } catch( PrintException pe ) { 
      System.err.println( pe );
    } catch( IOException ie ) { 
      System.err.println( ie );
    }
    System.exit( 0 );
  }

  private void printPrintServiceAttributesAndDocFlavors( PrintService prserv )
  {
    String s1=null, s2;
    Attribute[] prattr = prserv.getAttributes().toArray();
    DocFlavor[] prdcfl = prserv.getSupportedDocFlavors();
    if( null != prattr && 0 < prattr.length )
      for( int i=0; i<prattr.length; i++ )
        System.out.println( "      PrintService-Attribute["+i+"]: "
                            + prattr[i].getName() + " = " + prattr[i] );
    if( null != prdcfl && 0 < prdcfl.length )
      for( int i=0; i<prdcfl.length; i++ )
      {
        s2 = prdcfl[i].getMimeType();
        if( null != s2 && !s2.equals( s1 ) )
          System.out.println( "      PrintService-DocFlavor-Mime["+i+"]: " + s2 );
        s1 = s2;
      }
  }
}

Wobei ich sagen muss, dass diese BeispielCodes aus solchen Beispielen nicht gerade gut programmiert sind, sondern eher wild durcheinander, und nicht klar strukturiert.

Deshalb, wende dich wenn du fragen hast bitte einfach noch mal an mich, dann helfe ich dir gerne.

Ich hoffe meine Antwort konnte dir helfen,
Developer_X
 

Prengepower

Aktives Mitglied
Meine Antwort: [...]

Also ich hab des jetzt mal irgendwie veruscht aber absolut keine Ahnung wie das gehen soll!?! Ich hab hier nen Button Drucken und wenn ich auf den klicke soll sich wie bei bspw. Word nen Fenster öffnen wo ich die ganzen Drucker-Sachen auswählen kann...
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Hier mal ein kleines Beispiel von mir. Interessant sollten besonders die Zeilen 77 ff sein.
Java:
/* (@)PrintingTestGui.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.print.*;

public class PrintingTestGui {

  private static class TestPageable implements Pageable {

    public int getNumberOfPages() {
      return 2;
    }

    public PageFormat getPageFormat(int pageIndex)
          throws IndexOutOfBoundsException {
      final PageFormat pf = new PageFormat();
      pf.setOrientation(PageFormat.PORTRAIT);
      final Paper paper = new Paper();
      paper.setSize(mmToInch(210), mmToInch(297));
      paper.setImageableArea(mmToInch(20), mmToInch(20), mmToInch(170),
            mmToInch(257));
      pf.setPaper(paper);
      return pf;
    }

    private double mmToInch(double mm) {
      return mm * 72 / 25.4;
    }

    public Printable getPrintable(int pageIndex)
          throws IndexOutOfBoundsException {
      switch (pageIndex) {
      case 0:
      case 1:
        return new Printable() {

          public int print(
                Graphics graphics,
                PageFormat pageFormat,
                int pageIndex) throws PrinterException {
            ((Graphics2D) graphics).draw(new Rectangle2D.Double(pageFormat
                  .getImageableX(), pageFormat.getImageableY(), pageFormat
                  .getImageableWidth(), pageFormat.getImageableHeight()));
            return PAGE_EXISTS;
          }
        };
      }
      throw new IndexOutOfBoundsException();
    }
  }

  /**
   * Test main method.
   * 
   * @param args ignored
   * @throws PrinterException
   */
  public static void main(String[] args) throws PrinterException {
    final PrinterJob job = PrinterJob.getPrinterJob();
    job.setPageable(new TestPageable());
    if (job.printDialog()) {
      job.print();
    }
  }
}
PS: Gar zu lange Zitate bitte kürzen; ist unschön, wenn man eine ganze Seite herunter scrollen muss, nur weil der ganze Beitrag direkt darüber nochmal zitiert wurde. Danke. (Hab Deinen letzten Beitrag editiert).

Ebenius
 

Prengepower

Aktives Mitglied
PS: Gar zu lange Zitate bitte kürzen; ist unschön, wenn man eine ganze Seite herunter scrollen muss, nur weil der ganze Beitrag direkt darüber nochmal zitiert wurde. Danke. (Hab Deinen letzten Beitrag editiert).

Ebenius

Also danke für die Antwort. Ich hab des mal probiert und des is genau das was ich suche! Allerdings habe ich ein Problem... Wie bekomme ich meinen Text aus dem StyledText da rein? Ich habe wirklich nur Text (ggf. farbig).. Er erstellt mir leider nämlich nur 2 leere Seiten (wenn ich mit meinem PDFCreater arbeite ums zu testen)...

Wie kann ich die richtige Seitenanzahl auslesen lassen und wie bekomme ich den Inhalt aus dem StyledText da rein?

Mfg
 

Ebenius

Top Contributor
Ahso, ich wusste bisher nicht, was StyledText genau ist. Das gehört zu SWT, oder?

Ebenius
 

Ebenius

Top Contributor
Hab mal den Themenpräfix auf SWT gesetzt, damit das jeder mit bekommt.

Von SWT hab ich keine Ahnung. Aber auf dieser Beispiel-Seite gibt's im Abschnitt "Printing" ein Link zu einem Beispiel: "print text to printer, with word wrap and pagination". Darin findest Du die Methode [c]menuPrint()[/c] die einen PrintDialog öffnet. Dann kannst Du sicher die Methode [c]StyledText.print(Printer)[/c] benutzen...

So in etwa. :)

Ebenius
 

Prengepower

Aktives Mitglied
Hab mal den Themenpräfix auf SWT gesetzt, damit das jeder mit bekommt.

Von SWT hab ich keine Ahnung. Aber auf dieser Beispiel-Seite gibt's im Abschnitt "Printing" ein Link zu einem Beispiel: "print text to printer, with word wrap and pagination". Darin findest Du die Methode [c]menuPrint()[/c] die einen PrintDialog öffnet. Dann kannst Du sicher die Methode [c]StyledText.print(Printer)[/c] benutzen...

So in etwa. :)

Ebenius

so ich habs jetzt so ansich....

Java:
Shell s = new Shell();
	    PrintDialog printDialog = new PrintDialog(s, SWT.NONE);
	    printDialog.setText("Print");
	    PrinterData printerData = printDialog.open();
	    if(!(printerData==null))
	    {
	        Printer p = new Printer(printerData);
	        p.startJob("PrintJob");    
	        p.startPage();
	        Rectangle trim = p.computeTrim(0, 0, 0, 0);
	        Point dpi = p.getDPI();
	        int leftMargin = dpi.x + trim.x; 
	        int topMargin = dpi.y / 2 + trim.y; 
	        GC gc = new GC(p);
	        Font font = gc.getFont(); 
	        String printText = de.hwrberlin.jemm.views.Editor.text.getText();
	        Point extent = gc.stringExtent(printText);
	        gc.drawString(printText, leftMargin, topMargin + font.getFontData()[0].getHeight());
	        p.endPage();
	        gc.dispose();
	        p.endJob();
	        p.dispose();
	    }

einzige problem is no, dass er ein ENTER als punkt und nicht als absatz druckt..
 

Developer_X

Top Contributor
hey, ich hab hier mal ne Klasse, die ganz einfach zu bedienen ist, sie druckt sozusagen das "Component".
Java:
package producers;

import java.awt.*;
import javax.swing.*;
import java.awt.print.*;

public class PrintUtilities implements Printable
{
	private Component componentToBePrinted;

	public static void printComponent(Component c) 
	{
		new PrintUtilities(c).print();
	}

	public PrintUtilities(Component componentToBePrinted)
	{
		this.componentToBePrinted = componentToBePrinted;
	}

	public void print()
	{
		PrinterJob printJob = PrinterJob.getPrinterJob();
		printJob.setPrintable(this);
		if (printJob.printDialog())
			try
			{
				printJob.print();
			}
			catch (PrinterException pe) 
			{
				System.out.println("Error printing: " + pe);
			}
	}

	public int print(Graphics g, PageFormat pageFormat, int pageIndex)
	{
		if (pageIndex > 0)
		{
			return (NO_SUCH_PAGE);
		} 
		else 
		{
			Graphics2D g2d = (Graphics2D) g;
			g2d.translate(pageFormat.getImageableX(), pageFormat
					.getImageableY());
			disableDoubleBuffering(componentToBePrinted);
			componentToBePrinted.paint(g2d);
			enableDoubleBuffering(componentToBePrinted);
			return (PAGE_EXISTS);
		}
	}

	public static void disableDoubleBuffering(Component c)
	{
		RepaintManager currentManager = RepaintManager.currentManager(c);
		currentManager.setDoubleBufferingEnabled(false);
	}

	public static void enableDoubleBuffering(Component c) 
	{
		RepaintManager currentManager = RepaintManager.currentManager(c);
		currentManager.setDoubleBufferingEnabled(true);
	}
}

So die verwendest du wie folgt:
Java:
		PrintUtilities.printComponent(TextArea); // Da wo TextArea steht, musst du den 
//namen deines componenten eingeben
 
G

Gastredner

Gast
Developer_X hat gesagt.:
hey, ich hab hier mal ne Klasse, die ganz einfach zu bedienen ist, sie druckt sozusagen das "Component".
Das bringt ihm nix - er arbeitet mit SWT, nicht mit AWT oder Swing. Da gibt es keine Oberklasse Component.

Ich hab leider die Präsentation von meiner SWT-/RCP-Schulung nicht hier auf dem Rechner, da stand meiner Erinnerung zufolge was zum Drucken unter SWT drin...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben