2012-08-29 18 views
5

Estoy creando el diseño de 3 columnas con iText java lib.Cómo omitir el punto de inserción de texto en la columna siguiente con iText?

El problema más grande es que, el texto en la primera columna podría ser menor que en la segunda columna o tercero o menos en la segunda columna que la tercera columna. Entonces necesito mover el punto de inserción a la siguiente columna.

Intenté utilizar el método nextColumn, que debería mover el punto de inserción a la siguiente columna , pero mueve todas las columnas hacia el lado derecho.

Quizás alguien haya tenido el mismo problema y sepa cómo hacerlo, ¿verdad?

¡Gracias por responder!

La imagen a continuación muestra lo que quiero. columns layout

ACTUALIZACIÓN:

Ok voy a tratar de reformular la pregunta.

Aquí es el código de la forma Declaro 3 columnas:

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

tengo 3 columnas con encabezados y parte del texto de cada columna. El texto depende de la cantidad de texto que el usuario ingresó hoy. Si el usuario llenó el límite de texto está bien porque la primera columna está llena y el segundo texto va a la segunda columna (el segundo texto comienza en la segunda columna).

Pero si el usuario no completa el límite de texto en la primera columna o la segunda columna, el próximo comienza a escribir desde la columna que no está completamente lleno.

I.e.

Esto está bien porque la primera y la segunda columnas están completamente llenas.

enter image description here

Esto es malo porque la primera columna no se llenan completamente y segundo texto de la columna comienza a partir de la primera columna. Por lo tanto, necesito agregar un salto de columna antes de HEADER 2 y 3 para obtener una buena estructura de disposición si el texto no está completamente lleno.

enter image description here

Respuesta

4

¿Se puede reformular la pregunta? Porque no lo entiendo ¿Qué es un punto de inserción? Escribí el libro sobre iText, y puedo hacer casi todo lo que quiero hacer con ColumnText, por lo que puede ser de su interés aclarar lo que quiere.

La pregunta aún no está clara, pero la imagen dice más que mil palabras. Te he puesto como ejemplo con 4 columnas y 5 artículos:

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

El primer artículo se ajusta a la primera columna, dejando la mitad de una columna abierta. Salteamos a la siguiente columna para el segundo artículo. Eso no se ajusta a la segunda columna: toma una columna y media. El tercer artículo se ajusta a la cuarta columna, pero debemos pasar a la página siguiente para el cuarto artículo, y así sucesivamente ... enter image description here

+0

vemos en la imagen y verá lo que yo quiero que http://imgur.com/KkLln – burjulius

+0

Gracias por la respuesta, pero no es lo que necesito. He reformulado la pregunta. Espero que ahora entiendas lo que quiero. – burjulius

+0

1. Estás usando MultiColumnText. Ni siquiera sabía que todavía estaba en el lanzamiento. Lo eliminaré en el próximo lanzamiento. Por favor no lo use! –

Cuestiones relacionadas