Java中的Unicode Devnagari脚本的打印问题

我正在使用梵文脚本的印度语国家语言创建Java应用程序。

我需要使用Java Printing API以印地文语言打印一些文本。 但是,我面临一些问题,无法弄清楚什么是错的!

这里有一些截图可以说明问题。

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


但是当我使用Java打印支持(使用Mangal字体)打印时: 在这里输入图像描述 这就是问题。 注意一些变音符号(matras)向右移动!


但是,MS Word似乎使用相同的Mangal字体正确地打印它: 在这里输入图像描述


当我在Java应用程序中使用Arial Unicode字体时,它也可以正常工作: 在这里输入图像描述

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

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


更新:这是代码:

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

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);
    }

}
链接地址: http://www.djcxy.com/p/88677.html

上一篇: Printing Issue for Unicode Devnagari Script in Java

下一篇: Unable to show Hindi(Unicode) characters in BIRT generated PDF