2012-08-29 24 views
5

Tôi đang tạo bố cục 3 cột với iText java lib.Làm cách nào để bỏ qua điểm chèn văn bản vào cột tiếp theo bằng iText?

Vấn đề lớn nhất là, văn bản trong cột đầu tiên có thể nhỏ hơn cột thứ hai hoặc thứ ba hoặc ít hơn trong cột thứ hai so với cột thứ ba. Vì vậy, tôi cần phải di chuyển điểm chèn vào cột tiếp theo.

Tôi đã cố gắng sử dụng phương pháp NextColumn sẽ di chuyển điểm chèn vào cột tiếp theo nhưng di chuyển tất cả các cột sang bên phải.

Có thể ai cũng gặp vấn đề tương tự và biết cách làm đúng không?

Cảm ơn bạn đã trả lời!

Hình ảnh bên dưới thể hiện những gì tôi muốn. columns layout

UPDATE:

Ok tôi sẽ cố gắng diễn đạt lại câu hỏi.

Đây là mã như thế nào Tôi tuyên bố 3 cột:

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

Tôi có 3 cột với tiêu đề và một số văn bản trong mỗi cột. Văn bản tùy thuộc vào số lượng văn bản người dùng đã nhập ngày hôm nay. Nếu người dùng điền vào giới hạn văn bản là OK vì cột đầu tiên được điền và văn bản thứ hai đi đến cột thứ hai (văn bản thứ hai bắt đầu từ cột thứ hai).

Nhưng nếu người dùng không điền vào giới hạn văn bản trên cột đầu tiên hoặc cột thứ hai thì cột tiếp theo bắt đầu viết từ cột không được lấp đầy đầy đủ.

I.e.

Điều này là ổn vì cột đầu tiên và cột thứ hai được lấp đầy đầy đủ.

enter image description here

này là xấu bởi vì cột đầu tiên không được điền đầy đủ và văn bản cột thứ hai bắt đầu từ cột đầu tiên. Vì vậy, tôi cần phải thêm ngắt cột trước HEADER 2 và 3 để có được cấu trúc bố cục tốt nếu văn bản không được lấp đầy đầy đủ.

enter image description here

Trả lời

4

Bạn có thể thuật lại câu hỏi không? Bởi vì tôi không hiểu nó. Điểm chèn là gì? Tôi đã viết cuốn sách về iText, và tôi có thể làm khá nhiều bất cứ điều gì tôi muốn làm với ColumnText, vì vậy nó có thể được quan tâm của bạn để làm rõ những gì bạn muốn.

Câu hỏi vẫn chưa rõ ràng, nhưng hình ảnh cho biết hàng ngàn từ. Tôi đã tạo cho bạn một ví dụ với 4 cột và 5 bài viết:

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

Bài viết đầu tiên phù hợp với cột đầu tiên, để nửa cột mở. Chúng tôi chuyển sang cột tiếp theo cho bài viết thứ hai. Điều đó không phù hợp với cột thứ hai: phải mất một cột rưỡi. Bài viết thứ ba phù hợp với cột thứ tư, nhưng chúng ta cần chuyển sang trang tiếp theo cho bài viết thứ tư, v.v ... enter image description here

+0

Xem vào bức tranh và bạn sẽ thấy những gì tôi muốn nó http://imgur.com/KkLln – burjulius

+0

Cảm ơn cho câu trả lời nhưng không phải là những gì tôi cần. Tôi đã nhắc lại câu hỏi tôi hy vọng bây giờ bạn sẽ hiểu những gì tôi muốn. – burjulius

+0

1. Bạn đang sử dụng MultiColumnText. Tôi thậm chí không biết nó vẫn còn trong bản phát hành. Tôi sẽ xóa nó trong bản phát hành tiếp theo. Xin đừng dùng nó! –

Các vấn đề liên quan