2D-Grafik JTextArea drucken bringt mieses Ergebnis

flatfrank

Mitglied
Hallo zusammen,
ich hänge hier seit geraumer Zeit an einem Problem. Ich habe eine Art Textverarbeitung erstellt. Aus verschiedenen Tabellen einer Datenbank werden Textfelder einer GUI befüllt.
Die Textfelder sollen dann entsprechend zusammengesetzt werden und ausgedruckt. Das mit dem Ausdrucken u.s.w. funktioniert auch hervorragend.
Das größte Problem bereitet mir eine JTextArea, die ich erst zeichnen lasse und dann mit drawImage() in den Ausdruck einbinde.

Java:
scrollPaneText.setBounds(23, 335, 520, 200);
       contentPane.add(scrollPaneText);
       Haupttext = new JTextArea();
       Haupttext.setLineWrap(true);
       Haupttext.setWrapStyleWord(true);
       scrollPaneText.setViewportView(Haupttext);
//...
bufferedHaupttext = new BufferedImage(Haupttext.getWidth(), Haupttext.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
         Haupttext.paint(bufferedHaupttext.getGraphics());
         g.drawImage(bufferedHaupttext, 30, 390, Haupttext);
Angezeigt wir der Text nun, die Qualität ist allerdings mies.
Ich habe auch andere Optionen wie "TYPE_BYTE_BINARY" ausprobiert, dann wird das Schriftbild zwar besser, aber die Farbe geht mehr ins graue, statt schwarz (ist aber immer noch verschwommen).
Gibt es eine Möglichkeit die paint() - Funktion mit einer höheren Auflösung auszuführen oder ergibt es Sinn die einzelnen Strings in JasperReports zu überführen?

LG Frank
 
Willkommen im Club der "Java und Drucken" geschädigten.

Ich habe vor langer Zeit auch mal das Problem gehabt und habe es nicht gelöst bekommen fertige Swing Container in akzeptabeler Qualität zu drucken.
Ich habe daraufhin einfach alles mit drawString etc selbst in ein BufferedImage gezeichnet und das in 6x Größe wie es eigentlich sein musste und dann in ein PDF gescaled.

Der Code dazu:

Java:
PdfWriter writer=null;
            Document document=null;
            try
            {
                this.pdfFileName=this.fileName+File.separator+"check.pdf"; //$NON-NLS-1$
                document=new Document(PageSize.A4,leftBorder,rightBorder,topBorder,bottomBorder);
                writer=PdfWriter.getInstance(document, new FileOutputStream(this.pdfFileName));
                document.open();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }   

            printSheet.pageWidth=(int)writer.getPageSize().getWidth()*scale; // Mit dem Wert scale = 6 hatte ich das beste Performance/Aussehen Ergebnis
            printSheet.pageHeight=(int)writer.getPageSize().getHeight()*scale;

            int pageCount=printSheet.template.pageList.size();
               
            for(int i=0;i<pageCount;i++)
            {
                BufferedImage image =  new BufferedImage(printSheet.pageWidth,printSheet.pageHeight, BufferedImage.TYPE_INT_ARGB);
                printSheet.graphics = image.createGraphics();

                if(i!=0)
                    document.newPage();

                printSheet.graphics.setBackground(Color.WHITE);
                printSheet.createSheet(i,1,pageCount); // hier wird das image gezeichnet
                com.itextpdf.text.Image pdfImage;
                pdfImage = com.itextpdf.text.Image.getInstance(image , null);
                pdfImage.scaleToFit(writer.getPageSize().getWidth()-(leftBorder+rightBorder), writer.getPageSize().getHeight()-(topBorder+bottomBorder));
                document.add(pdfImage);
                printSheet.graphics.dispose();
            }

            document.close();
            writer.close();

Gruß

Claus
 
Ich hatte auch schon versucht, das Textfeld zeilenweise (String.split("\n") auszulesen aber es wird kein "\n" eingesetzt an den Stellen, bei denen das Textfeld selbst die Zeilenumbrüche erzeugt.
Hinzu kommt der Vorteil beim Zeichnen, dass die Formatierung übernommen wird (fett, kursiv),
 

Zurück
Oben