Input/Output Drucken ohne GUI

Winston

Mitglied
Hallo zusammen,

ich würde mit Java (1.4.2) gerne formatierten Text drucken ohne GUI. Leider konnte ich trotz ausgiebiger Recherchen keine Möglichkeit finden, ohne GUI zu drucken.
Die einzige Möglichkeit, die es zu geben schint, ist der unschöne Weg, über PDFs.

Ich hoffe, dass jemand eine Möglichkeit kennt.

Danke im Voraus!

Mfg
Winston
 
Schau mal ins Package javax.print ;-)
So weit war ich auch schon, bin aber auch nicht wirklich fündig geworden :-(

Hab da z.B. solche Sachen rausgekriegt:
Java:
PrintService defaultPrintService = PrintServiceLookup
		.lookupDefaultPrintService();
DocPrintJob printerJob = defaultPrintService.createPrintJob();
File file = new File("c://test.txt");
SimpleDoc simpleDoc = null;
DocAttributeSet das = new HashDocAttributeSet();
try {
	simpleDoc = new SimpleDoc(file.toURL(), DocFlavor.URL.AUTOSENSE,
			das);
} catch (MalformedURLException ex) {
	ex.printStackTrace();
}
try {
	printerJob.print(simpleDoc, null);
} catch (PrintException ex) {
	ex.printStackTrace();
}
Was ich jedoch suche, ist eine Möglichkeit, z.B. Objekte vom Typ javax.swing.text.Document (oder Vergleichbares) zu drucken. Bisher sind mir jedoch keine Möglichkeiten bekannt, wie das realisiert werden kann, ohne dass das Document beispielsweise zu einer JTextArea gehört, welche in einem Frame dargestellt wird.

Trotzdem danke für die Antwort!
 
Im javax.print-Package musst Du Dir afaik die Druckausgabe selbst zusammenbasteln - relativ kompliziert, soweit ich mich dunkelst erinnere. Etwas anderes ist mir leider auch nicht bekannt, sorry!
 
Ein Document ist das Modell des Documents, nicht die visuelle Darstellung. Du kannst formatierten Text also nicht einfach so zum Drucker schicken.
Aber: das heißt nicht das du tatsächlich einen JFrame brauchst. Du kannst sowas wie eine JEditorPane auch verwenden ohne das sie in einem Frame liegt. Das funktioniert auch im Headless Betrieb.
SwingUtilities (Java Platform SE 7 )
 
Moin,

eventuell kannst Du Dich auch hieran entlang hangeln :
Drucken mit Java

Gruß
Klaus
Danke, werd ich mir mal anschauen.

Ein Document ist das Modell des Documents, nicht die visuelle Darstellung. Du kannst formatierten Text also nicht einfach so zum Drucker schicken.
Aber: das heißt nicht das du tatsächlich einen JFrame brauchst. Du kannst sowas wie eine JEditorPane auch verwenden ohne das sie in einem Frame liegt. Das funktioniert auch im Headless Betrieb.
SwingUtilities (Java Platform SE 7 )
Hab ich auch schon versucht, aber zumindest unter Java 1.4.2 wird nichts gedruckt, wenn die Componente, die gedruckt werden soll (wie z.B. eine JEditorPane) nicht dargestellt wird.
 
Zeig mal Code dafür.

Also, ich benutze Folgende Klasse zum Drucken:
Java:
package com.poresy.tp.print;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.swing.RepaintManager;

public class PrintUtils implements Printable {
	
	private Component componentToBePrinted;

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

	private PrintUtils(Component componentToBePrinted) {
		this.componentToBePrinted = componentToBePrinted;
	}

	private void print() {
		PrinterJob printJob = PrinterJob.getPrinterJob();
		printJob.setPrintable(this);
		try {
			printJob.print();
		} catch (PrinterException e) {
			e.printStackTrace();
		}
	}

	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);
		}
	}

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

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

So drucke ich:

Java:
public static void main(String args[]) {
	JEditorPane ep = new JEditorPane();
	ep.setText("Test");
	PrintUtils.printComponent(ep);
}

Leider ist der Drucker bei dieser Methode der Meinung, er muss nur ein leeres Blatt ausdrucken:autsch:
 
Deine Komponente hat keine Größe. Du müsstes die "Abmaße" der zu druckenden Komponente auf den druckbaren Bereich setzen. Solange der Inhalt auf eine Seite passt, ist das Drucken kein Problem, muss die Komponente auf mehrere Seiten verteilt gedruckt werden wird's ein bißchen komplexer - soweit ich das noch richtig in Erinnerung habe.
 
Deine Komponente hat keine Größe. Du müsstes die "Abmaße" der zu druckenden Komponente auf den druckbaren Bereich setzen. Solange der Inhalt auf eine Seite passt, ist das Drucken kein Problem, muss die Komponente auf mehrere Seiten verteilt gedruckt werden wird's ein bißchen komplexer - soweit ich das noch richtig in Erinnerung habe.
Hätte ich ja auch selbst drauf kommen können :autsch:

Danke :toll:
 

Zurück
Oben