2016-08-04 8 views
1

Ich möchte einen PDF-Bericht mit englischen und arabischen Texten erstellen. Ich habe viele Tabellen/Sätze auf der Seite. Ich möchte arabischen Text auch zusammen mit Englisch anzeigen. Ich habe das arabische Beispiel auch in iText doxument gesehen, mit ColumnText. Ich konnte mir nicht helfen. Mein Zweifel ist, wie man canvas.setSimpleColumn (36, 750, 559, 780), die Argumente in dieser Methode für Tabellen/Phrasen an verschiedenen Positionen setzen. Ich habe unten auch Fragen verwiesen. Bis ich Probleme habe.iText- Anhängen von arabischem Text in PDF-Tabellenzellenphrase an verschiedenen Positionen auf einer Seite

Writing Arabic in pdf using itext,
http://developers.itextpdf.com/examples/font-examples/language-specific-exampleshe

Unten ist mein Code ..

private static final String ARABIC = "\u0627\u0644\u0633\u0639\u0631 \u0627\u0644\u0627\u062c\u0645\u0627\u0644\u064a"; 
    private static final String FONT = "resources/fonts/ARIALUNI.TTF"; 


    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf")); 
    document.open(); 
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    PdfPTable table = new PdfPTable(3); 
    Phrase phrase = new Phrase(); 
    Chunk chunk = new Chunk("test value", inlineFont); 

    phrase.add(chunk); 
    // I want to add Arabic text also here..but direction is not //correct.also coming as single alphabets 
    p.add(new Chunk(ARABIC, f)); 
    PdfPCell cell1 = new PdfPCell(phrase); 
    cell1.setFixedHeight(50f); 
    table.addCell(cell1); 
    document.add(table); 
    document.close(); 

Antwort

0

Ihr Code ist eine Art von schlampig.

Zum Beispiel:

  • Sie definieren eine PdfPTable mit 3 Spalten, aber Sie haben nur eine einzelne Zelle hinzufügen. Diese Tabelle wird niemals gerendert.
  • Sie definieren eine Phrase mit dem Namen phrase, aber später in Ihrem Code verwenden Sie p.add(...). In Ihrem Code ist keine Variable mit dem Namen enthalten.
  • ...

Dieser Mangel an Respekt für die Leser in Stackoverflow nicht immer eine Antwort zur Folge haben kann, weil Sie den Leser nicht nur erwarten, zu verwenden, um das eigentliche Problem zu beheben -nicht in der Lage, Englisch und Arabisch Text in einer einzigen PdfPCell -, sondern auch, um alle anderen (vermeidbare) Fehler in Ihrem Code zu beheben.

Dies ist ein funktionierendes Beispiel:

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.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    Font f = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    PdfPTable table = new PdfPTable(1); 
    Phrase phrase = new Phrase(); 
    Chunk chunk = new Chunk("test value"); 
    phrase.add(chunk); 
    phrase.add(new Chunk(ARABIC, f)); 
    PdfPCell cell = new PdfPCell(phrase); 
    cell.setUseDescender(true); 
    cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); 
    table.addCell(cell); 
    document.add(table); 
    document.close(); 
} 

Das Ergebnis sieht wie folgt aus:

enter image description here

Wie Sie sehen können, sowohl die englische und der arabische Text kann fein gelesen werden. Sie werden von der Ausrichtung und der Reihenfolge des Textes überrascht sein. Während wir im Schreibsystem von rechts nach links arbeiten, werden links und rechts umgeschaltet. Standardmäßig wird der Text linksbündig ausgerichtet, aber sobald wir die RTL-Laufrichtung einführen, ändert sich die Ausrichtung nach rechts.

In Ihrem Code fügen Sie zuerst den englischen Text gefolgt von dem arabischen Text hinzu. Text in Arabisch wird von rechts nach links gelesen. Deshalb sehen Sie den englischen Text rechts, und warum der arabische Text links vom englischen Text hinzugefügt wird.

All dies wurde in iText 7 verbessert. IText 7 verfügt über ein zusätzliches pdfCalligraph-Modul, das auf transparente Weise für andere Schriftsysteme sorgt.

+0

Danke Bruno für Ihre schnelle Antwort und Entschuldigung für die Probleme in meinem Code geteilt. Ich habe meinen Code mit dem Beispiel auf der iText-Seite gemischt. In dem Beispiel mit ColumnText lautet die angegebene Richtung canvas.setRunDirection (PdfWriter.RUN_DIRECTION_LTR); Gibt es eine Möglichkeit, ähnliche für diesen Fall zu verwenden. Ich brauche Englisch auf der linken Seite und Arabisch auf der rechten Seite. Auch pdfCalligraph ist eine kostenpflichtige Version? Kann iText 7 nicht mit Maven herunterladen. Ich plane, getrennte Zellen für Englisch und Arabisch zu verwenden, wenn nichts mir hilft. – Sha

+0

Wenn Sie Englisch auf der linken Seite und Arabisch auf der rechten Seite mit iText 5 möchten, müssen Sie die Reihenfolge ändern, in der Sie den Inhalt hinzufügen.pdfCalligraph ist eine geschlossene Quelle; Sie können eine Testversion für 30 Tage erhalten. Ich habe iText 7 ohne Probleme von Maven heruntergeladen: [installiere iText 7] (http://developers.itextpdf.com/content/itext-7-jump-start-tutorial/installing-itext-7). Installation von pdfCalligraph: Suche nach pdfCalligraph auf [diese Seite] (http://developers.itextpdf.com/content/itext-7-building-blocks/chapter-2-working-rootelement). –