iText: Wie stellt man die Höhe eines Strings fest?

Status
Nicht offen für weitere Antworten.

Grizzly

Top Contributor
Ich arbeite gerade an der Erstellung eines Mini-Report-Generators, der die iText Bibliothek in der aktuellen Version 1.3 benutzt.

Nun habe ich ein kleines Problem: Ich sollte die Höhe eines Strings bestimmen können. Aber irgendwie funktioniert da nicht richtig. Ich benutze hierfür getAscentPoint(String text, float fontSize) und getDescentPoint(String text, float fontSize). Ein kleiner Auschnitt:
Code:
public class PrintGraphics {
	/* Die Schriftart. */
	private BaseFont font;
	/* Die Schriftgröße. */
	private int fontSize;
	
	public void getStringHeight(final String text) {
		return this.font.getAscentPoint(text, this.fontSize) - this.font.getDescentPoint(text, this.fontSize);
	}
}

getAscentPoint gibt - soweit ich das verstanden habe - den Abstand von der Grundlinie der Schriftart bis zum oberen Rand des höchsten Zeichens (höchsten Zeichens nach von der Grundlinie nach oben) zurück. getDescentPoint gibt den Abstand von der Grundlinie der Schriftart bis zum untersten Rand der höchsten Zeichens (höchsten Zeichens nach von der Grundlinie nach unten) zurück.

Jetzt ist es jedoch so, das getDescentPoint immer negative Werte ergibt. Das liegt wohl an der Berechnung von Grundlinie nach unten. Deswegen ziehe ich diese ab. Außerdem habe ich in den Werten bisher kein System erkennen können. So gibt bwps. getAscentPoint für den Text "hg" einen anderen Rückgabewert, wie für "hgh". Die Höhe müsste hier jedoch die gleiche sein. Oder zieh der irgendwie ein Mittel über alle Höhen? Gleiches gilt für getDescentPoint.

Kann mir jemand helfen? Wie berechnet man die wirkliche Höhe eines Strings? Oder sind die Funktionen in iText buggy? :bahnhof:
 
L-ectron-X hat gesagt.:
Macht man denn sowas nicht mit FontMetrics?
Ich arbeite direkt mit der Klasse PdfContentByte. Und da gibt es nur BaseFont. 😉

Ich weiss, dass man sich von PdfContentByte auch ein Graphics2D Objekt geben lassen kann und dass das dann mit der Klasse Font arbeitet. Leider scheint die Graphics2D Subklasse, die mir PdfContentByte liefert, etwas buggy zu sein. Da kommt es dann vor, wenn man das Layout berechnet und deswegen die Methoden aus der Klasse Graphics2D benutzt, die ausgeworfene PDF Datei nachher im Eimer ist. 🙁
 
Okay, ich habe das Problem - mehr oder weniger - gelöst:

iText geht von einer Auflösung von 72 dpi aus. Sprich die Zeichenfläche auf die PDF Datei hat diese Auflösung. Die Schriftgröße gibt man normalerweise in Punkten an. Diese Punkte beziehen sich ebenfalls auf eine Auflösung von 72 dpi. Man kann dann also direkt die Schriftgröße zum Berechnen verwenden. 🙂

Allerdings sollte man für den nötigen Zeilenabstand noch ein bisschen dazu geben. Sonst kleben die Buchstaben der einzelnen Zeilen doch etwas stark aufeinander. 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben