如何在Android PDF文档中支持阿拉伯语?

时间:2013-12-21 10:55:02

标签: android

当我尝试用阿拉伯语编写时,我在android中编写PDF文档时遇到问题!

我的功能如下:

public void createPDF() {
    Document doc = new Document();
     try {
            FileOutputStream fOut = null;

            String Fnampdf="testfile"  + ".pdf";
            File sdCard = Environment.getExternalStorageDirectory();
            File directory = new File (sdCard.getAbsolutePath() + "/newfolder1");
            directory.mkdirs();
            File file = new File(directory, Fnampdf);

            fOut = new FileOutputStream(file);
            PdfWriter.getInstance(doc, fOut);

            //open the document
            doc.open();

            Paragraph p1 = new Paragraph("Hi! I am generating my first PDF using DroidText");
            Font paraFont= new Font(Font.COURIER);
            p1.setAlignment(Paragraph.ALIGN_CENTER);
            p1.setFont(paraFont);

             //add paragraph to document    
             doc.add(p1);

             Paragraph p2 = new Paragraph("This is an example of a simple paragraph");
             Font paraFont2= new Font(Font.COURIER,14.0f,Color.GREEN);
             p2.setAlignment(Paragraph.ALIGN_CENTER);
             p2.setFont(paraFont2);

             doc.add(p2);

             //set footer
             Phrase footerText = new Phrase("This is an example of a footer");
             HeaderFooter pdfFooter = new HeaderFooter(footerText, false);
             doc.setFooter(pdfFooter);


     } catch (DocumentException de) {
             Log.e("PDFCreator", "DocumentException:" + de);
     } catch (IOException e) {
             Log.e("PDFCreator", "ioException:" + e);
     } 
     finally {
             doc.close();
     }

}      

但是当我尝试用阿拉伯语写作时,它不适用于我,如:

Paragraph p1 = new Paragraph("برنامج كشف حساب .. ");

如何在Pdf中支持阿拉伯语?

任何帮助将不胜感激! 谢谢,

1 个答案:

答案 0 :(得分:2)

使用名为DynamicPDF.jar的jar文件可以解决您的问题,您可以从此链接下载它:https://www.assembla.com/code/zapisyUG/subversion/nodes/zapisWAR/WebContent/WEB-INF/lib/DynamicPDF.jar?_format=raw&rev=133

下载并添加库后,您需要使用另一个类“Farsi.java”,其中包含一个实用功能,能够以正确的方式编码阿拉伯语句子。

但是,使用字体(.ttf)文件以正确的方式识别和映射阿拉伯字符非常重要。因此,您需要下载所需的字体文件“tahoma.ttf”,该文件可以通过以下链接找到并下载:
http://www.fontsupply.com/fonts/T/Tahoma.html

总而言之,您需要执行以下操作: 1-下载DynamicPDF.jar,然后将其添加到项目中。 2-创建一个名为“Farsi.java”的新java文件,然后复制下面的代码。 3-下载“tahoma.ttf”字体文件,然后将其添加到“/ storage / sdcard0”(您的智能手机)上。 4-最后,复制以下代码以在onCreate函数中运行。

我希望一切顺利。

public class DynamicPDFHelloWorld extends Activity {
    private static String FILE = Environment.getExternalStorageDirectory()
            + "/HelloWorld.pdf";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // Create a document and set it'ss properties
    Document objDocument = new Document();
    objDocument.setCreator("DynamicPDFHelloWorld.java");
    objDocument.setAuthor("Your Name");
    objDocument.setTitle("Hello World");


    String convertedText="";

    TrueTypeFont trueTypeFont = new TrueTypeFont(Environment.getExternalStorageDirectory()
            + "/tahoma.ttf" );

    // Create a page to add to the document
    Page objPage = new Page(PageSize.LETTER, PageOrientation.PORTRAIT,
            54.0f);

    convertedText=Farsi.Convert("برنامج كشف حساب .. ");
    // Create a Label to add to the page

    Label objLabel = new Label(convertedText, 0, 0, 504, 100,
            trueTypeFont, 18, TextAlign.RIGHT);
    objLabel.setRightToLeft(true);

    // Add label to page
    objPage.getElements().add(objLabel);

    // Add page to document
    objDocument.getPages().add(objPage);

    try {
        // Outputs the document to file
        objDocument.draw(FILE);

        Toast.makeText(this, "File has been written to :" + FILE,
                Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Toast.makeText(this,
                "Error, unable to write to file\n" + e.getMessage(),
                Toast.LENGTH_LONG).show();
    }
}

}

import android.content.Context;
import android.graphics.Typeface;

public final class Farsi {

    public static boolean isFarsiConversionNeeded = true;

    private final static String szLamAndAlef = Character
            .toString((char) 0xfedf)
            + Character.toString((char) 0xfe8e); // Lam + Alef

private final static String szLamStickAndAlef = Character
        .toString((char) 0xfee0)
        + Character.toString((char) 0xfe8e); // Lam (Sticky !!!)+
                                                // Alef

private final static String szLa = Character.toString((char) 0xfefb); // La
private final static String szLaStick = Character.toString((char) 0xfefc); // La
                                                                            // (Sticky!!!)

private final static String szLamAndAlefWoosim = Character
        .toString((char) 0xe1)
        + Character.toString((char) 0xbb); // Lam + Alef

private final static String szLamStickAndAlefWoosim = Character
        .toString((char) 0x90)
        + Character.toString((char) 0xbb); // Lam (Sticky !!!)+
                                            // Alef

private final static String szLaWoosim = Character.toString((char) 0xd9); // La
private final static String szLaStickWoosim = Character
        .toString((char) 0xd9); // La

// (Sticky!!!)

private static final class struc {
    public char character;
    public char endGlyph;
    public char iniGlyph;
    public char midGlyph;
    public char isoGlyph;

    public struc(char Character, char EndGlyph, char IniGlyph,
            char MidGlyph, char IsoGlyph) {
        character = Character;
        endGlyph = EndGlyph;
        iniGlyph = IniGlyph;
        midGlyph = MidGlyph;
        isoGlyph = IsoGlyph;
    }
}

static struc[] arrStruc = {
        new struc((char) 0x630, (char) 0xfeac, (char) 0xfeab,
                (char) 0xfeac, (char) 0xfeab),
        new struc((char) 0x62f, (char) 0xfeaa, (char) 0xfea9,
                (char) 0xfeaa, (char) 0xfea9),
        new struc((char) 0x62c, (char) 0xfe9e, (char) 0xfe9f,
                (char) 0xfea0, (char) 0xfe9d),
        new struc((char) 0x62d, (char) 0xfea2, (char) 0xfea3,
                (char) 0xfea4, (char) 0xfea1),
        new struc((char) 0x62e, (char) 0xfea6, (char) 0xfea7,
                (char) 0xfea8, (char) 0xfea5),
        new struc((char) 0x647, (char) 0xfeea, (char) 0xfeeb,
                (char) 0xfeec, (char) 0xfee9),
        new struc((char) 0x639, (char) 0xfeca, (char) 0xfecb,
                (char) 0xfecc, (char) 0xfec9),
        new struc((char) 0x63a, (char) 0xfece, (char) 0xfecf,
                (char) 0xfed0, (char) 0xfecd),
        new struc((char) 0x641, (char) 0xfed2, (char) 0xfed3,
                (char) 0xfed4, (char) 0xfed1),
        new struc((char) 0x642, (char) 0xfed6, (char) 0xfed7,
                (char) 0xfed8, (char) 0xfed5),
        new struc((char) 0x62b, (char) 0xfe9a, (char) 0xfe9b,
                (char) 0xfe9c, (char) 0xfe99),
        new struc((char) 0x635, (char) 0xfeba, (char) 0xfebb,
                (char) 0xfebc, (char) 0xfeb9),
        new struc((char) 0x636, (char) 0xfebe, (char) 0xfebf,
                (char) 0xfec0, (char) 0xfebd),
        new struc((char) 0x637, (char) 0xfec2, (char) 0xfec3,
                (char) 0xfec4, (char) 0xfec1),
        new struc((char) 0x643, (char) 0xfeda, (char) 0xfedb,
                (char) 0xfedc, (char) 0xfed9),
        new struc((char) 0x645, (char) 0xfee2, (char) 0xfee3,
                (char) 0xfee4, (char) 0xfee1),
        new struc((char) 0x646, (char) 0xfee6, (char) 0xfee7,
                (char) 0xfee8, (char) 0xfee5),
        new struc((char) 0x62a, (char) 0xfe96, (char) 0xfe97,
                (char) 0xfe98, (char) 0xfe95),
        new struc((char) 0x627, (char) 0xfe8e, (char) 0xfe8d,
                (char) 0xfe8e, (char) 0xfe8d),
        new struc((char) 0x644, (char) 0xfede, (char) 0xfedf,
                (char) 0xfee0, (char) 0xfedd),
        new struc((char) 0x628, (char) 0xfe90, (char) 0xfe91,
                (char) 0xfe92, (char) 0xfe8f),
        new struc((char) 0x64a, (char) 0xfef2, (char) 0xfef3,
                (char) 0xfef4, (char) 0xfef1),
        new struc((char) 0x633, (char) 0xfeb2, (char) 0xfeb3,
                (char) 0xfeb4, (char) 0xfeb1),
        new struc((char) 0x634, (char) 0xfeb6, (char) 0xfeb7,
                (char) 0xfeb8, (char) 0xfeb5),
        new struc((char) 0x638, (char) 0xfec6, (char) 0xfec7,
                (char) 0xfec8, (char) 0xfec5),
        new struc((char) 0x632, (char) 0xfeb0, (char) 0xfeaf,
                (char) 0xfeb0, (char) 0xfeaf),
        new struc((char) 0x648, (char) 0xfeee, (char) 0xfeed,
                (char) 0xfeee, (char) 0xfeed),
        new struc((char) 0x629, (char) 0xfe94, (char) 0xfe93,
                (char) 0xfe93, (char) 0xfe93),
        new struc((char) 0x649, (char) 0xfef0, (char) 0xfeef,
                (char) 0xfef0, (char) 0xfeef),
        new struc((char) 0x631, (char) 0xfeae, (char) 0xfead,
                (char) 0xfeae, (char) 0xfead),
        new struc((char) 0x624, (char) 0xfe86, (char) 0xfe85,
                (char) 0xfe86, (char) 0xfe85),
        new struc((char) 0x621, (char) 0xfe80, (char) 0xfe80,
                (char) 0xfe80, (char) 0xfe80),
        new struc((char) 0x626, (char) 0xfe8a, (char) 0xfe8b,
                (char) 0xfe8c, (char) 0xfe89),
        new struc((char) 0x623, (char) 0xfe84, (char) 0xfe83,
                (char) 0xfe84, (char) 0xfe83),
        new struc((char) 0x622, (char) 0xfe82, (char) 0xfe81,
                (char) 0xfe82, (char) 0xfe81),
        new struc((char) 0x625, (char) 0xfe88, (char) 0xfe87,
                (char) 0xfe88, (char) 0xfe87),
        new struc((char) 0x67e, (char) 0xfb57, (char) 0xfb58,
                (char) 0xfb59, (char) 0xfb56), // peh
        new struc((char) 0x686, (char) 0xfb7b, (char) 0xfb7c,
                (char) 0xfb7d, (char) 0xfb7a), // cheh
        new struc((char) 0x698, (char) 0xfb8b, (char) 0xfb8a,
                (char) 0xfb8b, (char) 0xfb8a), // jeh
        new struc((char) 0x6a9, (char) 0xfb8f, (char) 0xfb90,
                (char) 0xfb91, (char) 0xfb8e), // keheh
        new struc((char) 0x6af, (char) 0xfb93, (char) 0xfb94,
                (char) 0xfb95, (char) 0xfb92), // gaf
        // new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfbfe,
        // (char) 0xfbff, (char) 0xfbfc), // Farsi yeh
        new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfef3,
                (char) 0xfef4, (char) 0xfbfc), // Arabic yeh
        new struc((char) 0x6c0, (char) 0xfba5, (char) 0xfba4,
                (char) 0xfba5, (char) 0xfba4) // heh with yeh
};

static struc[] arrStrucWoosim = {
        new struc((char) 0x630, (char) 0xb5, (char) 0x82, (char) 0xb5,
                (char) 0x82),
        new struc((char) 0x62f, (char) 0xb4, (char) 0x81, (char) 0xb4,
                (char) 0x81),
        new struc((char) 0x62c, (char) 0x9b, (char) 0xb1, (char) 0xf9,
                (char) 0xbf),
        new struc((char) 0x62d, (char) 0x9c, (char) 0xb2, (char) 0xfa,
                (char) 0xc0),
        new struc((char) 0x62e, (char) 0x9d, (char) 0xb3, (char) 0xfe,
                (char) 0xc1),
        new struc((char) 0x647, (char) 0xac, (char) 0xe4, (char) 0x93,
                (char) 0xd5),
        new struc((char) 0x639, (char) 0xc9, (char) 0xd3, (char) 0x8b,
                (char) 0xa4),
        new struc((char) 0x63a, (char) 0xca, (char) 0xdd, (char) 0x8c,
                (char) 0xa5),
        new struc((char) 0x641, (char) 0xa6, (char) 0xde, (char) 0x8d,
                (char) 0xcc),
        new struc((char) 0x642, (char) 0xa7, (char) 0xdf, (char) 0x8e,
                (char) 0xce),
        new struc((char) 0x62b, (char) 0xbd, (char) 0xaf, (char) 0xea,
                (char) 0x99),
        new struc((char) 0x635, (char) 0xc4, (char) 0xc8, (char) 0x87,
                (char) 0xa0),
        new struc((char) 0x636, (char) 0xc5, (char) 0xcb, (char) 0x88,
                (char) 0xa1),
        new struc((char) 0x637, (char) 0xc6, (char) 0xcd, (char) 0xcd,
                (char) 0xa2),
        new struc((char) 0x643, (char) 0xcf, (char) 0xe0, (char) 0x8f,
                (char) 0xa8),
        new struc((char) 0x645, (char) 0xd2, (char) 0xe2, (char) 0x91,
                (char) 0xaa),
        new struc((char) 0x646, (char) 0xd4, (char) 0xe3, (char) 0x92,
                (char) 0xab),
        new struc((char) 0x62a, (char) 0xbd, (char) 0xaf, (char) 0xea,
                (char) 0x99),
        new struc((char) 0x627, (char) 0xbb, (char) 0x80, (char) 0xbb,
                (char) 0x80),
        new struc((char) 0x644, (char) 0xd1, (char) 0xe1, (char) 0x90,
                (char) 0xa9),
        new struc((char) 0x628, (char) 0xbc, (char) 0xae, (char) 0xe9,
                (char) 0x98),
        new struc((char) 0x64a, (char) 0xdc, (char) 0xe6, (char) 0x95,
                (char) 0xdc),
        new struc((char) 0x633, (char) 0xc2, (char) 0xb8, (char) 0xb8,
                (char) 0x9e),
        new struc((char) 0x634, (char) 0xc3, (char) 0xb9, (char) 0xb9,
                (char) 0x9f),
        new struc((char) 0x638, (char) 0xc7, (char) 0xcd, (char) 0xcd,
                (char) 0xc7),
        new struc((char) 0x632, (char) 0xb7, (char) 0xb7, (char) 0xb7,
                (char) 0xb7),
        new struc((char) 0x648, (char) 0x94, (char) 0x94, (char) 0x94,
                (char) 0x94),
        new struc((char) 0x629, (char) 0xda, (char) 0xda, (char) 0xda,
                (char) 0xda),
        new struc((char) 0x649, (char) 0xdc, (char) 0xe6, (char) 0x95,
                (char) 0xdc),
        new struc((char) 0x631, (char) 0xb6, (char) 0xb6, (char) 0xb6,
                (char) 0xb6),
        new struc((char) 0x624, (char) 0xe7, (char) 0xe7, (char) 0xe7,
                (char) 0xe7),
        new struc((char) 0x621, (char) 0xba, (char) 0xba, (char) 0xba,
                (char) 0xba),
        new struc((char) 0x626, (char) 0xd7, (char) 0xe8, (char) 0x97,
                (char) 0xd7),
        new struc((char) 0x623, (char) 0x80, (char) 0x80, (char) 0x80,
                (char) 0x80),
        new struc((char) 0x622, (char) 0x80, (char) 0x80, (char) 0x80,
                (char) 0x80),
        new struc((char) 0x625, (char) 0x80, (char) 0x80, (char) 0x80,
                (char) 0x80),
        new struc((char) 0x67e, (char) 0xbc, (char) 0xae, (char) 0xe9,
                (char) 0x98), // peh
        new struc((char) 0x686, (char) 0x9b, (char) 0xb1, (char) 0xf9,
                (char) 0xbf), // cheh
        new struc((char) 0x698, (char) 0xb7, (char) 0xb7, (char) 0xb7,
                (char) 0xb7), // jeh
        new struc((char) 0x6a9, (char) 0xcf, (char) 0xe0, (char) 0x8f,
                (char) 0xa8), // keheh
        new struc((char) 0x6af, (char) 0xcf, (char) 0xe0, (char) 0x8f,
                (char) 0xa8), // gaf
        new struc((char) 0x6cc, (char) 0xdc, (char) 0xe6, (char) 0x95,
                (char) 0xdc), // yeh
        new struc((char) 0x6c0, (char) 0xac, (char) 0xe4, (char) 0x93,
                (char) 0xd5) // heh with yeh
};

private static final int N_DISTINCT_CHARACTERS = 43;

private static final String ArabicReverse(String s) {
    try {
        String Out = "", rev;
        s = MakeReverse(s);
        char[] chs = new char[s.length()];
        chs = s.toCharArray();
        int i = 0;
        while (i < s.length()) {
            if ((chs[i] >= '0' && chs[i] <= '9')) // isDigit(s[i]) ?
            {
                rev = "";
                while (i < s.length()
                        && ((chs[i] >= '0' && chs[i] <= '9') || chs[i] == '/')) // isDigit(s[i])
                                                                                // ?
                {
                    rev = rev + chs[i];
                    ++i;
                }
                rev = MakeReverse(rev);
                Out = Out + rev;
            } else {
                Out = Out + chs[i];
                ++i;
            }
        }
        s = Out;
    } catch (Exception ex) {
        // throw new Exception(
        // "An exception has occurred in ArabicReverse function.\\n"
        // + ex.getMessage());
    }
    return s;
}

private static final boolean isFromTheSet1(/* WCHAR */char ch) {
    char[] theSet1 = new char[] { (char) 0x62c, (char) 0x62d, (char) 0x62e,
            (char) 0x647, (char) 0x639, (char) 0x63a, (char) 0x641,
            (char) 0x642, (char) 0x62b, (char) 0x635, (char) 0x636,
            (char) 0x637, (char) 0x643, (char) 0x645, (char) 0x646,
            (char) 0x62a, (char) 0x644, (char) 0x628, (char) 0x64a,
            (char) 0x633, (char) 0x634, (char) 0x638, (char) 0x67e,
            (char) 0x686, (char) 0x6a9, (char) 0x6af, (char) 0x6cc,
            (char) 0x626 };
    int i = 0;
    while (i < 28) {
        if (ch == theSet1[i])
            return true;
        ++i;
    }
    return false;
}

private static final boolean isFromTheSet2(/* WCHAR */char ch) {
    char[] theSet2 = new char[] { (char) 0x627, (char) 0x623, (char) 0x625,
            (char) 0x622, (char) 0x62f, (char) 0x630, (char) 0x631,
            (char) 0x632, (char) 0x648, (char) 0x624, (char) 0x629,
            (char) 0x649, (char) 0x698, (char) 0x6c0 };
    int i = 0;
    while (i < 14) {
        if (ch == theSet2[i])
            return true;
        ++i;
    }
    return false;
}

private static final String MakeReverse(String text) {
    String Result = "";
    char[] Ctext = new char[text.length()];
    Ctext = text.toCharArray();
    for (int i = (text.length()) - 1; i >= 0; i--) {
        Result += Ctext[i];
    }
    return Result;
}

public static final String ConvertBackToRealFarsi(String In) {

    if (!isFarsiConversionNeeded) {
        return In;
    }

    String strOut = "";
    StringBuilder strBuilder = new StringBuilder("");
    int i = 0;
    int j = 0;
    char[] chIn = new char[In.length()];
    chIn = In.toCharArray();

    for (i = 0; i < In.length(); i++) {
        boolean found = false;
        for (j = 0; j < arrStruc.length; j++) {
            if (chIn[i] == arrStruc[j].midGlyph ||
                    chIn[i] == arrStruc[j].iniGlyph ||
                    chIn[i] == arrStruc[j].endGlyph ||
                    chIn[i] == arrStruc[j].isoGlyph) {
                strBuilder.append(arrStruc[j].character);
                found = true;
                break;
            }
        }
        if (!found)
            strBuilder.append(chIn[i]);
    }

    strOut = strBuilder.toString();
strOut = strOut.replace(szLa, "لا");
strOut = strOut.replace(szLaStick, "لا");

    return strOut;
}

public static final String Convert(String In) {

    if (!isFarsiConversionNeeded) {
        return In;
    }

    if (In == null) {
        return "";
    }

    boolean linkBefore, linkAfter;
    String Out = In;
    char[] chOut = new char[Out.length()];
    chOut = Out.toCharArray();
    char[] chIn = new char[In.length()];
    chIn = In.toCharArray();

    for (int i = 0; i < In.length(); i++) {
        /* WCHAR */
        char ch = chIn[i];
        if ((ch >= (char) 0x0621 && ch <= (char) 0x064a)
                || (ch == (char) 0x067e) || (ch == (char) 0x0686)
                || (ch == (char) 0x0698) || (ch == (char) 0x06a9)
                || (ch == (char) 0x06af) || (ch == (char) 0x06cc)
                || (ch == (char) 0x06c0)) // is a Farsi character?
        {
            int idx = 0;
            while (idx < N_DISTINCT_CHARACTERS) {
                if (arrStruc[idx].character == chIn[i])
                    break;
                ++idx;
            }

            if (i == In.length() - 1)
                linkAfter = false;
            else
                linkAfter = (isFromTheSet1(chIn[i + 1]) || isFromTheSet2(chIn[i + 1]));
            if (i == 0)
                linkBefore = false;
            else
                linkBefore = isFromTheSet1(chIn[i - 1]);
            if (idx < N_DISTINCT_CHARACTERS) {
                if (linkBefore && linkAfter)
                    chOut[i] = arrStruc[idx].midGlyph;
                if (linkBefore && !linkAfter)
                    chOut[i] = arrStruc[idx].endGlyph;
                if (!linkBefore && linkAfter)
                    chOut[i] = arrStruc[idx].iniGlyph;
                if (!linkBefore && !linkAfter)
                    chOut[i] = arrStruc[idx].isoGlyph;
            } else {
                chOut[i] = chIn[i];
            }
        } else {
            chOut[i] = chIn[i];
        }
    }
    Out = "";
    for (int j = 0; j < chOut.length; j++)
        Out += chOut[j];
    // Out = ArabicReverse(Out);

    Out = Out.replace((char) 0x200c, ' '); // Change NO SPACE to SPACE

    Out = Out.replace(szLamAndAlef, szLa); // Join 'Lam' and 'Alef' and
                                            // make 'La'
    Out = Out.replace(szLamStickAndAlef, szLaStick); // Join 'Lam Stick'
                                                        // and 'Alef'
                                                        // and make 'La
                                                        // Stick'

    return reorderWords(Out);

}

private final static String reorderWords(String strIn)
{

    final int ST_RTL = 0;
    final int ST_LTR = 1;

    String strOut = "";
    String prevWord = "";
    int state = ST_RTL;
    char[] arr = strIn.toCharArray();
    int i = 0;
    while (i < arr.length) {
        if (charIsLTR(arr[i]) && state != ST_LTR)
        {
            // state changed to LTR
            state = ST_LTR;
            strOut = prevWord + strOut;
            prevWord = "";
            prevWord += arr[i];
        }
        else if (charIsRTL(arr[i]) && state != ST_RTL)
        {
            // state changed to RTL
            state = ST_RTL;
            strOut = prevWord + strOut;
            prevWord = "";
            prevWord += arr[i];
        }
        else
        {
            // state is not changed
            prevWord += arr[i];
        }
        i++;
    }

    strOut = prevWord + strOut;

    return strOut;

}

private final static boolean charIsLTR(char ch)
{
    return (ch >= (char) 65 & ch <= (char) 122)
            |
            Character.isDigit(ch);
}

private final static boolean charIsRTL(char ch)
{
    return ch >= (char) 0x0621;
}   

private static Typeface typeface;

public static final Typeface GetFarsiFont(Context context) {
    if (typeface == null) {
        typeface = Typeface.createFromAsset(context.getAssets(),
                // "DroidSansFallback.ttf");
                "TAHOMA.TTF");
    }
    return typeface;
}

}