2012-02-09 2 views
1

Я оцениваю iText как PDFGenerator для приложения java swing. Предполагается, что выход будет в «Марати», который является местным индийским языком, похожим на хинди, но не таким же.itext Маратхи (indian) language display issue

Для целей оценки это текст, который я пытаюсь напечатать:

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

Вот исходный код:

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

Пожалуйста, проверьте следующее изображение для получения информации об ошибке:

enter image description here

Я думаю, что проблема может быть связана с кодировкой или чем-то еще, но я пока не могу понять это. Любая помощь будет оценена.

+0

Как насчет того, преобразуете ли каждый символ Маратхи в эквивалентный код Unicode, как в данном [пример] (http: //itextpdf.c ОМ/примеры/iia.php? ID = 201)? – ecle

ответ

2

Если не включен в одну из последних версий, iText не поддерживает систему письменности Деванагари.

В некоторых письменных системах между фактической буквой и правильным глифом нет взаимно однозначного отношения, но форма глифа отличается в зависимости от, например, окружающие глифы или его положение внутри слова. Чтобы правильно отобразить текст, программное обеспечение для настройки типа должно реализовать эти правила и AFAIK, iText реализует такие правила только для арабского.

+0

Спасибо за ответ jarnbjo. Знаете ли вы о создателе pdf, который поддерживает скрипт Деванагари? – Will

0

Следующие работали для меня.

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

    } 
} 
0

В IText не поддерживает местный язык, Преобразование текста в растровое изображение и установить в качестве image.Use ниже метод для преобразования:

Шаг 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);