2012-08-29 11 views
5

Tworzę układ 3 kolumn z iText java lib.Jak pominąć punkt wstawiania tekstu do następnej kolumny używając iText?

Największym problemem jest to, że tekst w pierwszej kolumnie może być mniejszy niż w drugiej kolumnie lub trzeciej lub mniejszej w drugiej kolumnie niż trzecia kolumna. Muszę więc przenieść punkt wstawiania do następnej kolumny.

Próbowałem użyć metody nextColumn, która powinna przenieść punkt wstawienia do następnej kolumny , ale przenosi wszystkie kolumny na prawą stronę.

Może ktoś miał ten sam problem i wiedział, jak to zrobić dobrze?

Dzięki za odpowiedzi!

Poniższy obrazek pokazuje, co chcę. columns layout

UPDATE:

Ok postaram się przeformułować pytanie.

Oto kod jak Oświadczam 3 kolumny:

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

mam 3 kolumny z nagłówkami i jakiś tekst w każdej kolumnie. Tekst zależy od ilości tekstu wprowadzonego dzisiaj przez użytkownika. Jeśli użytkownik wypełnił limit tekstu jest OK, ponieważ pierwsza kolumna jest wypełniona, a drugi tekst przechodzi do drugiej kolumny (drugi tekst zaczyna się od drugiej kolumny).

Ale jeśli użytkownik nie wypełnia limitu tekstowego w pierwszej kolumnie lub drugiej kolumnie, następne rozpoczyna pisanie z kolumny, która nie jest w pełni wypełniona.

tj.

Jest to w porządku, ponieważ pierwsza i druga kolumna są całkowicie wypełnione.

enter image description here

To jest złe, ponieważ pierwsza kolumna nie są całkowicie wypełnione i druga kolumna tekst zaczyna się od pierwszej kolumny. Dlatego muszę dodać podział kolumn przed HEADER 2 i 3, aby uzyskać dobrą strukturę układu, jeśli tekst nie jest w pełni wypełniony.

enter image description here

Odpowiedz

4

można przeformułować pytanie? Ponieważ tego nie rozumiem. Co to jest punkt wstawienia? Napisałem książkę o iText i mogę zrobić prawie wszystko, co chcę zrobić z ColumnText, więc może być w twoim interesie wyjaśnienie, czego chcesz.

Pytanie wciąż nie jest jasne, ale na zdjęciu jest tysiąc słów. Zrobiłem ci przykład z 4 kolumnami i 5 artykułami:

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

Pierwszy artykuł pasuje do pierwszej kolumny, pozostawiając pół kolumny otwarte. Przejdziemy do następnej kolumny dla drugiego artykułu. To nie pasuje do drugiej kolumny: zajmuje półtorej kolumny. Trzeci artykuł pasuje do czwartej kolumny, ale musimy przejść do następnej strony czwartego artykułu i tak dalej ... enter image description here

+0

Zobacz na zdjęcie, a zobaczysz co chcę http://imgur.com/KkLln – burjulius

+0

Dzięki za odpowiedź, ale nie jest to, czego potrzebuję. Przeformułowałem pytanie, mam nadzieję, że teraz zrozumiesz, czego chcę. – burjulius

+0

1. Używasz MultiColumnText. Nie wiedziałem nawet, że wciąż jest w tym wydaniu. Usuwam to w następnym wydaniu. Proszę go nie używać! –

Powiązane problemy