2011-07-28 12 views
6

Tringuje, aby wygenerować plik PDF w mojej aplikacji na Androida. Używam iText i generuje PDF, ale wyświetlane są tylko litery w języku angielskim. Znalazłem przykładowy kod dla iText współpracujący z unicode. Próbowałem ten przykładowy kod w prostej aplikacji java comsole i działało dobrze. Jest to kod:Litery cyrylicy nie wyświetlają się w formacie PDF wygenerowanym za pomocą iText w Androidzie

* --> Copyright 2001 by Paulo Soares, Bruno Lowagie <-- 
public class Chap0903 { 
    public static void main(String[] args) { 
     System.out.println("Chapter 9 example 3: True Types (embedded)"); 
     Document document1 = new Document(); 

     try { 
     PdfWriter.getInstance(document1, 
      new FileOutputStream("c:\\Chap0903.pdf")); 

     BaseFont bfComic = BaseFont.createFont("assets/fonts/comic.ttf", 
      BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     Font font1 = new Font(bfComic, 12); 
     String text1 = "This is the quite popular True Type font 'Comic'."; 
     String text2 = "Some greek characters: \u0393\u0394\u03b6"; 
     String text3 = "Some cyrillic characters: \u0418\u044f"; 

     document1.open(); 
     document1.add(new Paragraph(text1,font1)); 
     document1.add(new Paragraph(text2,font1)); 
     document1.add(new Paragraph(text3,font1)); 
     document1.close(); 
    } 
    catch(DocumentException de) { 
     document1.close(); 
     System.err.println(de.getMessage()); 
    } 
    catch(IOException ioe) { 
     document1.close(); 
     System.err.println(ioe.getMessage()); 
    } 
    } 
} 

Kiedy ten kod dostosowany do android aktywności, to przestał działać:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    String root = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    Document document1 = new Document(); 

    try { 
     PdfWriter.getInstance(document1, 
      new FileOutputStream(root+"/Chap0903.pdf")); 

     BaseFont bfComic = BaseFont.createFont("assets/fonts/comic.ttf", 
      BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
     Font font1 = new Font(bfComic, 12); 
     String text1 = "This is the quite popular True Type font 'Comic'."; 
     String text2 = "Some greek characters: \u0393\u0394\u03b6"; 
     String text3 = "Some cyrillic characters: \u0418\u044f"; 

     document1.open(); 
     document1.add(new Paragraph(text1,font1)); 
     document1.add(new Paragraph(text2,font1)); 
     document1.add(new Paragraph(text3,font1)); 
     document1.close(); 

     Intent intent = new Intent(); 
     setResult(RESULT_OK, intent);  
    } 
    catch(DocumentException de) { 
     document1.close(); 
     Intent intent = new Intent(); 
     setResult(RESULT_CANCELED, intent);   
     System.err.println(de.getMessage()); 
    } 
    catch(IOException ioe) { 
     document1.close(); 
     Intent intent = new Intent(); 
     setResult(RESULT_CANCELED, intent); 
     System.err.println(ioe.getMessage()); 
     Task.mes(ioe.getMessage()); 
    } finally {} 
} 

Problem nie jest z lokalizacji comic.ttf plików bo gdybym zmienić ścieżkę na niewłaściwą, otrzymuję wyjątek IOException. Problem nie jest z wytwarzaniem samego ponieważ jeśli mogę użyć tego kodu bez font1, generuje plik PDF na karcie SD w formacie PDF, ale to jest bez znaków Unicode:

document1.add(new Paragraph(text1)); 
document1.add(new Paragraph(text2)); 
document1.add(new Paragraph(text3)); 

Co może być problemem?

+1

Cóż, znalazłem rozwiązanie. Poprawny kod to: BaseFont bfComic = BaseFont.createFont ("assets/fonts/comic.ttf", "Cp1251", BaseFont.EMBEDDED); – Georgi

+2

Jeśli znalazłeś rozwiązanie, możesz odpowiedzieć na własne pytanie (zamiast dodawać je jako komentarz). – Ian

+0

Czy działa z jedną ze standardowych czcionek? Nie znajduję "assets/fonts/comic.ttf" –

Odpowiedz

4

użyłem

BaseFont bfComic = BaseFont.createFont("/system/fonts/Comic.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

i to działa. Powinieneś sprawdzić katalog czcionek na swoim urządzeniu z Androidem.

Dla chińskich znaków użyłem

BaseFont bfSans = BaseFont.createFont("/system/fonts/DroidSansFallback.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

Upewnij podać czcionkę awaryjnej w catch() bloku, na przykład:

font = new Font(Font.FontFamily.HELVETICA, 24, Font.NORMAL, BaseColor.BLACK); 

Proszę dać mi znać, jeśli nie jest to standardowy sposób aby uzyskać ścieżkę do folderu czcionek.

Powiązane problemy