iTextSharp PdfPtable多重

时间:2013-08-19 12:02:12

标签: c# pdf pagination itextsharp

我是iTextSharp的新手,想要将我的DataGridView转换为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的列数,所以我必须能够在预先添加列时计算宽度效果。

编辑:我想垂直拆分页面

1 个答案:

答案 0 :(得分:3)

您面临的问题是PDF不是HTML。 PDF中的页面具有固定大小。您没有滚动条,并且在调整查看器窗口大小时内容不会更改。

我将使用本书第4章中的JAVA示例回答。如果您需要这些示例的C#版本,则需要此网址:http://tinyurl.com/itextsharpIIA2C04

首先:表是否看起来不错是机器无法判断的。这只是人类可以做的事情。

好像你想要控制列的宽度。示例ColumnWidths为您提供了有关如何执行此操作的示例。在您的情况下,您应该使用涉及使用表的宽度的绝对值的解决方案。你会认识到这些解决方案,因为它们都有这个共同点:

table.setLockedWidth(true);

如果要计算每行或整个表的高度,则必须使用绝对宽度。一个常见问题是“我创建了一个表格,当我要求它的总宽度时,它会返回零。”它可以通过一个反问题回答:“iText怎么样如果你没有先定义宽度,计算一个表的高度?“这是一个修辞问题:在定义宽度之前不可能计算出高度。这显示在TableHeight示例中。

一旦定义了表格(及其列)的宽度,就可以计算出高度,并准备好将表格放在绝对位置。 Zhang示例显示了它是如何完成的。在此示例中,将创建一个包含4列的表。使用此突击队员绘制前两个列:

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坐标。当您控制布局时,您有责任计算这些坐标。