2017-01-11 11 views
0

私はヒンディー語の私のアンドロイドデバイスでpdfを作成するためにitextg libを使用しています。 (PDFは英語で完全に作成されています)。itextアンドロイドヒンディーpdf作成

Javaは

final String FONT = "file:///android_asset/FreeSans.ttf"; 
Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
String outputString= "\u0915\u093e\u0930 \u092a\u093e\u0930\u094d\u0915\u093f\u0902\u0917"; 
document.add(new Paragraph(outputString,f)); 

出力文字列がhere- http://developers.itextpdf.com/examples/font-examples-itext5/language-specific-examples

ヒンディー語のテキストではありませんiTextの文書から取られているコード -

Gradle-

compile 'com.itextpdf:itextg:5.5.10' 

私のコード - が続きpdfに印刷されています。したがって、outputStringの行はpdfファイルに出力されず、作成されます。アドバンス

+0

編集した質問は、今すぐ明らかになっています – Sumit

+0

問題のフォントにこれらのグリフが含まれていることを確認しましたか? – mkl

答えて

3

おかげで、私はそれを参照してください方法は、あなたが2つの問題を抱えて:

  1. を私の推測では、あなたのAndroidのファイルシステムがフォントを見つけることができないということです。これを簡単にテストするには、unknownとなるfont.getFamilyname()の出力をチェックすることです。つまり、フォントが見つからず、iTextがデフォルトでHelveticaになっていることを意味します。 Helveticaには、インドのアルファベットの情報は含まれていません。

  2. もう1つ問題は、このテキストの正しい出力が得られないことです。特に、RA +ハラーであるクラスタ\u0930\u094dは、通常のRA文字+正しい文字で表示されるハランタグ記号の末尾に現れます。 (र्कのように)KAの上に付加記号は、iTextの中で達成することは不可能である5.

この理由は、あなたがヒンディー語を書くために使用しているデーヴァナーガリーを含むほとんどのインド語のアルファベットは、OpenType機能を必要とすることです(特定の種類のフォントの特定の機能)を正しくレンダリングすることができます。これは、iText 7 + the pdfCalligraph add-onでのみサポートされています。

残念ながら、まだiText 7用のAndroidポートはありません。この2番目の問題は解決できません。

+0

最初の点は正しいですが、なぜこのフォントがnullになるのでしょうか? – Sumit

+0

私はAndroidに精通していないので、ファイルシステムからリソースを正しくロードしているかどうかわかりません。アプリのリソースにフォントを追加してそこからロードする方が理にかなっています(ただし、 'android_asset'の意味ではないと私は正直に分かりません)。 – blagae

0

まず、FreeSans.ttfファイルをassets forlderに配置します。 iTextライブラリはフォントファイルのファイルパスを取得するので、アセットフォルダに直接アクセスすることはできないため、アセットパスを指定するだけでは不十分です。次に、フォントファイルをassetsフォルダからアプリケーションのローカルディレクトリにコピーするコードを示します。

public static final String HINDI_FONT = "FreeSans.ttf"; 
try { 
    File file = new File(getFilesDir(), HINDI_FONT); 
    if (file.length() == 0) { 
     InputStream fs = getAssets().open(HINDI_FONT); 
     FileOutputStream os = new FileOutputStream(file); 
     int i; 
     while ((i = fs.read()) != -1) { 
     os.write(i); 
     } 
     os.flush(); 
     os.close(); 
     fs.close(); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

tryブロックコードを別のスレッドで実行します。メインスレッドでは実行しないでください。 ifステートメントは、これが1回だけ発生することを保証します。上記のようにtryブロックの代わりにfinallyブロックにストリームのclose文を記述してください。

次はiTextの文はここでフォント

Font f = FontFactory.getFont(getFilesDir() + "/" + HINDI_FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
PdfPCell eCell = new PdfPCell(new Phrase(entry, f)); 
eCell.setPadding(5); 
table.addCell(eCell); 

を使用することで動作します)、varaibleエントリは、あなたのヒンディー語のテキストで、コードは(getFilesDirよう活動で書かれています。私は表のセルにフレーズを追加しました。段落でも同様に使用できます。私はこのコードをチェックして動作します。

+0

その働きはありがたい! –

関連する問題