Drucken von Dokumenten in Java
Inhaltsverzeichnis
Drucken von einfachem Text
Um einfachen Text auszudrucken genügt folgendes Beispiel:
Drucker.java
<code=java> import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.JobAttributes; import java.awt.PageAttributes; import java.awt.PrintJob; import java.util.ArrayList; import javax.swing.JFrame;
public class Drucker {
private String[] data; private ArrayList ar = null; private Font myFont = new Font("SansSerif", Font.PLAIN, 12);
/** * ************************************************************************* * * Fügt einen String hinzu und geht danach in die nächste Zeile * * @param Text String * * ************************************************************************* */ public void addString(String Text) { if (ar == null) { ar = new ArrayList(); ar.add(Text); } else { ar.add(Text); } }
/** * ************************************************************************ * * fügt eine leerzeile hinzu * * ************************************************************************ */ public void addLeerzeile() { if (ar != null) { ar.add("\n"); } }
/** * ************************************************************************ * * Fügt einen Tab hinzu und somit kann man in der gleichen Zeile * weiterschreiben * ************************************************************************ */ public void addTab() { if (ar != null) { ar.add("\t"); } }
void druckeSeite(JFrame f, String title, boolean bRand) { druckeSeite(f, title, bRand, false); }
/** * ************************************************************************** * * Druckt schließlich die Seite und ob ein Rand dabei ist oder nicht * * @param f JFrame * * @param title Titel * * @param bRand Rand * * @param bLandscape ob es querformat(true) oder hochformat ist (false) * ************************************************************************** */ void druckeSeite(JFrame f, String title, boolean bRand, boolean bLandscape) {
//falls der Frame null ist if (f == null) { f = new JFrame(); }
PageAttributes page = new PageAttributes();
if (bLandscape) { page.setOrientationRequested(PageAttributes.OrientationRequestedType.LANDSCAPE); } else { page.setOrientationRequested(PageAttributes.OrientationRequestedType.PORTRAIT); }
PrintJob prjob = f.getToolkit().getPrintJob(f, title, new JobAttributes(), page);
if (null != prjob) { final int iScreenResol = f.getToolkit().getScreenResolution(); final int iPageResol = prjob.getPageResolution(); final Dimension dimScreenSize = f.getToolkit().getScreenSize(); final Dimension dimPageDimension = prjob.getPageDimension(); Graphics pg = prjob.getGraphics();
if (null != pg && 0 < iPageResol) { //merkt sich die Größe int iAddY = pg.getFontMetrics(this.myFont).getHeight(); int iRand = (int) Math.round(iPageResol * 2. / 2.54); // 2 cm Rand int iPosX = iRand + iRand / 4; // Textposition int iPosY = iPosX - iAddY / 2; int iWdth = dimPageDimension.width - iRand * 2; // innere Breite int iMidY = dimPageDimension.height / 2;
//setzt die Schrift und die Schriftgröße pg.setFont(myFont); if (ar != null) { data = (String[]) ar.toArray(new String[ar.size()]); for (int x = 0; x != data.length; x++) { //fügt ein Leerzeichen hinzu if (data[x].equals("\n")) { iPosY += (iAddY * 0.65); //nicht die komplette Höhe nehmen } else if (data[x].equals("\t")) { //der 10 steht für die Breite des Tabs, variable vereinbar iPosX += (iAddY * 2 / 3) * 10; //wenn die Tab position schon weiter ist, als die Weite, dann wird auf //Anfang gesetzt und neue Zeile if (iPosX > iWdth) { iPosX = iRand + iRand / 4; iPosY += iAddY; } else { iPosY -= iAddY; } } //wenn nichts erfüllt wird, wird einfach dazugehängt else { String str[] = seperateString(data[x], pg.getFontMetrics(myFont), true, iWdth); for (int y = 0; str != null && y != str.length; y++) { if (y > 0) { iPosY += (iAddY * 0.65); //nicht die komplette Höhe nehmen } pg.drawString(str[y], iPosX, iPosY += iAddY); } } }
//Buffer wird geleert ar = null;
} //wenn man noch gar nix hineingeschrieben hat, wird der Fehlertext gedruckt, //variable abendbar, ob überhaupt gedruckt werden soll else { pg.drawString("Error, not initialized", iPosX, iPosY += iAddY); }
//wenn rand true ist, wird ein Rand gezeichnet if (bRand) { pg.drawRect(iRand, iRand, iWdth, dimPageDimension.height - iRand * 2); } pg.dispose(); } prjob.end(); } }
/** * ************************************************************************** * * Funktion zerlegt die Strings für die Anpassung am Bildschirm * * @param strText String der Text * * @param fontMet FontMetrics welche Schriftart * * @param wrapword boolean ob Wörter abgeteilt werden sollen oder nicht * * @param iWidth int die Breite des Blatts * * @return String[] * ************************************************************************** */ private String[] seperateString(String strText, FontMetrics fontMet, boolean wrapword, int iWidth) {
ArrayList myTmp = new ArrayList(); int z = 0; //merkt sich den Index
//geht die Wörter durch und sollte sie abteilen for (int x = 0, y = 0; x != strText.length(); x++) { y += fontMet.charWidth(strText.charAt(x)); if (y > iWidth) { y = 0; x--; //wenn wrapword ist, bei einem Leerzeichen abtrennen if (wrapword) { x = strText.lastIndexOf(" ", x) + 1; //+1 damit er das Leerzeichen mitausdruckt und nicht in der nächsten Zeile steht }
myTmp.add(strText.substring(z, x)); z = x; } }
//damit er auch den letzten Teil hinzufügt myTmp.add(strText.substring(z, strText.length()));
//Gibt die ArrayListe als String Objekt zurück return (String[]) myTmp.toArray(new String[myTmp.size()]); }
/** * ************************************************************************** * * Funktion setzt eine neue Schriftart * * @param font Font * * ************************************************************************* */ public void setFont(Font font) { this.myFont = font; }
} </code=java>
Test-Methode aus einer aufrufenden Klasse
<code=java> public void test() {
Drucker printer = new Drucker(); printer.addString("Daten"); printer.addLeerzeile(); printer.addTab(); printer.addString("JUHU"); printer.druckeSeite(this, "nix", false); //this ist ein frame/panel/container, es darf halt nicht null sein!
//false steht für den Rahmen. Dass der Titel ausdruckt wird, habe ich noch nicht geschafft! //standardmäßig ist Hochformat //printer.druckeSeite(this,"nix",false,true); //würde es im Querformat drucken
} </code=java>
Drucken von Dokumenten
Der Flavor gibt an, um welches Dokument es sich handelt, hier ist die Hilfe dafür: DocFlavor.INPUT_STREAM
<code=java> import java.awt.GraphicsEnvironment; import java.io.FileInputStream; 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.PrintJobListener;
import javax.print.event.PrintJobEvent;
public class PrintDocument {
private MyDruckListener drucker = new MyDruckListener();
public PrintDocument(String strFilename, int iDevice) {
try {
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
//setzt das auszudruckend Dokument fest DocFlavor flavor = DocFlavor.INPUT_STREAM.XXX; //hier nachsehen, welches man benötigt!
PrintService printService[] = PrintServiceLookup.lookupPrintServices( flavor, pras);
PrintService defaultService = PrintServiceLookup. lookupDefaultPrintService();
PrintService service = null;
//wenn als Device -1 übergeben wird, wird ein Dialog für das drucken auswählen ausgegeben! if (iDevice == -1) {
service = ServiceUI.printDialog(GraphicsEnvironment. getLocalGraphicsEnvironment(). getDefaultScreenDevice(). getDefaultConfiguration(), 200, 200, printService, defaultService, flavor, pras);
} //ansonsten wird der 1te (Standard/Default) Drucker genommen else {
//wenn es keine Drucker gibt und das Device niedriger ist als die Länge if (printService != null && printService.length != 0 && printService.length > iDevice) { service = printService[iDevice]; }
//ansonsten standarddevice else if (printService != null && printService.length != 0) { service = printService[0]; } }
//wenn der Dateiename null ist, wird die Druckfunktion beendet! if (strFilename == null) { return; }
//wenn der Service nicht null ist, wird ausgedruckt if (service != null) { DocPrintJob job = service.createPrintJob();
//fügt listener hinzu job.addPrintJobListener(drucker); FileInputStream fis = new FileInputStream(strFilename); DocAttributeSet das = new HashDocAttributeSet(); Doc doc = new SimpleDoc(fis, flavor, das); job.print(doc, pras); } } //wenn kein Druckerdevice gefunden wurde!! catch (ArrayIndexOutOfBoundsException ex) { ex.printStackTrace(); System.out.println("Keine Drucker gefunden!!"); } //bei sonstigen Exceptions! catch (Exception ex) { ex.printStackTrace(); } }
class MyDruckListener implements PrintJobListener {
public void printDataTransferCompleted(PrintJobEvent printJobEvent) { System.out.println("Daten wurden zum Drucker geschickt!"); }
public void printJobCompleted(PrintJobEvent printJobEvent) { System.out.println("Drucker hat fertig gedruckt!"); }
public void printJobFailed(PrintJobEvent printJobEvent) { System.out.println("Fehler beim Drucken!"); }
public void printJobCanceled(PrintJobEvent printJobEvent) { System.out.println("Abbruch des druckes!"); }
public void printJobNoMoreEvents(PrintJobEvent printJobEvent) { System.out.println("JobNoMoreEvents!"); }
public void printJobRequiresAttention(PrintJobEvent printJobEvent) { System.out.println("JobRequieresAttention!"); } }
}
</code=java>
Drucken von Bildern
Bilder kann man ausdrucken, in dem man bspw. ein JLabel benutzt, das ein Bild beinhaltet. Folgende, fertige Klasse kann das erledigen:
<code=java> import java.awt.print.Printable; import java.awt.Graphics; import java.awt.print.PageFormat; import java.awt.print.PrinterException; import javax.swing.JLabel; import javax.swing.Icon; import java.awt.Graphics2D; import java.awt.print.PrinterJob;
public class PrintableLabel extends JLabel implements Printable {
/** * ************************************************************************** * * Konstruktor für das * * @param Image Icon * *************************************************************************** */ public PrintableLabel(Icon Image) { super(Image); }
/** * ************************************************************************** * * Überschriebene Methode fürs eigentliche Ausdrucken * * @param graphics Graphics * * @param pageFormat PageFormat * * @param pageIndex int * * @return int * * @throws PrinterException * ************************************************************************** */ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex >= 1) { return Printable.NO_SUCH_PAGE; }
Graphics2D g = (Graphics2D) graphics; g.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); paint(g); return Printable.PAGE_EXISTS;
}
/** * ************************************************************************** * * Druckmethode von außen * ************************************************************************** */ public void print() { PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintable(this); if (printJob.printDialog()) { try { printJob.print(); } catch (PrinterException e) { e.printStackTrace(); } } }
} </code=java>
Hinweis: Gedruckt wird, indem man print() aufruft.
--Benutzer:thE_29 24.08.2004, 15:50