2013-08-19 96 views
1

我是iTextSharp的新手,並且想將我的DataGridView轉換爲PdfPtable。iTextSharp PdfPtable多頁

當我將表格寫入PDF時,它顯示得很好,除非列數量相對較大。然後通過使列寬變小來適應。

相反,我想從新頁面開始,顯示更多的表格和標題。

下面是我的表碼:

PdfPTable table = new PdfPTable(view.Columns.Count); 

    float[] widths = new float[view.Columns.Count]; 

    for (int i = 0; i < view.Columns.Count; i++) { 
    widths[i] = view.Columns[i].Width; 
    } 

    table.SetWidths(widths); 
    table.HorizontalAlignment = 1; //Center 

    PdfPCell cell = null; 

    //Headers 
    foreach (DataGridViewColumn c in view.Columns) { 
    cell = new PdfPCell(new Phrase(new Chunk(c.HeaderText, _standardFont))); 
    cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER; 
    cell.VerticalAlignment = PdfPCell.ALIGN_CENTER; 
    table.AddCell(cell); 
    } 

    //Rest of table 
    for (int i = 1; i < view.Rows.Count; i++) { 
    for (int j = 0; j < view.Columns.Count; j++) { 
     bool hasValue = view.Rows[i].Cells[j].Value == null ? false : true; 

     if (hasValue) { 
     cell = new PdfPCell(new Phrase(view.Rows[i].Cells[j].Value.ToString(), _standardFont)); 
     } else { 
     cell = new PdfPCell(new Phrase("", _standardFont)); 
     } 
     cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER; 
     cell.VerticalAlignment = PdfPCell.ALIGN_CENTER; 
     table.AddCell(cell); 
    } 
    } 

一個解決辦法是莫名其妙地知道有多少列,可以在頁面上打印的全尺寸,然後添加一個新的頁面,更顯示網格那裏,但我不確定如何檢測新頁面。這裏的問題是,似乎沒有辦法改變PdfPtable的列數,所以當預先添加列時,我必須能夠計算寬度的效果。

編輯:我要拆分的頁面垂直

+0

當行不符合頁面的可用高度時,iText會自動分割表格。你是說你想要垂直分割桌子嗎? –

+0

是的,我應該更清楚在我的問題描述:) – User

回答

3

你面臨的問題,是一個事實,即PDF不是HTML。 PDF中的頁面具有固定大小。您沒有滾動條,並且在調整查看器窗口大小時內容不會更改。

我打算用我書中第4章的JAVA例子來回答。如果你需要這些例子的C#版本,你需要這個URL:http://tinyurl.com/itextsharpIIA2C04

首先這個:表是否看起來不錯是機器無法判斷的。這隻有人類才能做到。

好像你想控制列的寬度。示例ColumnWidths爲您提供了一些關於如何執行此操作的示例。在你的情況下,你應該使用一個解決方案,包括使用表的寬度的絕對值。

table.setLockedWidth(true); 

使用絕對寬度是強制性的,如果你要計算每行或整個表格的高度:因爲他們都有這條線共同你會認識到這些解決方案。一個常見問題是「我創建了一個表格,當我詢問其總寬度時,它會返回零。」可以通過反問題回答:「如果您沒有先定義寬度,iText如何計算表格的高度?」這是一個修辭問題:在定義寬度之前,不可能計算高度。這在TableHeight示例中顯示。

一旦定義了表格(及其列)的寬度,就可以計算高度,並且您已準備好將表格放置在絕對位置。 Zhang示例顯示它是如何完成的。在這個例子中,創建了一個有4列的表格。前兩個colums使用繪製在此突擊隊:

table.writeSelectedRows(0, 2, 0, -1, 236, 806, canvas); 

當第一0定義了需要繪製第一列,2定義不繪製第一列。其餘的列拉的下一個頁面上,使用該突擊隊:

table.writeSelectedRows(2, -1, 0, -1, 36, 806, canvas); 

2定義了需要繪製第一列,並-1表明,所有剩餘的列應繪製。

在這種情況下,0-1用於行。如果您的表格包含的行數多於放在一頁上的行數,則必須進行數學計算,以確保您沒有任何「脫離頁面」的行。

請注意,36806代表X和Y座標。當您控制佈局時,您有責任計算這些座標。

+0

感謝您的時間和幫助:)想要upvote,但我沒有足夠的代表。 – User

+0

你可以接受答案,對不對? –

+0

完成。我現在唯一的問題是我只能設置列的相對寬度。寬度不適合列內的文本,我似乎無法找到任何方法來改變它。我想我在這裏完全錯過了一些東西。 – User