5

私が書いたバッジ印刷プログラムが Windows で何年も正常に動作していたのに、MAC OS X では正しく印刷されないことが最近わかりました。私は Arial TrueType フォントを使用しています。プログラムは、適切なスケーリングなしで基本的なフォントを表示しているようです。私は intellij と jdk1.7.0_15 を使用しています。画面にはフォントが正しく表示されますが、プリンターや PDF に印刷すると表示されません。GraphicsEnvironment.getAvailableFontFamilyNames を使用してコンソールでプログラムで使用できるフォントを一覧表示すると、Arial がその 1 つとして一覧表示されます。フォント ファイルから直接フォントを読み込むと、正しく動作します。私はこれについて1日以上追跡してきましたが、何か提案をいただければ幸いです。これが私の問題を示すコードです...

/**
 *  DisplayPage.java
 */
import java.awt.*;
import java.awt.print.*;

public class DisplayPage extends ApplicationFrame {

    public static void main(String[] args) {
        // Create app and display draw page
        DisplayPage f = new DisplayPage();
        f.setTitle("PaintingAndStroking v1.0");
        f.setSize(850, 1100);
        f.center();
        f.setVisible(true);

        // Generate print job to print page
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(new PrintPage());
        boolean doPrint = pj.printDialog();
        if (doPrint) {
            try {
                pj.print();
            } catch (PrinterException e) {
                System.out.println(e);
            }
        }
    }

    /**
     * This is called by the windows event processor
     * @param g java.awt.Graphics context for display
     */
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        DrawPage.draw(g2d);
    }

}

/**
 *  ApplicationFrame.java
 */
import java.awt.*;
import java.awt.event.*;

public class ApplicationFrame extends Frame {

    public ApplicationFrame() { this("ApplicationFrame v1.0"); }

    public ApplicationFrame(String title) {
        super(title);
        setSize(850, 1100);
        center();

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
    }

    public void center() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = getSize();
        int x = (screenSize.width - frameSize.width) / 2;
        int y = (screenSize.height - frameSize.height) / 2;
        setLocation(x, y);
    }

}

/**
 * PrintPage.java
 */
import java.awt.*;
import java.awt.print.*;

public class PrintPage
        implements Printable {

    public int print(Graphics g, PageFormat pf, int page)
            throws PrinterException {

        // We have only one page
        if (page > 0) {
            return NO_SUCH_PAGE;
        }

        // Create Graphics2D context
        Graphics2D g2d = (Graphics2D)g;

        // Draw page
        DrawPage.draw(g2d);

        // Verify page exists
        return PAGE_EXISTS;
    }

}

/**
 * DrawPage.java
 */
import java.awt.*;

public class DrawPage {

    static public void draw(Graphics2D g2d) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        Font[] fonts = ge.getAllFonts();
        String[] fontFamilies = ge.getAvailableFontFamilyNames();
        for (int i=0; i<fontFamilies.length; i++) {
            System.out.println(fontFamilies[i]);
        }

        double x = 15, y = 50, w = 70, h = 70;
        GradientPaint gp = new GradientPaint(75, 75, Color.white,
                95, 95, Color.gray, true);

        // Fill with a gradient
        g2d.setPaint(gp);

        // Stroke with a solid color.
        g2d.setPaint(Color.black);
        g2d.setStroke(new BasicStroke(8));

        // Stroke with a gradient.
        g2d.setPaint(gp);

        // Draw text string
        String text = new String("This is a test...");
        g2d.setPaint(Color.black);
        g2d.setStroke(new BasicStroke(8));
        Font font = new Font("Arial", Font.PLAIN, 36);
        g2d.setFont(font);
        g2d.drawString("This is a test of Arial 36", 50, 100);

        font = new Font("Arial", Font.PLAIN, 72);
        g2d.setFont(font);
        g2d.drawString("This is a test of Arial 72", 50, 200);

    }
}
4

3 に答える 3

2

これについて、 Mac OS X with Java 7 で印刷が壊れているというブログ記事を書きました。これには、原因、バグ レポート、現在の回避策など、私が見つけたすべてが含まれています。短いバージョンは、Apple の Mac OS または Java 7 のバグのように見え、この記事の執筆時点ではまだ修正されていないというものです。

于 2013-06-22T05:26:09.583 に答える
1

この問題には回避策があります。フォント レンダリングの問題は、Graphics.drawString() の実装のバグによるものです。

これを回避するには、次の 2 つの方法があります。

  1. Graphics.drawString(... ) への呼び出しを次のような呼び出しに置き換えることができます

    • Graphics.drawGlyphVector(Graphics.getFont().createGlyphVector(Graphics.getFontRenderingContext(), String.toCharArray()))
  2. drawString() メソッドをオーバーライドし、上記の変換を実行して drawGlyphVector() に委譲する Graphics2D の独自の実装を提供できます。

drawGlyphVector() を使用すると、ネイティブ OS のレンダリングではなく、Java の AWT コードによってテキストがレンダリングされるため、視覚的なアーティファクトが発生し、パフォーマンスが低下する可能性があります。しかし、それは現在の状況よりもはるかに優れています。

于 2013-06-27T13:53:41.347 に答える
0

私はあなたと同じ問題を抱えていました。これらの手順を使用して、Java バージョンを 1.7 から 1.6 にダウングレードしました。

http://support.apple.com/kb/HT5559?viewlocale=en_US

これは最善の解決策ではありませんが、問題を解決することができます。

于 2013-04-05T02:29:21.003 に答える