How to correctly print out a hard copy of a JTextPane with "text/rtf" content?
Asked Answered
W

1

3

I'm trying to print out some simple RTF-formatted text to a laser printer using a JTextPane.

The result looks fine on a software PDF printer (FreePDF XP), but the text doesn't have proper space between it's formatted parts when print to a real printer.

Edit: I have uploaded an example output (The bottom is the scanned printout)

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

It seems to me that there is a problem with the Graphics object starting to paint the indiviual parts of the RTF code. As if it couldn't figure out where to correctly put each part (the X coordinate).

Do I have to provide some kind of coordinate system translation?

The simple test code used:

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();
  }
}
Wahhabi answered 27/9, 2010 at 14:14 Comment(0)
P
3

Welcome to hell. Stay a while :-)

Java uses some complex code to layout the text for the printer (so it doesn't send print "Text" with a bold font but select Times-Bold, Move the cursor to x,y, Draw the letter "T", Move to x2,y, Draw the letter "e", ...`

Your problem is that Java and your printer have different ideas how wide the characters are. If you look closely, the letters of the bold face text Text are bit wide apart.

How can you solve this? Try a different font until it works. I don't know any way to download outline fonts with the Java print API.

Or use PDFBox to generate PDF yourself.

[EDIT] Java is not a DTP system. The printing support is rudimentary at best.

If you need more, consider using OpenOffice to convert from RTF to PDF for printing (see Is there a free way to convert RTF to PDF? and How can I use OpenOffice in server mode as a multithreaded service?).

Or use OpenOffice as text pane.

Perspective answered 2/11, 2010 at 15:21 Comment(2)
My problem is that the user can choose the font that is used and that the users expect that it is printed the same way that it is shown in the application.Fecundate
I had an issue which is closely related to yours: #8745336. I had to write my own print component. Relying on Swing components seems to be hard way as they contain bugs like this: bugs.sun.com/bugdatabase/view_bug.do?bug_id=6784397Corliss

© 2022 - 2024 — McMap. All rights reserved.