پيشنياز : «تكرار خودكار سرستونهاي يك جدول در صفحات مختلف، توسط 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 .