2012-08-29 11 views
5

Sto creando il layout a 3 colonne con iText java lib.Come saltare il punto di inserimento del testo alla colonna successiva usando iText?

Il problema più grande è che, il testo nella prima colonna potrebbe essere inferiore alla seconda colonna o al terzo o meno nella seconda colonna rispetto alla terza colonna. Quindi ho bisogno di spostare il punto di inserimento nella colonna successiva.

Ho provato a utilizzare il metodo nextColumn che dovrebbe spostare il punto di inserimento nella colonna successiva di ma sposta tutte le colonne sul lato destro.

Forse qualcuno ha avuto lo stesso problema e sa come farlo nel modo giusto?

Grazie per le risposte!

L'immagine in basso mostra cosa voglio. columns layout

UPDATE:

Ok proverò a riformulare la domanda.

ecco il codice come dichiaro 3 colonne:

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

Ho 3 colonne con intestazioni e del testo in ogni colonna. Il testo dipende dalla quantità di testo che l'utente ha inserito oggi. Se l'utente ha riempito il limite di testo è OK perché la prima colonna è riempita e il secondo testo passa alla seconda colonna (il secondo testo inizia dalla seconda colonna).

Ma se l'utente non riempie il limite di testo sulla prima colonna o seconda colonna, il successivo inizia a scrivere dalla colonna che non è completamente riempita.

I.e.

Questo va bene perché la prima e la seconda colonna sono completamente riempite.

enter image description here

Questo è un male, perché la prima colonna non sono completamente riempito e secondo testo della colonna inizia dalla prima colonna. Quindi ho bisogno di aggiungere un'interruzione di colonna prima di HEADER 2 e 3 per ottenere una buona struttura di layout se il testo non è completamente riempito.

enter image description here

risposta

4

Riesci a riformulare la domanda? Perché non lo capisco. Cos'è un punto di inserimento? Ho scritto il libro su iText e posso fare praticamente tutto quello che voglio fare con ColumnText, quindi potrebbe essere nel tuo interesse chiarire ciò che desideri.

La domanda non è ancora chiara, ma l'immagine dice più di mille parole. Ti ho fatto un esempio con 4 colonne e 5 articoli:

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

Il primo articolo si inserisce la prima colonna, lasciandolo mezzo una colonna aperta. Saltiamo alla prossima colonna per il secondo articolo. Questo non si adatta alla seconda colonna: richiede una colonna e mezza. Il terzo articolo si adatta alla quarta colonna, ma dobbiamo passare alla prossima pagina per il quarto articolo, e così via ... enter image description here

+0

Vedere la foto e vedrete quello che voglio http://imgur.com/KkLln – burjulius

+0

Grazie per la risposta, ma non è quello che mi serve. Ho riformulato la domanda spero che ora capirai cosa voglio. – burjulius

+0

1. Stai usando MultiColumnText. Non sapevo nemmeno che fosse ancora nella versione. Lo rimuoverò nella prossima versione. Per favore non usarlo! –

Problemi correlati