Drucker, Druckbarer Bereich unterschiedlich mit PrintDialog und ohne

Anton2k

Aktives Mitglied
Hallo,
ich hab ein Problem das ich einfach nicht verstehe. Ich hab ein kleines Kassenprogramm geschrieben. Funktioniert alles Super. Allerdings musste man bei jedem Druck den Drucker auswählen was ein unnötiger klick ist. Allerdings sofern ich den PrinterJob.printDialog() aufgerufen hab war alles OK


Suche ich mir aber den Drucker über dessen Namen und setzte ihn so:
PrinterJob.setPrintService(<PrintService>). kommt das raus


gut ich dachte mir setzte ich einfach mal das Papierformat indem ich eine neue Page mit dem richtigen Formaten anlege, das hat dann nur den 0 Punkt verschoben und sonst nichts. Ich hab weiterhin so etwa was wie ein großer Rand aussieht.


Der zwischen Versuch war nach dem zuweisen des Druckers mit PrinterJob.setPrintService(<PrintService>) noch mal den printDialog() aufzurufen -> auch alles OK.

Also irgend etwas ändert der Print Dialog was ich nicht verstehe oder über Google finden konnte (suche vermutlich nach dem falschen).

Auch die unterschiede beim Papier sind auffällig
OK sind das diese Werte (Btw. ziel ist A5)
ImageableX: 0.0
Imageable width: 419.52

Bei dem Monster Rand diese:
ImageableX: 72.0
Imageable width: 276.0094488188976
2x72+276=420 Also zumindest halbwegs richtig.


Hier noch etwas Code...alles unwichtige hab ich rausgelassen

Java:
public PrintIt (ArrayList<QuittungsEintrag> liste, ProgrammLogik pl){
		this.liste=liste;
		this.pl=pl;
		job = PrinterJob.getPrinterJob();
		try {
			job.setPrintService(pl.getPrintService("FreePDF"));
		} catch (PrinterException e1) {		}
		
		
		job.setPrintable(this);
//wie gesagt rufe ich den Code mit dem printDialog() hier auf klappt alles
//		if (job.printDialog() == true) {
			try {
				job.print();
				pl.saveFile();
			} catch (PrinterException e){};
//		}
	}

Java:
	public int print(Graphics gx, PageFormat pf, int page)
			throws PrinterException {
		
//Hier waren nur die Versuche mit dem Papierformat etwas zu erreichen
//		Paper tp=new Paper();
//		tp.setImageableArea(0, 0, 420, 594);
//		tp.setSize(420, 594);
//		
//		pf.setPaper(tp);
		
		if (page>0){
			return NO_SUCH_PAGE;
		}
		
		Graphics2D g=(Graphics2D)gx;
		g.translate(pf.getImageableX(),pf.getImageableY()); 
		
		printheader(g,0,0);
		
		printTabelle(g,0,130);
		
		printFooter(g,0,430);
		
		return PAGE_EXISTS;
		
		
	}


Ich hoffe jemand hat einen Tipp oder die Lösung. Vor allem verstehe ich nicht wieso es so unterschiedliche Ergebnisse sind durch den Druck Dialog.
 

Thallius

Top Contributor
Ich will Dich ja nicht entmutigen aber wenn Du es dann fertig hast, dann probierst Du es noch unter einem anderen Betriebssystem und hast wieder komplett andere Ergebnisse. Ich kotze auch gerade an genau dieser s*****e. Java und Drucken ist "Pain in the Ass"

Gruß

Claus
 

Anton2k

Aktives Mitglied
Hab eine Lösung gefunden..allerdings noch keine so richtig zufriedenstellende Erklärung warum es so funktioniert. Irgendwie scheint Java grundsätzlich 1inch Rand haben zu wollen, warum es aber in der print() Methode nicht mehr änderbar ist hab ich keine Ahnung. Evtl. kann es noch jemand erklären.
https://community.oracle.com/thread/1289979?start=0&tstart=0

PrinterJob.setPrintable mit dem PageFormat aufzurufen ist die Magie.
Java:
		PageFormat tpf=job.defaultPage();
		Paper tp=tpf.getPaper();
		tp.setImageableArea(0, 0, tp.getWidth(), tp.getHeight());
		tpf.setPaper(tp);
		job.setPrintable(this,tpf);

Java:
public PrintIt (ArrayList<QuittungsEintrag> liste, ProgrammLogik pl){
		this.liste=liste;
		this.pl=pl;
		job = PrinterJob.getPrinterJob();
		try {
			job.setPrintService(pl.getPrintService("FreePDF"));
			System.out.println("drucker ok");
		} catch (PrinterException e1) {		}

//Hier das ist die Magie wie es funktioniert		
		PageFormat tpf=job.defaultPage();
		Paper tp=tpf.getPaper();
		tp.setImageableArea(0, 0, tp.getWidth(), tp.getHeight());
		tpf.setPaper(tp);

		job.setPrintable(this,tpf);
//Magie Ende

//		if (job.printDialog() == true) {
			try {
				job.print();
				pl.saveFile();
			} catch (PrinterException e){};
//		}
	}
 

kaoZ

Top Contributor
Das ist ziemlich interessant da ich in naher Zukunft nämlich genau an gleicher Stelle ankommen werde, danke schonmal für die vorab info ;)
 

Anton2k

Aktives Mitglied
Btw. hatte es bis dato mit nem PDF Drucker getestet. Jetzt wo ich es auf dem richtigen Drucker hab laufen lassen haben die Ränger nicht gepasst. Bzw. waren diese wieder viel zu breit, der Drucker Schaft es fast Randlos.
Also musste ich den Rand mit
g.translate(pf.getImageableX()-Randbreite,pf.getImageableY()-Randbreite);
Noch manuell auf genau diesen Drucker anpassen. Auch hier keine Ahnung warum die Werte nicht direkt richtig sind. Aber zumindest funktioniert es erst mal...ein richtig gutes Gefühl hätte ich wenn ich wüsste wieso es so merkwürdig ist.
 

taro

Bekanntes Mitglied
Das wundert mich doch ein wenig, da du nichts anderes machst, als den (imaginären) Nullpunkt zu versetzen.

Was passiert denn, wenn die die ImageableArea und das Format "hart"

Java:
PageFormat tpf=job.defaultPage();
Paper tp=tpf.getPaper();
tp.setImageableArea(0, 0, 420, 595);
tpf.setPaper(tp);
job.setPrintable(this,tpf);

und dann, im Gegensatz zu deinem ersten Versuch, das Printable mit
Java:
job.setPrintable(this,tpf);
setzt?

Sollte das auch nicht helfen, noch einmal testweise das Papierformat vor der ImageableArea "hart" setzten.

Ich habe mit die letzten zwei Tage auch mit der Problematik rumärgern dürfen, kann aber mittlerweile keinen gravierenden Unterschied mehr zwischen PDF und der Ausgabe auf 3 verschiedenen Druckern feststellen. Leider kann ich erst am Montag nachschauen, wie ich es gelöst hatte, da (wie immer) alles auf Arbeit liegt.

Grüße
Sven
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Also bei mir ist der Stand der Dinge, dass er über PDF auf allen System gleich und richtig drückt, während er mit dem gleichen Netzwerk-Drucker von OS X und Windows aus benutzt einmal richtig drückt nd beim anderen nur das obere linke Viertel des Blattes nutzt. Mir Gehen langsam auch die Ideen aus.

Gruss

Claus
 
Zuletzt bearbeitet:

taro

Bekanntes Mitglied
@Thallius: Ich bin froh, mich darum in einem homogenen Windows-Umfeld nicht sorgen zu müssen.

Mir ist jedoch bekannt, dass wohl diverse Java-Versionen unter OSX Probleme bereiten - evtl. mit verschiedenen Versionen probieren?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
H Drucken auf Drucker Java Basics - Anfänger-Themen 8
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
J Drucker parameter ändern Java Basics - Anfänger-Themen 9
O Drucker: print methode wird 2 mal aufgerufen nachfrage Java Basics - Anfänger-Themen 4
I Drucker fragen, ob alles in ordnung Java Basics - Anfänger-Themen 3
J Wie drucke ich eine Komponente wie Kalender auf dem Drucker Java Basics - Anfänger-Themen 3
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
M Wie kann ich festlegen, dass ein Attribut maximal den Wert 0 erreicht, also nicht in den negativen Bereich fällt? Java Basics - Anfänger-Themen 4
S Wie kann ich den Bereich eines Integers begrenzen? Java Basics - Anfänger-Themen 2
C Zufallszahl + Werte bereich einstellen Java Basics - Anfänger-Themen 2
N Bereich Zufallszahl bestimmen (50 und 100 / 80 und 90) Java Basics - Anfänger-Themen 2
M Nim-Spiel geht in den negativen Bereich Java Basics - Anfänger-Themen 1
S Welchen Bereich sollte ich favorisieren? Java Basics - Anfänger-Themen 3
A Klassen Werte in den private Bereich übergeben Java Basics - Anfänger-Themen 5
T Datum mit einem Datums-Bereich vergleichen Java Basics - Anfänger-Themen 10
I Bild aus Bereich laden Java Basics - Anfänger-Themen 3
C Erste Schritte Bereich angeben bzw Fehler Suche Java Basics - Anfänger-Themen 6
M Random bereich und for schleife Java Basics - Anfänger-Themen 20
S Langtext auf bestimmten Bereich begrenzen Java Basics - Anfänger-Themen 3
D Wie den HTML-Teil des Chat Tutorials aus dem FAQ-Bereich starten? Java Basics - Anfänger-Themen 5
L Klickbarer Bereich in einem Kreis Java Basics - Anfänger-Themen 13
P Buffered Image, Bereich ausschneiden Java Basics - Anfänger-Themen 3
C Bereich festelgen bei Random Java Basics - Anfänger-Themen 9
D denkfehler, bereich verschieben awt Java Basics - Anfänger-Themen 3
hdi Random() : Bereich festelgen Java Basics - Anfänger-Themen 17
E Zahl auslesen und Bereich finden? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben