2013-12-21 58 views
1

当我试图用阿拉伯语写作时,在写入android中的PDF文档时出现问题!如何在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?

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

回答

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

}

+0

许多谢谢:) :) ... –

+0

DynamicPDF是需要如果不作出或内部应用程序的 “概念证明”,以购买图书馆。 – Phil

+0

是的@Phil先生,其实我不明白你的意思是什么?我从给予链接下载它!免费! ...无需购买.. –