Hallo,
vor einiger Zeit habe ich mich eine Weile mit Drucken in Java beschäftigt gehabt und gesehen, dass man einfachen Text nicht ohne weiteres mit Java drucken kann. Auch das JPS seit Java 1.4 hilft da nicht großartig weiter, es gibt zwar Funktionen die Text drucken, diese werden aber in der Regel von den meisten Druckern nicht unterstüzt.
Es bleibt also nur noch die Möglichkeit über Graphics zu drucken. D.h. zuerst den Text dem Ausgabeformat entsprechend nach Bedarf den Text seitenweise aufteilen. Jeden Abschnitt dann einzeln auf eine Seite zu Zeichnen und drucken.
Genau das Zeichnen bereitet mir einige Mühe. Hierzu Bedarf es den Gebruach an Klassen wie LineBreakMeausurer, AttributedCharacterIterator, TextLayout und einigen anderen.
Einen Text zeichen mit Vernachlässigung von Tabs oder der Ausrichtung und anderen Formatierungen ist noch zu realisieren. Sollen diese auch beachtet werden, ist es um einiges komplizierter.
Wenn das zeichnen geklappt hat ist das Drucken an sich kein Thema.
Meine Frage hierzu wäre folgende: Ein JTextArea oder JTextPane oder JEditorPane haben doch alle die Methode paint. Tue ich diesen Text zu weisen und anzeigen zeichnen diese ja dann Text mit all ihren Formatierungen. Ich könnte diesen Komponenten dann auch die Größe des Ausgabeformats für das Drucken zuweisen.
Könnte ich dann nicht einfach die Daten aus der paint Mehtode einer dieser Textkomponenten weiterleiten und der paint Methode des Printable Interfaces übergeben?
Das Drucken einer JComponente gibt es natürlich auch in Java, dass meine ich aber nicht, denn so werden dann auch der Rahmen der Komponente oder der ScrollBalken mit ausgedruckt. Das möchte ich nicht.
Wäre das realisierbar wie ich das oben geschildert habe, oder führt kein Weg vorbei an LineBreakMeausurer, AttributetString, AttributedCharacterIterator, TextLayout, etc.?
Hinweis: Ich möchte keine Hilfslibrary für das Drucken verwenden.
Ich habe bisher folgende Klasse geschrieben in der ich Text auf eine JComponente zeichne. Zeilenumbrüche hatten schon funktioniert, bei den Tabs gibt es noch ein wenig Probleme. Ich möchte hier so vorgehen:
1. Ich zeichne den zu druckenden Text zunächst auf eine JComponente in Größe des Ausgabeformats.
2. Wenn der Text mehr als eine Seite in Anspruch nimmt, speichere ich die letzte Stelle einer Seite in ein array und zeichne dann die Nächste Seite und so weiter.
3. Anhand des Arrays weiss ich die Anzahl der Seiten und welcher Abschnitt des Textes auf welche Seite kommt. Jetzt tue ich dann für jede Seite eine Printable zeichnen und ausdrucken.
Ich möchte jetzt nur wissen, wie oben geschildert ob ich die paint-Methode einer Textkomponente diese Zeichenarbeit machen lassen kann? Wenn ja würde ich mich auf einen Ansatz freuen. Wenn das nicht geht werde ich an meiner Klasse weiter tüfteln. Natürlich wenn jemand eine ganz andere Idee hat, wie man mit pure Java ohne extra Library mehrseitigen formatierten Text ausdrucken kann, der ist auch willkommen.
Hier ist ein Beispiel vom "Sun SDK 1.2 Printing API Tutorial" die eine Seite Text ohne Beachtung von Zeilenumbrüchen und Tabs und sonstiger Ausrichtung druckt.
http://java.sun.com/products/java-media/2D/forDevelopers/sdk12print.html#printable
Diese versuche ich so zu erweitern das man mehrseitig und mit Beachtung der Formatierungen drucken kann.
Vg Erdal
vor einiger Zeit habe ich mich eine Weile mit Drucken in Java beschäftigt gehabt und gesehen, dass man einfachen Text nicht ohne weiteres mit Java drucken kann. Auch das JPS seit Java 1.4 hilft da nicht großartig weiter, es gibt zwar Funktionen die Text drucken, diese werden aber in der Regel von den meisten Druckern nicht unterstüzt.
Es bleibt also nur noch die Möglichkeit über Graphics zu drucken. D.h. zuerst den Text dem Ausgabeformat entsprechend nach Bedarf den Text seitenweise aufteilen. Jeden Abschnitt dann einzeln auf eine Seite zu Zeichnen und drucken.
Genau das Zeichnen bereitet mir einige Mühe. Hierzu Bedarf es den Gebruach an Klassen wie LineBreakMeausurer, AttributedCharacterIterator, TextLayout und einigen anderen.
Einen Text zeichen mit Vernachlässigung von Tabs oder der Ausrichtung und anderen Formatierungen ist noch zu realisieren. Sollen diese auch beachtet werden, ist es um einiges komplizierter.
Wenn das zeichnen geklappt hat ist das Drucken an sich kein Thema.
Meine Frage hierzu wäre folgende: Ein JTextArea oder JTextPane oder JEditorPane haben doch alle die Methode paint. Tue ich diesen Text zu weisen und anzeigen zeichnen diese ja dann Text mit all ihren Formatierungen. Ich könnte diesen Komponenten dann auch die Größe des Ausgabeformats für das Drucken zuweisen.
Könnte ich dann nicht einfach die Daten aus der paint Mehtode einer dieser Textkomponenten weiterleiten und der paint Methode des Printable Interfaces übergeben?
Das Drucken einer JComponente gibt es natürlich auch in Java, dass meine ich aber nicht, denn so werden dann auch der Rahmen der Komponente oder der ScrollBalken mit ausgedruckt. Das möchte ich nicht.
Wäre das realisierbar wie ich das oben geschildert habe, oder führt kein Weg vorbei an LineBreakMeausurer, AttributetString, AttributedCharacterIterator, TextLayout, etc.?
Hinweis: Ich möchte keine Hilfslibrary für das Drucken verwenden.
Ich habe bisher folgende Klasse geschrieben in der ich Text auf eine JComponente zeichne. Zeilenumbrüche hatten schon funktioniert, bei den Tabs gibt es noch ein wenig Probleme. Ich möchte hier so vorgehen:
1. Ich zeichne den zu druckenden Text zunächst auf eine JComponente in Größe des Ausgabeformats.
2. Wenn der Text mehr als eine Seite in Anspruch nimmt, speichere ich die letzte Stelle einer Seite in ein array und zeichne dann die Nächste Seite und so weiter.
3. Anhand des Arrays weiss ich die Anzahl der Seiten und welcher Abschnitt des Textes auf welche Seite kommt. Jetzt tue ich dann für jede Seite eine Printable zeichnen und ausdrucken.
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.util.ArrayList;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Try extends JComponent {
// GUI //
JFrame frame = new JFrame();
Color col1 = new Color(255, 255, 205);
Color col2 = Color.MAGENTA;
Font f = new Font("SanSerif", Font.BOLD, 16);
// String - AttributedString - AttributedCharacterIterator -
// LineBreakMeasurer //
String text = "\nHallo Peter wie geht es dir?\nMir geht es gut.\nDas sind drei Tabs\teins\t\tzwei\t\t\tdrei!";
ArrayList list = new ArrayList();
AttributedString[] aStyledText;
AttributedCharacterIterator[] aParagraph;
LineBreakMeasurer[] aLineMeasurer;
// Hilfsvariablen //
int number;
int[] aParagraphStart;
int[] aParagraphEnd;
float as = 0, des = 0, lea = 0;
// - //
public static void main(String[] args) {
Try t = new Try();
}
public Try() {
// GUI //
frame.getContentPane().setBackground(col1);
frame.getContentPane().setForeground(col2);
frame.setSize(400, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setAlwaysOnTop(true);
frame.add(this);
// Text splitten - \n - \t //
for (int i = 0, j = 0; i < text.length(); i++) {
if (text.charAt(i) == '\n' | text.charAt(i) == '\t') {
if (i != j) {
list.add(text.substring(j, i));
}
list.add("" + text.charAt(i));
j = i + 1;
} else if (i == text.length() - 1) {
list.add(text.substring(j, i + 1));
}
}
number = list.size();
// AttributedString und AttributedCharacterIterator und
// LineBreakMeasurer erzeugen //
aStyledText = new AttributedString[number];
aParagraph = new AttributedCharacterIterator[number];
aParagraphStart = new int[number];
aParagraphEnd = new int[number];
aLineMeasurer = new LineBreakMeasurer[number];
for (int i = 0; i < number; i++) {
aStyledText[i] = new AttributedString(list.get(i).toString());
aStyledText[i].addAttribute(TextAttribute.FONT, f);
aParagraph[i] = aStyledText[i].getIterator();
aParagraphStart[i] = aParagraph[i].getBeginIndex();
aParagraphEnd[i] = aParagraph[i].getEndIndex();
}
// GUI anzeigen //
frame.setVisible(true);
}
public void paint(Graphics g) {
Graphics2D graphics2D = (Graphics2D) g;
Dimension size = this.getSize();
float formatWidth = (float) size.width;
float drawPosY = 0;
float drawPosX = 0;
for (int i = 0; i < number; i++) {
aLineMeasurer[i] = new LineBreakMeasurer(aParagraph[i], graphics2D
.getFontRenderContext());
aLineMeasurer[i].setPosition(aParagraphStart[i]);
}
for (int i = 0; i < number; i++) {
// Positionskorrektur für Tab //
if (list.get(i).equals("\t")) {
drawPosX = drawPosX + 20;
}
// - //
else {
while (aLineMeasurer[i].getPosition() < aParagraphEnd[i]) {
if (drawPosX > formatWidth) {
drawPosX = 0;
drawPosY += des + lea + as;
}
TextLayout layout = aLineMeasurer[i].nextLayout(formatWidth
- drawPosX);
as = layout.getAscent();
drawPosY += as;
// Positionskorrektur für Tab //
try {
if (!list.get(i - 1).equals("\t")) {
drawPosX = 0;
drawPosY += des + lea;
}
} catch (Exception e) {
}
// - //
layout.draw(graphics2D, drawPosX, drawPosY);
des = layout.getDescent();
lea = layout.getLeading();
drawPosY += des + lea;
drawPosX = drawPosX + layout.getAdvance();
}
// Positionskorrektur für Newline //
if (!list.get(i).equals("\n"))
drawPosY += -as - des - lea;
}
}
}
}
Ich möchte jetzt nur wissen, wie oben geschildert ob ich die paint-Methode einer Textkomponente diese Zeichenarbeit machen lassen kann? Wenn ja würde ich mich auf einen Ansatz freuen. Wenn das nicht geht werde ich an meiner Klasse weiter tüfteln. Natürlich wenn jemand eine ganz andere Idee hat, wie man mit pure Java ohne extra Library mehrseitigen formatierten Text ausdrucken kann, der ist auch willkommen.
Hier ist ein Beispiel vom "Sun SDK 1.2 Printing API Tutorial" die eine Seite Text ohne Beachtung von Zeilenumbrüchen und Tabs und sonstiger Ausrichtung druckt.
http://java.sun.com/products/java-media/2D/forDevelopers/sdk12print.html#printable
Diese versuche ich so zu erweitern das man mehrseitig und mit Beachtung der Formatierungen drucken kann.
Vg Erdal