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 );
    }
  }

1つの解決策は、ページにフルサイズで印刷できる列の数をどうにかして知り、新しいページを追加して、そこに表示されるグリッドを増やすことですが、新しいページを検出する方法がわかりません。ここでの問題は、PdfPtable の列数を変更する方法がないように思われるため、事前に列を追加するときの幅の影響を計算できる必要があることです。

EDIT:ページを縦に分割したい

4

1 に答える 1

3

あなたが直面している問題は、PDF が HTML ではないという事実です。PDF のページは固定サイズです。スクロールバーがなく、ビューア ウィンドウのサイズを変更してもコンテンツは変化しません。

私の本の第 4 章の Java の例を使用して答えます。これらの例の C# バージョンが必要な場合は、次の URL が必要です: http://tinyurl.com/itextsharpIIA2C04

まず、テーブルが見栄えがするかどうかは、機械には判断できないことです。それは人間にしかできないことです。

列の幅を制御したいようです。ColumnWidthsの例では、その方法についていくつかの例を示しています。あなたの場合、テーブルの幅に絶対値を使用するソリューションを使用する必要があります。これらのソリューションはすべて、次の行に共通しているため、認識できます。

table.setLockedWidth(true);

各行またはテーブル全体の高さを計算する場合は、絶対幅の使用が必須です。よく寄せられる質問は、「テーブルを作成しましたが、その合計幅を尋ねるとゼロが返されます」というものです。「最初に幅を定義しなかった場合、iText はテーブルの高さをどのように計算できますか?」という反対の質問で答えることができます。これは修辞的な問題です。幅が定義される前に高さを計算することは不可能です。それはTableHeightの例に示されています。

テーブル (およびその列) の幅を定義したら、高さを計算して、テーブルを絶対位置に配置する準備が整います。Zhangの例は、その方法を示しています。この例では、4 列のテーブルが作成されます。最初の 2 つの列は、次のコマンドを使用して描画されます。

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

最初0の は描画する必要がある最初の列を2定義し、 は描画されない最初の列を定義します。残りの列は、次のコマンドを使用して次のページに描画されます。

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

Where2は、描画する必要がある最初の列を定義し、-1残りのすべての列を描画する必要があることを示します。

この場合、0and-1は行に使用されます。テーブルに含まれる行の数が 1 ページに収まらない場合は、「ページからはみ出す」行がないことを確認するために計算を行う必要があります。

36と は、X 座標と Y 座標を806表すことに注意してください。レイアウトを制御するときは、それらの座標を計算する必要があります。

于 2013-08-19T13:22:06.987 に答える