Компонент Swing печатает текст не так, как отображает его - PullRequest
1 голос
/ 08 апреля 2009

Я печатаю компонент 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;
    }
}

Ответы [ 2 ]

3 голосов
/ 13 мая 2009

Вы можете попробовать растеризовать его (нарисовать его в BufferedImage с разрешением 300 точек на дюйм), а затем распечатать это изображение. Хаки и плохо для производительности (огромный растровый файл отправляется на принтер вместо векторных данных), но по крайней мере у вас не будет проблем со шрифтами.

Чтобы растеризовать его, создайте BufferedImage размером 4,17x (300/72) вашей экранной панели и масштабируйте его графический объект до такой же величины, а затем нарисуйте панель на объект Graphics2D буферизованного изображения. 1003 *

Отказ от ответственности: это не элегантно, и я знаю это. Если кто-то знает, как убедить каждую марку и модель принтера в получении шрифтов от процесса печати Java, пожалуйста, присоединяйтесь!

0 голосов
/ 08 апреля 2009

Убедитесь, что напечатанный шрифт совпадает с шрифтом, который вы видите на экране. Если принтер заменяет шрифт, он, вероятно, выводится и намекает иначе, чем экранный шрифт.

Для начала попробуйте обрезать его до одного шрифта. Там много движущихся частей.

Обновление

Хорошо, я только что попробовал, и, кажется, все работает нормально, печать на LaserJet 1300 из Mac OS / X 10.5.6.

Я бы попробовал другое печатное устройство; Могу поспорить, что это происходит после того, как Java справится с данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...