2016-06-13 13 views
0

私はiText Java開発者です。私は大きなテーブルで作業していましたが、今はテーブルを垂直に分割することに悩まされています。iText java - 縦横にテーブルを分割する

「iText in Action」の119ページで、Bruno Lowagie(私はこの男のことをとても尊敬しています)が、大きな表を分割して2つの異なるページに表示する方法を説明します。

私は彼の例に従いました。文書に行が少ない場合はうまく動作します。

私の場合、私は100行を持っており、同時に複数のページで100行を分割する必要があり、同時に列を縦に分割する必要があります。次のようにコードを実行しましたが、最初の34行だけが表示されます。

誰かが親切にこのコードで間違って何ができるか説明できます:

//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

100行を焦がすページに収まらないので、あなたは、100行が表示されません。 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にはケニアのナイオビでJava/iTextカンファレンスが本当に必要です。私はあなたに来てアフリカの若い開発者を鼓舞します。私はそれを実現させます。どのように私はあなたに直接書くのですか?私がStackoverflowプロトコルに違反していると私の謝罪します。 – kobewarui

+0

私は会議に行くために世界中を飛びますが、私はまだアフリカにいませんでした。会議のために私に連絡する最善の方法は、[email protected]にメールすることです。あなたが私の旅行/会議の議題を知っている人々に私がするよりも上手くやって来るでしょう。 –

+0

間違いなく、私はすぐにあなたの兄弟に書いてみましょう。私は感謝します。 – kobewarui

関連する問題