تکرار خودکار سرستون‌های یک جدول در صفحات مختلف، توسط iTextSharp
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه


یکی از نیازهای تهیه یک گزارش خوب، تکرار سرستون‌ها در صفحات مختلف است. شاید در ابتدا این ایده مطرح شود که مثلا می‌خواهیم 25 ردیف را در هر صفحه نمایش دهیم. بر همین اساس می‌توان هر 25 ردیف یکبار، یک سطر footer و در ادامه در صفحه بعد یک سطر header را اضافه کرد و همینطور الی آخر. مهمترین ایراد این روش آن است که الزامی ندارد که واقعا 25 ردیف در یک صفحه جا شوند. عموما بر اساس اندازه‌ی محتوای نمایش داده شده، ممکن است یک صفحه 20 ردیف شود، صفحه‌ای دیگر 10 ردیف. این مورد تمام محاسبات را به هم خواهد ریخت. به همین جهت دو خاصیت مهم به نام‌های HeaderRows و FooterRows در شیء PdfPTable قابل تنظیم است. این دو خاصیت نیاز به اندکی توضیح دارند که در ادامه ذکر خواهد شد:
using System.Diagnostics;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace HeadersAndFooters
{
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(1);
table1.HeaderRows = 2;
table1.FooterRows = 1;

//header row
table1.AddCell(new Phrase("header"));

//footer row
table1.AddCell(new Phrase("footer"));

//adding some rows
for (int i = 0; i < 70; i++)
{
table1.AddCell(new Phrase("Row " + i));
}

pdfDoc.Add(table1);
}

//open the final file with adobe reader for instance.
Process.Start("Test.pdf");
}
}
}
در این مثال، یک جدول ساده با یک ستون تعریف شده و سپس HeaderRows آن به 2 و FooterRows آن به 1 مقدار دهی شده‌‌اند.
HeaderRows = 2 به این معنا است که 2 سطری را که بلافاصله در ادامه اضافه می‌کنید، در محاسبات نمایش خودکار header یا footer قرار می‌گیرند. FooterRows = 1 به این معنا است که از این تعداد، آخرین سطر، معنای footer را می‌دهد. بنابراین اولین table1.AddCell ، همان header خودکار نمایش داده شده در بالای تمام صفحات خواهد بود و table1.AddCell بعدی جهت نمایش footer خودکار بکار می‌رود. این دو سطر کاربرد دیگری ندارند.
مثالی دیگر جهت مشخص شدن این مفاهیم:
table1.HeaderRows = 3;
table1.FooterRows = 1;
در اینجا HeaderRows = 3 یعنی پس از تعریف وهله‌ای از شیء PdfPTable، سه سطر اولی که اضافه می‌شوند جزو حیطه‌ی header و footer خودکار قرار دارند. در این بین چون FooterRows = 1 تعریف شده، 2 سطر اول header تکرار شونده صفحات مختلف را تشکیل می‌دهند و سومین سطر همان footer خواهد بود.

از این طراحی لذت می‌برید؟!

  • #
    ‫۱۱ سال و ۴ ماه قبل، پنجشنبه ۳۰ خرداد ۱۳۹۲، ساعت ۱۵:۳۳
    با سلام و ممنون از مطالب بسیار خوبتون در مورد itextsharp
    در این مثال اگر جدول مثلا چهار ستونه باشه و هدر ، فوتر هر کدام سه ستون.به چه صورت خواهد بود؟
    ممنونم میشم اگه راهنماییم کنید.
    • #
      ‫۱۱ سال و ۴ ماه قبل، پنجشنبه ۳۰ خرداد ۱۳۹۲، ساعت ۱۶:۱۰
      قسمت «مثالی دیگر جهت مشخص شدن این مفاهیم:» را یکبار دیگر مطالعه کنید.
  • #
    ‫۵ سال و ۴ ماه قبل، شنبه ۴ خرداد ۱۳۹۸، ساعت ۰۱:۱۱
    یک نکته‌ی تکمیلی: ایجاد جدول‌های تو در تو در itextsharp

    فرض کنید می‌خواهید فرمی را چاپ کنید که با ساختار اضافه نمودن جدول به عنوان یک ردیف قابل پیاده سازی نمی‌باشد و نیاز به استفاده از جداول تو در تو را دارید. با استفاده از مثال و قطعه کد زیر می‌توانید جدولی nested را در جدول اصلی پیاده سازی کنید:
    PdfPTable table = new PdfPTable(4);
    table.TotalWidth = 400f;
    table.LockedWidth = true;
    PdfPCell header = new PdfPCell(new Phrase("Header"));
    header.Colspan = 4;
    table.AddCell(header);
    table.AddCell("Cell 1");
    table.AddCell("Cell 2");
    table.AddCell("Cell 3");
    table.AddCell("Cell 4");
    
    PdfPTable nested = new PdfPTable(1);
    nested.AddCell("Nested Row 1");
    nested.AddCell("Nested Row 2");
    nested.AddCell("Nested Row 3");
    
    PdfPCell nesthousing = new PdfPCell(nested);
    nesthousing.Padding = 0f;
    table.AddCell(nesthousing);
    PdfPCell bottom = new PdfPCell(new Phrase("bottom"));
    bottom.Colspan = 3;
    table.AddCell(bottom);
    
    doc.Add(table);
    و خروجی همانند شکل زیر را خواهید داشت.