繁体   English   中英

用Java打印数学符号会产生错误的输出

[英]Printing Mathematical Symbols in Java Gives Wrong Output

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

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

在此处输入图片说明

因为我不依赖于使用逻辑字体,所以这为我解决了眼前的问题。

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

因此,您尝试打印“联盟”符号,但它不起作用。 您有哪些证据证明您要在其上进行打印的打印机支持它? 您尝试使用的任何打印机很可能不支持该功能,因此行为无法预测。 这是最明显的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM