۱۳۹۰/۱۰/۱۴

تعيين تعداد رديف در صفحه جداول خودكار iTextSharp


پيشنياز : «تكرار خودكار سرستون‌هاي يك جدول در صفحات مختلف، توسط iTextSharp»
همانطور كه در مطلب پيشنياز عنوان شده ذكر گرديد، iTextSharp امكان درج خودكار header و footer به علاوه محاسبه خودكار تعداد رديف‌هاي يك جدول در يك صفحه را بر اساس طول و اندازه محتواي هر رديف، دارد. براي مثال يك صفحه ممكن است 2 رديف شود و يك صفحه 20 رديف. تمام اين‌ها را به صورت خودكار محاسبه مي‌كند و بسيار عالي است. (اين امكان مهمي است كه خيلي از ابزارهاي گزارشگيري موجود هنوز با آن مشكل دارند)
اما اگر فرض را بر اين بگذاريم كه اندازه سلول‌ها و در نتيجه طول هر رديف ثابت است و مثلا تمام صفحات نهايتا از يك تعداد رديف مشخص تشكيل خواهند شد، خاصيتي را به نام number of rows يا rows count و امثال آن‌را ندارد كه مثلا به آن گفت، من در هر صفحه فقط 5 رديف را مي‌خواهم نمايش دهم و نه 20 رديف را.
روش حل اين مساله را در ادامه ملاحظه خواهيد كرد و يك نكته‌ي خيلي ساده و مستند نشده دارد!

using System.Diagnostics;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace RowsCountSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var pdfDoc = new Document(PageSize.A4))
            {
                var pdfWriter = PdfWriter.GetInstance(pdfDoc, new FileStream("Test.pdf", FileMode.Create));
                pdfDoc.Open();

                var table1 = new PdfPTable(3);
                table1.HeaderRows = 2;
                table1.FooterRows = 1;

                //header row  
                var headerCell = new PdfPCell(new Phrase("header"));
                headerCell.Colspan = 3;
                headerCell.HorizontalAlignment = Element.ALIGN_CENTER;
                table1.AddCell(headerCell);

                //footer row  
                var footerCell = new PdfPCell(new Phrase("footer"));
                footerCell.Colspan = 3;
                footerCell.HorizontalAlignment = Element.ALIGN_CENTER;
                table1.AddCell(footerCell);

                //adding some rows  
                for (int i = 0; i < 70; i++)
                {
                    //adds a new row
                    table1.AddCell(new Phrase("Cell[0], Row[" + i + "]"));
                    table1.AddCell(new Phrase("Cell[1], Row[" + i + "]"));
                    table1.AddCell(new Phrase("Cell[2], Row[" + i + "]"));

                    //sets the number of rows per page
                    if (i > 0 && table1.Rows.Count % 7 == 0)
                    {
                        pdfDoc.Add(table1);
                        table1.DeleteBodyRows();
                        pdfDoc.NewPage();
                    }
                }

                pdfDoc.Add(table1);
            }

            //open the final file with adobe reader for instance.  
            Process.Start("Test.pdf");
        }
    }
}

نكته جديد اين مثال، قسمت زير است:


if (i > 0 && table1.Rows.Count % 7 == 0)
{
      pdfDoc.Add(table1);
      table1.DeleteBodyRows();
      pdfDoc.NewPage();
}

هر زمان كه table1 به صفحه اضافه شود، header و footer هم اضافه خواهند شد، اما اگر BodyRows آن حذف نشود،‌ دفعه‌ي دومي كه اين table به صفحه اضافه مي‌شود، شامل رديف‌هاي مثلا يك تا 10 خواهد بود بجاي 6 تا 10 .