我正在使用Devanagari Script印度国家语言的印地语创建Java应用程序。
我需要使用Java Printing API在印地语中打印一些文本。 但是,我遇到了一些问题,无法弄清楚出了什么问题!
以下是一些说明问题的截图。
当我在Java应用程序(使用Mangal字体)中向用户显示文本预览时:
但是当我使用Java Printing Support(使用Mangal字体)打印相同内容时: 这就是问题。请注意一些变音符号(matras)向右移动!
但是,MS Word似乎使用相同的Mangal字体正确打印:
当我在Java应用程序中使用Arial Unicode字体时,它也可以正常工作:
这就是为什么,我被迫使用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);
}
}