用Java编写Unicode Devnagari脚本的问题

时间:2015-04-09 08:12:06

标签: swing unicode printing fonts hindi

我正在使用Devanagari Script印度国家语言的印地语创建Java应用程序。

我需要使用Java Printing API在印地语中打印一些文本。 但是,我遇到了一些问题,无法弄清楚出了什么问题!

以下是一些说明问题的截图。

当我在Java应用程序(使用Mangal字体)中向用户显示文本预览时:

enter image description here


但是当我使用Java Printing Support(使用Mangal字体)打印相同内容时: enter image description here 这就是问题。请注意一些变音符号(matras)向右移动!


但是,MS Word似乎使用相同的Mangal字体正确打印: enter image description here


当我在Java应用程序中使用Arial Unicode字体时,它也可以正常工作: enter image description here

这就是为什么,我被迫使用Arial Unicode字体!但是,与200GB大小的Mangal字体相比,它的大小为22MB。这使我的构建(jar)的大小非常大。应用这么大,不能用于生产。

我甚至不知道从哪里开始了解这个问题的原因。打印Devnagari Unicode文本时转移的变音符号问题


更新 这是代码:

(确保两个字体文件都在类路径上!这两种字体在Windows上都可用,名为“Arial Unicode MS Regular”和“Mangal”。)

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.Graphics2D;
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;
import java.io.IOException;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class DevnagariTest {

    private static Font createFont(String url) throws FontFormatException, IOException {
        return Font.createFont(
                    Font.TRUETYPE_FONT,
                    DevnagariTest.class.getClassLoader().getResourceAsStream(url))
                .deriveFont(30f);
    }

    private static JLabel getLabel(String text, Font font) {
        JLabel label = new JLabel(text);
        label.setFont(font);
        return label;
    }

    public static void main(String[] args) throws FontFormatException, IOException {
        Font mangal = createFont("mangal.ttf");
        Font arial = createFont("ARIALUNI.TTF");

        JFrame frame = new JFrame();

        final Box box = Box.createVerticalBox();
        box.add(getLabel("गणेश वार्ड रमेश सुरेश पप्पू पृथ्वी", mangal));
        box.add(getLabel("गणेश वार्ड रमेश सुरेश पप्पू पृथ्वी", arial));

        JButton print = new JButton("Print");
        print.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                PrinterJob job = PrinterJob.getPrinterJob();
                job.setPrintable(new Printable() {

                    @Override
                    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
                            throws PrinterException {
                        if (pageIndex > 0) {
                            return NO_SUCH_PAGE;
                        }

                        Graphics2D g2 = (Graphics2D) graphics;
                        g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
                        box.printAll(g2);
                        g2.dispose();

                        return PAGE_EXISTS;
                    }

                });
                try {
                    job.print();
                } catch (PrinterException ex) {
                    ex.printStackTrace();
                }
            }

        });

        frame.add(box, BorderLayout.CENTER);
        frame.add(print, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

}

0 个答案:

没有答案