2016-06-13 3 views
0

저는 iText Java 개발자입니다. 나는 커다란 테이블을 가지고 일해 왔고, 이제는 테이블을 수직으로 나눠 붙어있다.iText java - 수직 및 수평으로 테이블 분할

iText In Action의 119 페이지에서 Bruno Lowagie (저는이 사람을 존경했습니다)는 커다란 테이블을 분할하여 열이 두 개의 다른 페이지에 나타나도록하는 방법을 설명합니다.

나는 그의 예제를 따르고 문서에 행이 적을 때 잘 동작합니다.

필자의 경우 나는 100 개의 행을 가지고 있는데, 문서를 여러 페이지에서 100 개의 행을 분할해야하고 동시에 세로로 나누는 것이 필요하다. 다음과 같이 코드를 실행했지만 처음 34 행만 표시됩니다.

사람이 친절이 코드 잘못 될 수 있는지 설명 할 수 : 100 개 행이 그을음 페이지에 적합하지 않기 때문에 당신은, 100 개의 행이 표시되지 않는

//create a PDFPTable with 24 columns 
PdfPTable tbl = new PdfPTable(new float{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}); 
//loop through 100 rows 
for (int i = 0; i < 100; i++) { 
    //insert 24 table cells 
} 

tbl.setTotalWidth(1500);//set table width 
float top = document.top() - document.topMargin() - 30; 
PdfContentByte canvas = writer.getDirectContent(); 
tbl.writeSelectedRows(0, 12, 0, -1, document.leftMargin(), top, canvas); 
document.newPage(); 
// draw the remaining two columns on the next page 
tbl.writeSelectedRows(12, -1, 0, -1, 5, top, canvas); 

답변

2

. writeSelectedRows()을 사용할 때 페이지에 맞는 행 수를 계산하고 적합한 행 선택 만 추가해야합니다. 당신이 볼 수 있듯이, 나는 추적

public void createPdf(String dest) throws IOException, DocumentException { 
    Document document = new Document(PageSize.A4.rotate()); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    PdfPTable tbl = new PdfPTable(new float[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}); 
    //loop through 100 rows 
    for (int r = 1; r <= 100; r++) { 
     for (int c = 1; c <= 24; c++) { 
      tbl.addCell(String.format("r%sc%s", r, c)); 
     } 
    } 
    PdfContentByte canvas = writer.getDirectContent(); 
    tbl.setTotalWidth(1500);//set table width 
    float top = document.top() - document.topMargin() - 30; 
    float yPos = top; 
    int start = 0; 
    int stop = 0; 
    for (int i = 0; i < 100; i++) { 
     yPos -= tbl.getRowHeight(i); 
     if (yPos < 0) { 
      stop = --i; 
      tbl.writeSelectedRows(0, 12, start, stop, document.leftMargin(), top, canvas); 
      document.newPage(); 
      tbl.writeSelectedRows(12, -1, start, stop, 5, top, canvas); 
      start = stop; 
      document.newPage(); 
      yPos = top; 
     } 
    } 
    tbl.writeSelectedRows(0, 12, stop, -1, document.leftMargin(), top, canvas); 
    document.newPage(); 
    tbl.writeSelectedRows(12, -1, stop, -1, 5, top, canvas); 
    document.close(); 
} 

:

나는이 순간을 위해 베를린 회의에서 해요,하지만 난 당신이해야 할 일을 어느 정도 보여 빠른 예를 썼다 테이블의 높이와 "페이지에서 떨어지는"위험에 빠지면 바로 그 행을 렌더링하고 다음 페이지로 이동합니다.

+0

내 동생이 완벽하게 작동했습니다. 이것은 허용 된 대답입니다. 나는이 밤에 많은 밤잠을 자고있다. 이제 나는 잠을 잘 수있다. 베를린에서 최선을 다하고 있으며, BTW는 케냐의 Naiobi에서 Java/iText 컨퍼런스가 실제로 필요합니다. 아프리카에있는 젊은 개발자들에게 영감을 불어 넣으시겠습니까? 나는 그렇게 할 것이다. 나는 어떻게 당신에게 직접 편지를 쓸 수 있습니까? Stackoverflow 프로토콜을 위반 한 경우 사과드립니다. – kobewarui

+0

나는 회의에 가기 위해 전 세계로 날아간다. 그러나 나는 아직 아프리카에 없었다. 컨퍼런스에 저에게 연락하는 가장 좋은 방법은 [email protected]으로 메일을 보내는 것입니다. 그렇게하면 여행/회의 일정을 잘 아는 사람들에게 내가하는 것보다 더 잘 알게 될 것입니다. –

+0

분명히 나는 ​​곧 형에게 편지를 쓸 것이다. 감사합니다. – kobewarui

관련 문제