2013-08-19 102 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