2015-11-16 9 views
5

私はitext libを使ってPDFファイルを生成しています。 アラビア語を書いてみたい。 以下のコードを実行すると、単語の文字が逆に表示されます。itextを使ってpdfにアラビア語を書く

使用コード:

PdfContentByte cb = docWriter.getDirectContent(); 
BaseFont bfBold = BaseFont.createFont("assets/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 


createHeadings(cb, document.leftMargin(), 70, "السعر الاجمالي: " + tprice + " L.E."); 

。 。 。

private void createHeadings(PdfContentByte cb, float x, float y, String text){ 
     cb.beginText(); 
     cb.setFontAndSize(bfBold, 10); 
     cb.setTextMatrix(x,y); 
     cb.showText(text.trim()); 
     cb.endText(); 
    } 

この画像は上記のコードの出力について説明します。 http://i.stack.imgur.com/OLoLo.jpg

答えて

6

Ligatures2例を見てみてください。

あなたはこの行を忘れていません。あなたはiTextのは左し、必要に応じて合字を作成するには、右からテキストを書きたいとき

cb.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); 

setRunDirection()方法が必要です。このメソッドは、オブジェクトの代わりにPdfPCellオブジェクトに適用する場合のテーブルのコンテキストにも存在します。

また、私はなぜこれを使用するのかわかりませんString"السعر الاجمالي: "。あなたのようなStringを使用すると、エンコードと合字に関するすべての種類の混乱が生じる可能性があるため、代わりにUnicode表記を使用してください("\u0644\u0648\u0631\u0627\u0646\u0633 \u0627\u0644\u0639\u0631\u0628"など)。一部のエディタでは正しいエンコーディングを使用しません(テキストをぎこちないものに変更する)。一部のエディタは合字を作成します(これはiTextが期待するものではありません)。例えば

は、あなたのケースでは、私はアラビア語を知らないので、それは"\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a"または"\u064a\u0644\u0627\u0645\u062c\u0627\u0644\u0627 \u0631\u0639\u0633\u0644\u0627"だ場合、私は知らない私は値\u0627またはでグリフで読むために開始する必要がある場合、私は知らないので、値が\u064aのグリフ。いずれにせよ、iTextはStringの最初の "文字"が人間によって読み取られる最初のものであると考えている。

ArabicExampleの例を見てみてください。

enter image description here

document.add()を使用しているときRTLやアラビア語の合字がサポートされているので、最初の行は、間違っています。 2行目は正しいです(私が知る限り:私はアラビア語を読むことができません)。私はColumnTextを使用しています。

これは私が使用するコードです:

public static final String FONT = "resources/fonts/NotoNaskhArabic-Regular.ttf"; 
public static final String ARABIC = "\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a"; 

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    Phrase p = new Phrase("This is incorrect: "); 
    p.add(new Chunk(ARABIC, f)); 
    p.add(new Chunk(": 50.00 USD")); 
    document.add(p); 

    p = new Phrase("This is correct: "); 
    p.add(new Chunk(ARABIC, f)); 
    p.add(new Phrase(": 50.00")); 

    ColumnText canvas = new ColumnText(writer.getDirectContent()); 
    canvas.setSimpleColumn(36, 750, 559, 780); 
    canvas.setRunDirection(PdfWriter.RUN_DIRECTION_LTR); 
    canvas.addElement(p); 
    canvas.go(); 

    document.close(); 
} 

ParagraphPhraseを拡張する)私はPhraseを使用しますが、Paragraphを使用しているときに、同じ結果を期待することができます。これがあなたの質問に答えることができない場合は、明確にしてください。 StackOverflowのほとんどの人はアラビア語を理解していないので、質問をするときや「うまくいきません」と明示する必要があります。私たちはアラビア語を知らないので、どのように動作するはずです。

+1

私はすでにテーブルを作っており、セル(cell.setRunDirection)をカスタマイズしてアラビア語を書いています。しかし、上記の場合はカスタマイズできません(cb)。 @ブルノ –

+1

あなたのコメントは、問題が解決されたことを意味しますか?私は 'PdfPCell'のために' setRunDirection() 'メソッドも存在するという発言を追加して私の答えを更新します。それがあなたのために働くなら、答えを受け入れてください。 –

+1

いいえ、それは私が尋ねる前にしたことでした。私は私がpdfにアラビア語を入力することができるということを意味しますが、私がpdfの一部にしなければならない問題は、アラビア語でサポートされているテーブルと他の部分はページの他のテキストです。この質問 –

関連する問題