3

我正在尝试使用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();
  }
}
4

1 回答 1

3

欢迎来到地狱。停留片刻 :-)

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相距甚远。

你怎么能解决这个问题?尝试不同的字体,直到它起作用。我不知道使用 Java 打印 API 下载轮廓字体的任何方法。

或者使用PDFBox自己生成 PDF。

[编辑] Java 不是 DTP 系统。打印支持充其量是基本的。

如果您需要更多,请考虑使用 OpenOffice 将 RTF 转换为 PDF 以进行打印(请参阅是否有免费的方法将 RTF 转换为 PDF?如何在服务器模式下将 OpenOffice 用作多线程服务?)。

或者使用 OpenOffice 作为文本窗格

于 2010-11-02T15:21:40.593 回答