# Swing to iText - Problem mit Schriftarten und Schriftgrößen



## iflow (5. Mrz 2008)

Guten Abend!

Ich hoffe, ich bin zu diesem Problem im richtigen Forum, es handelt sich nämlich um iText.

Mein Problem ist, dass wenn ich z.B.: in einem jLabel einen Text mit der Formatierung: Courier, Font.Plain, Schriftgröße: 12 habe und daraus ein PDF generiere, dann stimmt die Größe, Schriftart im "Java Fenster" nicht mit der Formatierung im vom iText generierten PDF überein.

mfg iflow

Code zum PDF generieren:

```
float pixelZuPunkte = 3508 / 841.9f; //Adobe arbeitet mit Punkten, Java mit Pixel(Umrechnung)

schriftPosX = (float) (ec.getDescriptionLocation().getX() * prop) / pixelZuPunkte;
schriftPosY = (float) (841.9f - (ec.getDescriptionLocation().getY() * prop) / pixelZuPunkte);
cb.beginText();
cb.setColorFill(Color.BLACK);
cb.setFontAndSize(bf, ec.getDescriptionFontSize() / pixelZuPunkte);
cb.showTextAligned(PdfContentByte.ALIGN_LEFT, 
ec.getConnectionDescription().getText(), schriftPosX, schriftPosY, 0);
cb.endText();
cb.stroke();
```


----------



## Wildcard (5. Mrz 2008)

Was meinst du mit Java arbeitet mit Pixel? Schriftgrößen werden üblicherweise mit pt Angegeben.


----------



## iflow (5. Mrz 2008)

Wildcard hat gesagt.:
			
		

> Was meinst du mit Java arbeitet mit Pixel? Schriftgrößen werden üblicherweise mit pt Angegeben.


Auch in Java, also auch in den jLabels?


----------



## Wildcard (5. Mrz 2008)

Die Font Size wird in Java ebenfalls in pt  (ca.1/72 Zoll) angegeben.
Ob es dann auf dem Bildschirm auch so passt hängt noch von der GraphicsConfiguration ab, also wie die Größe auf das Device übertragen wird.
Das bei dieser Transformation auch bestimmte Mainstream Betriebssysteme wie Windows Probleme haben, siehst du daran, das in Windows die Schrift bei höheren Auflösungen kleiner wird.


----------



## iflow (5. Mrz 2008)

oh danke für die Informationen! 

Gibt es vl eine gute Seite die mir mehr Informationen liefert über die Größe von einem Java Point oder kann ich davon ausgehen das z.B ein Java pt gleich groß ist wie in OpenOffice Writer oder MS Word, sprich hängt es vom System ab oder hat Java seine eigenen pt Definitionen?

mfg


----------



## Wildcard (5. Mrz 2008)

Wo schaut man zuerst? Richtig, in der API  :wink: 
http://java.sun.com/javase/6/docs/api/java/awt/Font.html#getSize()


----------



## iflow (5. Mrz 2008)

Wildcard hat gesagt.:
			
		

> Wo schaut man zuerst? Richtig, in der API  :wink:
> http://java.sun.com/javase/6/docs/api/java/awt/Font.html#getSize()



Herzlichen Dank, da hätt ich jetz selber drauf kommen müssen :?


----------



## iflow (9. Mrz 2008)

So ich übernehme jetzt die Schriftart bzw. auch Schriftgröße von Java, wenn ich mit iText ein PDF erstelle, hier der Teilcode dazu:


```
BaseFont bf = BaseFont.createFont(BaseFont.COURIER, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
float schriftPosX = (float) (ec.getDescriptionLocation().getX() * prop) / pixelZuPunkte;
float schriftPosY = (float) (841.9f - ec.getDescriptionFontSize() - 
(ec.getDescriptionLocation().getY() * prop) / pixelZuPunkte);

cb.beginText();
cb.setColorFill(Color.BLACK);
cb.setFontAndSize(bf, ec.getDescriptionFontSize());
System.out.println(""+ec.getDescriptionFontSize());
cb.showTextAligned(PdfContentByte.ALIGN_LEFT, 
ec.getConnectionDescription().getText(), schriftPosX, schriftPosY, 0);
cb.endText();
```

Doch leider wird dann im PDF eine andere Schriftgröße dargestellt (meistens genau um *4 mehr* als in Java):
*Gibt es vl eine Konstante mit der ich von Java nach PDF die Schriftgröße umrechnen kann?*







mfg iflow


----------



## Wildcard (9. Mrz 2008)

Warum zeichnest du das nicht einfach ins PDF anstatt den Text usw. händisch einzufügen?


----------



## iflow (9. Mrz 2008)

Wildcard hat gesagt.:
			
		

> Warum zeichnest du das nicht einfach ins PDF anstatt den Text usw. händisch einzufügen?


Es gibt ja 2 Möglichkeiten um das PDF zu erzeugen, entweder die Objekte direkt reinschreiben oder mittels com.lowagie.text.pdf.PdfContentByte (so wie ich es mache) es selbst reinzuschreiben. Das muss ich machen weil z.B. die Rechtecke alle in einer Liste abgespeichert sind. Ein Rechteck ist aber ein jPanel Objekt mit eigener Beschriftung, Titel, Hintergrund- u. Vordergrundfarbe, Schriftart usw. und das muss ich doch selbst reinschreiben, bzw. hab ich keine Möglichkeit gefunden um das automatisch reinzuzeichnen.

Nur stellt sich jetzt die Frage, warum die Schriftgröße von Java zu PDF nicht übereinstimmt.


----------



## Wildcard (9. Mrz 2008)

Hohl dir ein Graphics Objekt von iText und lass dein Panel darauf zeichnen -> fertig


----------



## iflow (12. Mrz 2008)

Wildcard hat gesagt.:
			
		

> Hohl dir ein Graphics Objekt von iText und lass dein Panel darauf zeichnen -> fertig


Okay habe mit einem graphics2d objekt die Strings (Beschriftung in der vorigen Abbildung) rausgezeichnet -> Es hat sich nichts geändert, die Schriftgröße ist trotzdem um 4 punkte größer als im Java Programm.


----------



## Wildcard (12. Mrz 2008)

Ich kann dir nur sagen, das in unserer Anwendung das komplette Panel ins PDF gezeichnet wird und die Schriftgröße identisch ist.
Irgendwas musst falsch machen.


----------



## iflow (14. Mrz 2008)

Hmm findes es einfach nicht raus, wie ich ein gesamtes JPanel ins PDF schreiben kann 
Kannst du mir den Code oder eine Seite mit Code zeigen, bitte, danke


----------



## Wildcard (14. Mrz 2008)

iflow hat gesagt.:
			
		

> Okay habe mit einem graphics2d objekt die Strings (Beschriftung in der vorigen Abbildung) rausgezeichnet -> Es hat sich nichts geändert, die Schriftgröße ist trotzdem um 4 punkte größer als im Java Programm.


Wenn du bereits ein Graphics Objekt von iText hast, was spricht dann gegen myPanel.paint(iTextGraphics) ?


----------



## iflow (26. Mrz 2008)

Soda das funktioniert, aber die Qualität im PDF Dokument ist dann extrem schlecht, es sieht so aus als würde man einen Screenshot in Windows machen und das ganze in Paint einfügen -> also sehr verpixelt.

Gibt es eine Graphics Methode um die Qualität der Ausgabe (über die paint Methode) zu verbessern?


----------



## Wildcard (26. Mrz 2008)

Was zeichnest du und wie zeichnest du?


----------



## iflow (31. Mrz 2008)

Sry für die späte Antwort:
Ich zeichne ein ganzes JPanel mit vielen Kind - JPanels:

```
PdfContentByte cs = writer.getDirectContent();
        java.awt.Graphics2D g2 = cs.createGraphicsShapes(2480f, 3508f);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        TWM.p_mainPanel.paint(g2);
        g2.dispose();
```


----------



## Wildcard (31. Mrz 2008)

Schalte vorher das DoubleBuffering aus, sonst wird wohl nur ein Bild gezeichnet.


----------



## iflow (4. Apr 2008)

Wildcard hat gesagt.:
			
		

> Schalte vorher das DoubleBuffering aus, sonst wird wohl nur ein Bild gezeichnet.



Versteh ich nicht.
Habe mich erst in das DoubleBuffering einlesen müssen, aber warum soll ich das deaktivieren? 
Als ich es ausprobiert habe, ging gar nichts mehr


----------



## Wildcard (4. Apr 2008)

Wenn du DoubleBuffering verwendest, wird alles in ein Bild gezeichnet und das Bild dann ins PDF gezeichnet. Das ist nicht das selbe wie geometrische Formen und Schrift in das PDF zu zeichnen. Letzteres ist nämlich skalierbar und hat eine wesentlich bessere Qualität beim Drucken.


----------



## iflow (17. Apr 2008)

Soda es funktioniert alles jetzt recht gut, habe es so gelöst:


```
public static void drawPdf(MainPanel mp) throws DocumentException, BadElementException, IOException {
        for (int i = 0; i < mp.getSites(); i++) {   //Solange Seiten vorhanden sind
            Graphics2D g2d = cb.createGraphicsShapes(PageSize.A4.getWidth() ,PageSize.A4.getHeight());
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            int verschiebenY = (i * mp.getSiteheight()) + (i * mp.getSeitenTrenner());
            mp.setDoubleBuffered(false);    
            AffineTransform matrix = new AffineTransform();
            matrix.scale(0.6, 0.6);     //Streckung (Verkleinerung)
            matrix.translate(0, verschiebenY * -1); //Verschiebung auf der Y-Achse
            g2d.transform(matrix);      //Verschiebungen und Streckungen auf das Grafikobjekt anwenden
            mp.paint(g2d);              //Gesamte Workflow Zeichenflaeche Grafik erstellen          
            g2d.dispose();              //Grafik Objekt freigeben
            cb.stroke();                //Pdf Seite beschreiben
            if(i != mp.getSites()) {    //Wenn die letzte Seite noch nicht erreicht ist
                document.newPage();     //Neue Seite erzeugen
            }
        }
    }
```

Warum ich das Bild genau um 0.6 mal kleiner machen muss weiß ich nicht, dass habe ich hingeraten, aber es passt anscheinend ganz genau


----------

