Как правильно распечатать печатную копию JTextPane с содержимым «text / rtf»? - PullRequest
3 голосов
/ 27 сентября 2010

Я пытаюсь распечатать простой текст в формате RTF на лазерном принтере , используя JTextPane.

Результат выглядит отлично на программном PDF-принтере (FreePDF XP), но текст не имеет надлежащего пространства между отформатированными частями при печати на реальном принтере.

Редактировать: Я загрузил пример вывода (внизу отсканированная распечатка)

Пример http://ompldr.org/vNXo4Zg/output.png

Мне кажется, что существует проблема с объектом Graphics, начинающим рисовать отдельные части кода RTF.Как будто он не мог понять, где правильно разместить каждую часть (координату X).

Должен ли я обеспечить какой-то перевод системы координат?

Использовался простой тестовый код:

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();
  }
}

1 Ответ

3 голосов
/ 02 ноября 2010

Добро пожаловать в ад. Останься немного: -)

Java использует сложный код для размещения текста на принтере (поэтому он не отправляет print "Text" with a bold font, но select Times-Bold, Move the cursor to x,y, Draw the letter "T", Move to x2,y, нарисуйте букву "e", ..`

Ваша проблема в том, что у Java и вашего принтера разные представления о ширине символов. Если вы внимательно посмотрите, буквы жирного шрифта Text немного раздвинуты.

Как вы можете решить это? Попробуйте другой шрифт, пока он не заработает. Я не знаю способа загрузки контурных шрифтов с помощью API печати Java.

Или используйте PDFBox для создания PDF самостоятельно.

[РЕДАКТИРОВАТЬ] Java не является системой DTP. Поддержка печати в лучшем случае зачаточна.

Если вам нужно больше, рассмотрите возможность использования OpenOffice для преобразования RTF в PDF для печати (см. Существует ли бесплатный способ преобразования RTF в PDF? и Как использовать OpenOffice в режиме сервера как многопоточный сервис? ).

или использовать OpenOffice в качестве текстовой панели .

...