2010-09-27 5 views
3

J'essaie d'imprimer du texte au format RTF simple sur une imprimante laser en utilisant un JTextPane.Comment imprimer correctement une copie papier d'un JTextPane avec du contenu "text/rtf"?

Le résultat semble correct sur une imprimante PDF logicielle (FreePDF XP), mais le texte ne dispose pas d'un espace approprié entre ses parties formatées lors de l'impression sur une imprimante réelle.

Edit: J'ai téléchargé un exemple de sortie (Le fond est l'impression numérisée)

Example http://ompldr.org/vNXo4Zg/output.png

Il me semble qu'il ya un problème avec l'objet Graphics commence à peindre les parties indiviual du code RTF. Comme si elle ne pouvait pas savoir où placer correctement chaque partie (la coordonnée X). Dois-je fournir une sorte de traduction de système de coordonnées?

Le code de test simple utilisé:

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.print.PageFormat; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import javax.swing.JFrame; 
import javax.swing.JTextPane; 

class MyTextComp extends JTextPane implements Printable 
{ 
    public MyTextComp() 
    { 
    setContentType("text/rtf"); 
    setText("{\\rtf1 HelloWorld! \\par {\\i This} is formatted {\\b Text}.}"); 
    } 

    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    } 

    public int print(Graphics g, PageFormat pf, int pIndex) 
    { 
    if(pIndex > 0) 
     return Printable.NO_SUCH_PAGE; 

    Graphics2D g2d = (Graphics2D)g; 
    g2d.translate(pf.getImageableX(), pf.getImageableY()); 

    /* Now print the window and its visible contents */ 
    printAll(g); 
    return Printable.PAGE_EXISTS; 
    } 
} 

public class TextCompPrint extends JFrame 
{ 
    public static void main(String[] args) throws PrinterException 
    { 
    TextCompPrint myFrame = new TextCompPrint(); 
    MyTextComp myComp = new MyTextComp(); 

    myFrame.add(myComp, BorderLayout.CENTER); 
    myFrame.setSize(200, 200); 
    myFrame.setVisible(true); 

    PrinterJob pj = PrinterJob.getPrinterJob(); 
    pj.setPrintable(myComp); 
    pj.print(); 
    } 
} 

Répondre

3

Bienvenue en enfer. Restez un moment :-)

Java utilise un code complexe pour la mise en page du texte de l'imprimante (il n'envoie pas print "Text" with a bold font mais select Times-Bold, Move the cursor to x,y, Draw the letter "T", Move to x2,y, Dessiner la lettre « e », ... `

votre problème est que Java et votre imprimante ont des idées différentes la largeur des caractères sont. Si vous regardez attentivement, les lettres du gras texte du visage Text sont peu écartés.

Comment pouvez-vous résoudre ce problème? Essayez une police différente jusqu'à ce que cela fonctionne.Je ne connais aucun moyen de télécharger des polices contour avec l'API d'impression Java

Ou utilisez PDFBox pour générer des PDF vous-même.

[EDIT] Java n'est pas un système de PAO. Le support d'impression est au mieux rudimentaire.

Si vous avez besoin de plus, pensez à utiliser OpenOffice pour convertir du format RTF au format PDF pour l'impression (voir Is there a free way to convert RTF to PDF? et How can I use OpenOffice in server mode as a multithreaded service?).

ou use OpenOffice as text pane.

+0

Mon problème est que l'utilisateur peut choisir la police qui est utilisée et que les utilisateurs s'attendent à ce qu'il soit imprimé de la même manière qu'il est montré dans l'application. –

+0

S'il vous plaît voir mes modifications. –

+1

J'ai eu un problème qui est étroitement liée à la vôtre: http://stackoverflow.com/questions/8744836/java-print-api-space-character-incorrectly-printed-using-monospaced-courier-n. Je devais écrire mon propre composant d'impression. S'appuyer sur les composants Swing semble être difficile car ils contiennent des bugs comme celui-ci: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6784397 –

Questions connexes