【问题标题】:Swing component prints text differently than it displays itSwing 组件打印文本与显示文本不同
【发布时间】:2009-04-07 20:52:25
【问题描述】:

我正在打印一个包含文本的 Swing 组件。 Swing 组件在屏幕上很好地呈现文本,但是,当我打印它(到 .tif 文件)时,字符都被打碎了。这是为什么呢?

运行这段代码看看我的意思:

import javax.swing.*;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

public final class PrintingDemo2 implements Printable {

    private final JTextPane textPane;
    private static final String WORDS = "GOOD MORNING\u00AE AMERICA";
    private static final String TEXT = WORDS + '\n' + WORDS + '\n' + WORDS + '\n' + WORDS + '\n' + WORDS + '\n' + WORDS;

    public static void main(String[] args) {
        new PrintingDemo2();
    }

    public PrintingDemo2() {
        textPane = new JTextPane();
        textPane.setText(TEXT);
        final StyledDocument document = textPane.getStyledDocument();

        String[] fontFamilies = new String[]{"Tahoma", "SimSum", "MS Mincho", "Batang", "Arial", "Times New Roman"};
        for (int i = 0; i < fontFamilies.length; i++) {
            final MutableAttributeSet attributeSet = new SimpleAttributeSet();
            StyleConstants.setFontFamily(attributeSet, fontFamilies[i]);
            StyleConstants.setFontSize(attributeSet, 14);
            document.setParagraphAttributes(i * 22, 21, attributeSet, true);
        }

        final AbstractButton printContextButton = new JButton("Print Context");
        printContextButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                final PrinterJob job = PrinterJob.getPrinterJob();
                job.setPrintable(PrintingDemo2.this);
                try {
                    job.print();
                } catch (PrinterException ex) {
                    throw new RuntimeException("Printing Failed.", ex);
                }
            }
        });

        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
        contentPane.add(printContextButton);
        contentPane.add(new JScrollPane(textPane));
        frame.setSize(400, 200);

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.setVisible(true);
            }
        });
    }

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;

        RepaintManager mgr = RepaintManager.currentManager(textPane);
        mgr.setDoubleBufferingEnabled(false);
        final Graphics2D graphics2D = (Graphics2D) graphics;
        graphics2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
        textPane.paint(graphics);
        mgr.setDoubleBufferingEnabled(true);

        return Printable.PAGE_EXISTS;
    }
}

【问题讨论】:

    标签: java swing text printing


    【解决方案1】:

    您可以尝试对其进行光栅化(将其绘制为 300dpi 的 BufferedImage),然后打印该图像。笨拙,对性能不利(将巨大的光栅化文件发送到打印机而不是矢量数据),但至少您不会遇到字体问题。

    要对其进行光栅化,请创建一个 4.17x (300/72) 屏幕面板大小的 BufferedImage,并将其图形对象缩放到相同的数量,然后将面板绘制到缓冲图像的 Graphics2D 对象上。

    免责声明:这并不优雅,我知道。如果有人知道如何说服每个品牌和型号的打印机从 Java 打印过程中接收字体,请加入!

    【讨论】:

      【解决方案2】:

      检查打印的字体是否与您在屏幕表单中看到的字体相同。如果打印机正在替换一种字体,它的字距和提示可能与屏幕字体不同。

      首先,尝试将其缩减为仅一种字体。那里有很多活动部件。

      更新

      好的,我刚刚试了一下,它似乎工作正常,从 Mac OS/X 10.5.6 打印到 LaserJet 1300。

      我会尝试不同的打印设备;我打赌它发生在 Java 处理完数据之后。

      【讨论】:

      • 我实际上是将其打印到 .tif 文件,而不是真正的打印机。您是否尝试运行代码?
      • 我刚刚做了,我的物理打印机上的输出看起来还不错。
      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多