itext Marathi(印度语)语言显示问题

我正在评估iText作为java swing应用程序的PDFGenerator。 输出应该是“马拉地语”,这是一个类似于印地语的当地印度语,但不一样。

出于评估目的,这是我试图打印的文本:

मराठीग्रीटींग्स,मराठीशुभेच्छापत्रे

这是源代码:

package pdftest; import java.io.FileOutputStream; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.FontFactory; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfWriter; public class CPDFTest { private static String FILE = "c:/will/FirstPdf.pdf"; public static void main(String[] args) { try { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(FILE)); document.open(); addMetaData(document); addTitlePage(document); document.close(); } catch (Exception e) { } } private static void addMetaData(Document document) { document.addTitle("My first PDF"); } private static void addTitlePage(Document document) throws DocumentException { Paragraph preface = new Paragraph(); FontFactory.registerDirectory("C:\\WINDOWS\\Fonts"); Font marFont = FontFactory.getFont("arial unicode ms",BaseFont.IDENTITY_H,true); // Lets write a big header preface.add(new Paragraph("मराठी ग्रीटींग्स, मराठी शुभेच्छापत्रे", marFont)); document.add(preface); } } 

请查看以下图片以获取错误详细信息:

在此处输入图像描述

我认为问题可能与编码或其他东西,但我现在无法弄清楚。 任何帮助将不胜感激。

除非包含在最新版本中,否则iText不支持Devanāgarī书写系统。

在一些书写系统中,实际字母和正确字形之间没有一对一的关系,但字形形状根据例如周围的字形或其在单词内的位置而不同。 要正确呈现文本,类型设置软件需要实现这些规则和AFAIK,iText仅为阿拉伯语实现此类规则。

以下对我有用。

 import java.awt.Graphics2D; import java.io.*; import com.lowagie.text.*; public class Test { /** Path to the resulting PDF file. */ public static final String RESULT = "/home/test.pdf"; /** * Creates a PDF file: test.pdf * @param args no arguments needed */ public static void main(String[] args) throws DocumentException, IOException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT)); document.open(); int w = 400; int h = 150; PdfContentByte cb = writer.getDirectContent(); PdfTemplate tp = cb.createTemplate(w, h); Graphics2D g2 = tp.createGraphicsShapes(w, h); g2.drawString("मराठी ग्रीटींग्स, मराठी शुभेच्छापत्रे", 20, 100); g2.dispose(); cb.addTemplate(tp, 50, 400); document.close(); } } 

由于itext不支持本地语言,因此将文本转换为位图并设置为image.Use Below Method for conversion:

步骤1:

 public Bitmap textAsBitmap(String text, float textSize, float stroke, int color) { TextPaint paint = new TextPaint(); paint.setTextSize(textSize); paint.setAntiAlias(true); // paint.setTextAlign(Paint.Align.LEFT); paint.setColor(Color.BLACK); // paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeWidth(20f); paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); float baseline = (int) (-paint.ascent() + 3f); // ascent() is negative StaticLayout staticLayout = new StaticLayout(text, 0, text.length(), paint, 435, android.text.Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false); Bitmap image = Bitmap.createBitmap(staticLayout.getWidth(), staticLayout.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(image); canvas.drawColor(Color.WHITE); canvas.drawBitmap(image, 5, 5, null); staticLayout.draw(canvas); return image; } 

第2步:

 ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bitmap = Bitmap.createBitmap(Utils.textAsBitmap(""+yourString,14,2,200)); bitmap.compress(Bitmap.CompressFormat.JPEG, 100 , stream); Image myImg = Image.getInstance(stream.toByteArray()); document.add(myImg);