itext Проблема отображения маратхи (индийского) языка - PullRequest
1 голос
/ 09 февраля 2012

Я оцениваю iText как PDFGenerator для Java-приложения Swing.Выходные данные должны быть в «маратхи», который является местным индийским языком, похожим на хинди, но не таким же.

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

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

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

0 голосов
/ 16 июня 2016

Поскольку itext не поддерживает местный язык, преобразуйте текст в растровое изображение и установите его в качестве изображения. Используйте приведенный ниже метод преобразования:

Шаг 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);
0 голосов
/ 29 мая 2013

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

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

    }
}
...