【问题标题】:Printing Mathematical Symbols in Java Gives Wrong Output在 Java 中打印数学符号会产生错误的输出
【发布时间】:2013-05-06 01:47:49
【问题描述】:

我正在尝试使用 TextLayout 类进行打印。当我打印一些数学符号时,我会出现奇怪的行为。

下图显示了将字符串“First + 2”和“First \u222A 2”打印到 PDF 文件的结果。当打印“联合”符号 (\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”)进行测试时,我得到了所需的输出。

这解决了我的直接问题,因为我不依赖于使用逻辑字体。

【问题讨论】:

    标签: java unicode printing


    【解决方案1】:

    实际上,您一直在打印 Unicode 字符;您的帖子标题表明您正在打印 Unicode 以外的内容。您正确打印的所有字母字符都以 Unicode 编码,因为 Java 就是这样编码字符串的。

    所以您尝试打印“Union”符号,但它不起作用。您有什么证据表明您正在打印的打印机支持它?您尝试过的任何打印机都可能不支持它,因此行为不可预测。这是最明显的原因。

    【讨论】:

    • 联合字符被打印,但它后面的字符被打印在它前面的字符上。
    • 好的,我同意这很奇怪,表示我不熟悉的问题。但是在寻求帮助时,不要将其他字符称为“非Unicode”,因为这是不正确的。您所拥有的是一个不太常用的 Unicode 字符,它导致看起来像立即回车(没有换行)。我不知道该怎么做。如果您有任何其他方法可以将此字符输出到此打印机,那么这些结果会很有趣。您可以尝试使用像 cutePdf 这样的特殊驱动程序打印到文件,然后看看会发生什么。祝你好运。
    • 感谢 rcook 的输入。我已经修改了标题和文本以反映您的 cmets。我还附上了我在写入 Nitro PDF Creator 时得到的输出图像。
    • 不是答案;应该作为评论发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多