1

我是 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 的列数,所以我必须能够在预先添加列时计算出宽度上的效果。

编辑:我想垂直拆分页面

4

1 回答 1

3

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

我将使用本书第 4 章中的 JAVA 示例进行回答。如果您需要这些示例的 C# 版本,则需要以下 URL: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);

where2定义需要绘制的第一列,并-1指示应绘制所有剩余的列。

在这种情况下,0-1用于行。如果您的表格包含的行数超过一页,则必须进行数学运算以确保没有任何“从页面上掉下来”的行。

请注意,36and806表示 X 和 Y 坐标。当您控制布局时,您有责任计算这些坐标。

于 2013-08-19T13:22:06.987 回答