2012-08-29 3 views
5

Ich erstelle das 3 Spalten Layout mit iText Java Lib.Wie wird der Texteinfügepunkt in die nächste Spalte mit iText übersprungen?

Das größte Problem ist, dass der Text in der ersten Spalte kleiner als in der zweiten Spalte oder dritten oder weniger in der zweiten Spalte als in der dritten Spalte sein kann. Also muss ich den Einfügepunkt in die nächste Spalte verschieben.

Ich habe versucht, nextColumn-Methode zu verwenden, die den Einfügepunkt in die nächste Spalte verschieben sollte, aber es verschiebt alle Spalten auf der rechten Seite.

Vielleicht hatte jemand das gleiche Problem und weiß, wie man es richtig macht?

Danke für die Antworten!

Das Bild unten zeigt, was ich will. columns layout

UPDATE:

Ok Ich werde versuchen, die Frage neu zu formulieren. Hier

ist der Code, wie erkläre ich 3 Spalten:

MultiColumnText columnsFooter = new MultiColumnText(210f); 
columnsFooter.addRegularColumns(document.left() - 10f, 
    document.right(), 0, 3); 
columnsFooter.setAlignment(Element.ALIGN_CENTER); 

Ich habe 3 Spalten mit Überschriften und Text in jeder Spalte. Der Text hängt davon ab, wie viel Text der Benutzer heute eingegeben hat. Wenn der Benutzer das Textlimit gefüllt hat, ist OK, weil die erste Spalte gefüllt ist und der zweite Text in die zweite Spalte geht (zweiter Text beginnt ab der zweiten Spalte).

Aber wenn der Benutzer die Textgrenze für die erste Spalte oder zweite Spalte nicht füllt, beginnt der nächste Schreiben aus der Spalte, die nicht vollständig ausgefüllt sind.

I.e.

Dies ist in Ordnung, weil die erste und die zweite Spalte vollständig ausgefüllt sind.

enter image description here

Das ist schlecht, weil die erste Spalte nicht vollständig gefüllt und zweiten Spalte Text beginnt mit der ersten Spalte. Also muss ich Spaltenumbrüche vor HEADER 2 und 3 hinzufügen, um eine gute Layoutstruktur zu erhalten, wenn der Text nicht vollständig ausgefüllt ist.

enter image description here

Antwort

4

Können Sie die Frage anders formulieren? Weil ich es nicht verstehe. Was ist ein Einfügepunkt? Ich habe das Buch über iText geschrieben, und ich kann so ziemlich alles machen, was ich mit ColumnText machen möchte, also könnte es in Ihrem Interesse liegen, klarzustellen, was Sie wollen.

Die Frage ist noch unklar, aber das Bild sagt mehr als tausend Worte.

import java.io.FileOutputStream; 
import java.io.IOException; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.pdf.ColumnText; 
import com.itextpdf.text.pdf.PdfWriter; 


public class ColumnTextExample { 


    /** Definition of four columns */ 
    public static final float[][] COLUMNS = { 
     { 36, 36, 224, 579 } , { 230, 36, 418, 579 }, 
     { 424, 36, 612, 579 } , { 618, 36, 806, 579 } 
    }; 

    public static final String ARTICLE1 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 
    public static final String ARTICLE2 = ARTICLE1 + " " + ARTICLE1 + " " + ARTICLE1; 
    public static final String ARTICLE3 = ARTICLE1 + " " + ARTICLE1; 
public static final String[] ARTICLES = { "HEADER 1\n" + ARTICLE1, "HEADER 2\n" + ARTICLE2, "HEADER 3\n" + ARTICLE3, "HEADER 4\n" + ARTICLE1, "HEADER 5\n" + ARTICLE3 }; 

    public static void main(String[] args) throws IOException, DocumentException { 
     // step 1 
     Document document = new Document(PageSize.A4.rotate()); 
     // step 2 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("columns.pdf")); 
     // step 3 
     document.open(); 
     // step 4 
     ColumnText ct = new ColumnText(writer.getDirectContent()); 
     int column = 0; 
     ct.setSimpleColumn(
      COLUMNS[column][0], COLUMNS[column][1], 
      COLUMNS[column][2], COLUMNS[column][3]); 
     int status = ColumnText.START_COLUMN; 
     for (String article : ARTICLES) { 
      ct.addElement(new Paragraph(article)); 
      status = ct.go(); 
      while (ColumnText.hasMoreText(status)) { 
       column = nextColumn(document, column, ct); 
       status = ct.go(); 
      } 
      column = nextColumn(document, column, ct); 
     } 
     // step 5 
     document.close(); 
    } 

    public static int nextColumn(Document document, int column, ColumnText ct) { 
     column = (column + 1) % 4; 
     if (column == 0) 
      document.newPage(); 
     ct.setSimpleColumn(
       COLUMNS[column][0], COLUMNS[column][1], 
       COLUMNS[column][2], COLUMNS[column][3]); 
     return column; 
    } 
} 

Der erste Artikel passt die erste Spalte, so dass eine halbe Spalte offen: Ich habe Ihnen ein Beispiel mit 4 Spalten und 5 Artikel gemacht. Wir springen zur nächsten Spalte für den zweiten Artikel. Das passt nicht in die zweite Spalte: es dauert eineinhalb Spalten. Der dritte Artikel passt in die vierte Spalte, aber wir müssen auf die nächste Seite für den vierten Artikel springen, und so weiter ... enter image description here

+0

Siehe das Bild und Sie werden sehen, was ich will es http://imgur.com/KkLln – burjulius

+0

Vielen Dank für Antwort, aber nicht das, was ich brauche. Ich habe die Frage umformuliert, ich hoffe, jetzt verstehst du, was ich will. – burjulius

+0

1. Sie verwenden MultiColumnText. Ich wusste nicht einmal, dass es immer noch in der Veröffentlichung war. Ich werde es in der nächsten Version entfernen. Bitte benutze es nicht! –

Verwandte Themen