0

ドキュメントの各ページにヘッダーとフッターを自動的に追加できるようにするために、PdfPageEventHelper を使用しています。多くの場所で言及されているように、OnEndPage をオーバーライドしながらそうしています。私のクラスで私は作成しています:

  1. Pdfドキュメント
  2. FileStream の作成
  3. 静的 GetInstance メソッドで PdfWriter を取得する
  4. 作成した特定の PdfPageEventHelper クラスを writer.PageEvent に設定する
  5. ドキュメントにライターを追加する
  6. ドキュメントを開く
  7. ドキュメントにコンテンツを追加する (1 つの行を持つ 1 つの非常に小さなテーブル)
  8. ドキュメントの終了を呼び出す

今 - ステップ8で OnEndPage が呼び出されています。これは素晴らしいことですが、どういうわけか 2 回呼び出されています。どちらの場合もページ番号 1 に呼び出されます (実行時にドキュメント パラメータで確認できるように)。したがって、ドキュメントに 1 ページではなく 2 ページが表示されます。2 ページ目は空で、最初のページには実際にヘッダーとフッターを 2 回 (オーバーラップ)。私は iTextSharp バージョン 5.5.1.0 を使用しています。ソース ファイルで、Document.Close メソッドで NewPage 関数を呼び出していることがわかりました。これが、2 回目に OnEndPage に到達する理由です。助言がありますか?

class MyPdfWriter
{
public MyPdfWriter()
{
//generate doc, file stream etc.
_document = _document = new PdfDocument();
_document.SetMargins(15, 15, 50, 50);
_document.SetPageSize(PageSize.A4);

_fs = new FileStream("myTest.pdf", FileMode.Create);
_writer = PdfWriter.GetInstance(_document, _fs);
_writer.PageEmpty = false;
_writer.PageEvent = new PdfPage(reportDetails.Header,reportDetails.Footer,reportDetails.LogoImage, reportDetails.ReportFileName);            

//open doc
_document.Open();

//add some content
var table = new PdfPTable(1);
table.AddCell("bla bla");
_document.Add(titleTable);

//close doc, stream etc.

if (_document != null && _document.IsOpen())
{
_document.Close();
 _document = null;
}

if (_writer != null)
{
 _writer.Close();
_writer = null;
}

if (_fs != null)
{
 _fs.Close();
 _fs.Dispose();
}
}
}


class PdfPage : PdfPageEventHelper
{
public override void OnEndPage(PdfWriter writer, Document document)
    {
        var footer = new PdfPTable(2);

        //Write some cells to footer
        //....


        //init the width
        footer.TotalWidth = (footer.TotalWidth.CompareTo(0f) != 0) ? footer.TotalWidth : document.PageSize.Width;
        //write the table with WriteSelectedRows
        footer.WriteSelectedRows(0, -1, document.LeftMargin, footer.TotalHeight + 10f, writer.DirectContent);


        var Header = new PdfPTable(2);

        //Write some cells to Header
        //....

        //init the width
        Header.TotalWidth = (Header.TotalWidth.CompareTo(0f) != 0) ? Header.TotalWidth : document.PageSize.Width;
        //write the table with WriteSelectedRows
        Header.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.Height - 10,
                                     writer.DirectContent);
    }
}
4

0 に答える 0