2011-07-28 59 views
6

Tôi đang dò tìm để tạo tệp PDF trong ứng dụng Android của tôi. Tôi sử dụng iText và nó tạo ra PDF nhưng chỉ có chữ cái trong tiếng Anh được hiển thị. Tôi tìm thấy mã ví dụ cho iText làm việc với unicode. Tôi đã thử mã ví dụ này trong một ứng dụng java đơn giản comsole và nó hoạt động tốt. Đây là mã:Chữ cái Kirin không hiển thị bằng PDF được tạo bằng iText trong Android

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

Khi tôi chuyển mã này cho một hoạt động android, nó dừng lại để làm việc:

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

Vấn đề không phải là xung quanh vị trí của tập tin comic.ttf vì nếu tôi thay đổi đường dẫn đến một sai, tôi nhận được một IOException. Vấn đề không phải là với thế hệ của PDF bản thân vì nếu tôi sử dụng mã này mà không font1, nó tạo ra một tập tin PDF trên thẻ SD nhưng nó là không có các ký tự Unicode:

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

gì có thể là vấn đề?

+1

Vâng, tôi đã tìm ra giải pháp. Mã đúng là: BaseFont bfComic = BaseFont.createFont ("asset/fonts/comic.ttf", "Cp1251", BaseFont.EMBEDDED); – Georgi

+2

Nếu bạn đã tìm thấy giải pháp, bạn có thể vui lòng trả lời câu hỏi của riêng bạn (Thay vì thêm nó làm bình luận). – Ian

+0

Tính năng này có hoạt động với bất kỳ phông chữ chuẩn nào không? Tôi không tìm thấy "assets/fonts/comic.ttf" –

Trả lời

4

tôi đã sử dụng

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

và nó hoạt động. Bạn nên kiểm tra thư mục phông chữ trên thiết bị Android của mình để đảm bảo.

Đối với chữ Hán tôi đã sử dụng

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

Hãy chắc chắn rằng bạn cung cấp một phông chữ dự phòng trong catch() chặn, ví dụ:

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

Xin vui lòng cho tôi biết nếu có một cách tiêu chuẩn để có được đường dẫn của thư mục phông chữ.

Các vấn đề liên quan