۱۳۹۰/۰۵/۲۶

چند ستونه كردن در iTextSharp


فرض كنيد جدولي داريد با چند ستون محدود كه نتيجه‌ي نهايي گزارش آن مثلا 100 صفحه است. جهت صرفه جويي در كاغذ مصرفي شايد بهتر باشد كه اين جدول را به صورت چند ستوني مثلا 5 ستون در يك صفحه نمايش داد؛ چيزي شبيه به شكل زير:


روش انجام اينكار به كمك iTextSharp به صورت زير است:


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

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.WidthPercentage = 100f;
                table1.HeaderRows = 2;
                table1.FooterRows = 1;

                //header row
                var headerCell = new PdfPCell(new Phrase("header"));
                table1.AddCell(headerCell);

                //footer row
                var footerCell = new PdfPCell(new Phrase(" "));
                table1.AddCell(footerCell);

                //adding some rows
                for (int i = 0; i < 400; i++)
                {
                    var rowCell = new PdfPCell(new Phrase(i.ToString()));
                    table1.AddCell(rowCell);
                }

                // wrapping table1 in multiple columns
                ColumnText ct = new ColumnText(pdfWriter.DirectContent);
                ct.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
                ct.AddElement(table1);

                int status = 0;
                int count = 0;
                int l = 0;
                int columnsWidth = 100;
                int columnsMargin = 7;
                int columnsPerPage = 4;
                int r = columnsWidth;
                bool isRtl = true;

                // render the column as long as it has content
                while (ColumnText.HasMoreText(status))
                {
                    if (isRtl)
                    {
                        ct.SetSimpleColumn(
                            pdfDoc.Right - l, pdfDoc.Bottom,
                            pdfDoc.Right - r, pdfDoc.Top
                        );
                    }
                    else
                    {
                        ct.SetSimpleColumn(
                            pdfDoc.Left + l, pdfDoc.Bottom,
                            pdfDoc.Left + r, pdfDoc.Top
                        );
                    }

                    var delta = columnsWidth + columnsMargin;
                    l += delta;
                    r += delta;

                    // render as much content as possible
                    status = ct.Go();

                    // go to a new page if you've reached the last column
                    if (++count > columnsPerPage)
                    {
                        count = 0;
                        l = 0;
                        r = columnsWidth;
                        pdfDoc.NewPage();
                    }
                }
            }

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


توضيحات:
تا قسمت تعريف جدول و اضافه كردن سطرها و ستون‌هاي مورد نظر، همان بحث «تكرار خودكار سرستون‌هاي يك جدول در صفحات مختلف، توسط iTextSharp» مي‌باشد.
اصل مطلب از قسمت ColumnText شروع مي‌شود. با استفاده از شيء ColumnText مي‌توان محتواي خاصي را در طي چند ستون در صفحه نمايش داد. عرض اين ستون‌ها هم توسط متد SetSimpleColumn مشخص مي‌شود و همچنين محل دقيق قرارگيري آن‌ها در صفحه. در اينجا دو حالت راست به چپ و چپ به راست در نظر گرفته شده است.
اگر حالت راست به چپ را در نظر بگيريم، محل قرارگيري اولين ستون از سمت راست صفحه (pdfDoc.Right) بايد تعيين شود. سپس هربار به اندازه‌ي عرضي كه مد نظر است بايد محل شروع ستون را مشخص كرد (pdfDoc.Right - l). هر زمانيكه ct.Go فراخواني مي‌شود، تاجايي كه ميسر باشد، اطلاعات جدول 1 در يك ستون درج مي‌شود. سپس بررسي مي‌شود كه تا اين لحظه چند ستون در صفحه نمايش داده شده است. اگر تعداد مورد نظر ما (columnsPerPage) تامين شده باشد، كار را در صفحه‌ي بعد ادامه خواهيم داد (pdfDoc.NewPage)، در غيراينصورت مجددا مكان يك ستون ديگر در همان صفحه تعيين شده و كار افزودن اطلاعات به آن آغاز خواهد شد و اين حلقه تا جايي كه تمام محتواي جدول 1 را درج كند، ادامه خواهد يافت.