1

TextLayout クラスを使用して印刷しようとしています。いくつかの数学記号を印刷すると、奇妙な動作が発生します。

下の画像は、文字列「First + 2」と「First \u222A 2」を PDF ファイルに出力した結果を示しています。'union' 記号 (\u222A) が印刷されると、記号に続く文字が記号の前の文字を上書きするように見えます。

ここに画像の説明を入力

\u222A を含まない文字列と \u222A を含む別の文字列を出力するテスト コードを次に示します。

public class PrintTest {

public static void main(String[] args) {
    PrinterJob pj = PrinterJob.getPrinterJob();

    pj.setPrintable(new Printable() {
        public int print(Graphics g, PageFormat pf, int pageIndex) {
            if (pageIndex != 0) return NO_SUCH_PAGE;

            Graphics2D g2 = (Graphics2D) g;
            Font font = new Font("SansSerif", Font.PLAIN, 10);

            // Draw string with + char
            TextLayout layout = new TextLayout("First + 2", font, g2
                    .getFontRenderContext());
            layout.draw(g2, 40, 80);

            // Draw string with union character
            layout = new TextLayout("First \u222A 2", font, g2
                    .getFontRenderContext());
            layout.draw(g2, 40, 100);

            return PAGE_EXISTS;
        }
    });

    if (pj.printDialog()) {
        try {
            pj.print();
        } catch (PrinterException e) {
            System.out.println(e.getMessage());
        }
    }
}

}

私は Windows 7 & 8 で Java 1.7.0_17 を実行しており、PDF への印刷を含むいくつかのプリンターでこれをテストしました。すべてのテストで同じ問題が示されます。「ユニオン」、「交差点」、および「除外」シンボルを使用しても同じ結果が得られます。

私は本当にここで立ち往生しています。どんな助けでも大歓迎です。

更新: 論理フォントを使用すると問題が発生するようです。インストールされているすべての論理フォント (「Dialog」、「DialogInput」、「Monospaced」、「SansSerif」、および「Serif」) でテストしたところ、同じ問題が発生しました。これらの記号 (「Lucida Sans」および「Arial Unicode MS」) をサポートする物理フォントでテストしたところ、目的の出力が得られました。

ここに画像の説明を入力

私は論理フォントの使用に縛られていないので、これで差し迫った問題は解決します。

4

1 に答える 1

-1

実際、常に Unicode 文字を印刷しています。投稿のタイトルは、Unicode 以外のものを印刷していることを示唆しています。Java が文字列をエンコードする方法であるため、正しく印刷されるすべてのアルファベット文字は Unicode でエンコードされます。

したがって、「ユニオン」シンボルを印刷しようとしていますが、機能していません。印刷しているプリンターでサポートされているという証拠はありますか? これまでに試したどのプリンターでもサポートされていない可能性が非常に高いため、予期しない動作が発生します。これは、これを引き起こす可能性がある最も明白なことです。

于 2013-05-06T02:21:33.197 に答える