示例#1
0
        static Document _createDocument <T>(IEnumerable <T> items, ArrayToPdfScheme <T> scheme)
        {
            var document = new Document();

            document.UseCmykColor = true;
            document.Info.Title   = scheme.Title;
            document.Info.Subject = scheme.Subject;
            document.Info.Author  = scheme.Author;

            document.DefaultPageSetup.PageFormat     = (PageFormat)scheme.PageFormat;
            document.DefaultPageSetup.Orientation    = (Orientation)scheme.PageOrientation;
            document.DefaultPageSetup.HeaderDistance = Unit.FromMillimeter(scheme.PageMarginTop);
            document.DefaultPageSetup.FooterDistance = Unit.FromMillimeter(scheme.PageMarginBottom);
            document.DefaultPageSetup.TopMargin      = Unit.FromMillimeter(scheme.PageMarginTop + (string.IsNullOrWhiteSpace(scheme.Header) ? 0 : scheme.HeaderHeight));
            document.DefaultPageSetup.RightMargin    = Unit.FromMillimeter(scheme.PageMarginRight + _tableLeftBias);
            document.DefaultPageSetup.BottomMargin   = Unit.FromMillimeter(scheme.PageMarginBottom + (string.IsNullOrWhiteSpace(scheme.Footer) ? 0 : scheme.FooterHeight));
            document.DefaultPageSetup.LeftMargin     = Unit.FromMillimeter(scheme.PageMarginLeft - _tableLeftBias);

            Unit width, height;

            PageSetup.GetPageSize(document.DefaultPageSetup.PageFormat, out width, out height);
            document.DefaultPageSetup.PageWidth  = width;
            document.DefaultPageSetup.PageHeight = height;

            var innerWidth = Unit.FromPoint(document.DefaultPageSetup.GetWidth() - document.DefaultPageSetup.LeftMargin - document.DefaultPageSetup.RightMargin);

            _addStyles(document, innerWidth);
            _addSection(document);
            _addHeader(document, innerWidth, scheme);
            _addFooter(document, innerWidth, scheme);
            _addTable(document, innerWidth, items, scheme);

            return(document);
        }
示例#2
0
 public static ArrayToPdfScheme <T> SetInfo <T>(this ArrayToPdfScheme <T> scheme, string title, string subject, string author)
 {
     scheme.Title   = title;
     scheme.Subject = subject;
     scheme.Author  = author;
     return(scheme);
 }
示例#3
0
        public static byte[] CreatePdf <T>(IEnumerable <T> items, Action <ArrayToPdfScheme <T> > schemeBuilder = null)
        {
            var scheme = new ArrayToPdfScheme <T>();

            schemeBuilder?.Invoke(scheme);
            return(_createPdf(items, scheme));
        }
示例#4
0
 /// <summary>Margin in Millimeters</summary>
 public static ArrayToPdfScheme <T> SetPageMargin <T>(this ArrayToPdfScheme <T> scheme, uint top, uint right, uint bottom, uint left)
 {
     scheme.PageMarginTop    = top;
     scheme.PageMarginRight  = right;
     scheme.PageMarginBottom = bottom;
     scheme.PageMarginLeft   = left;
     return(scheme);
 }
示例#5
0
 static byte[] _createPdf <T>(IEnumerable <T> items, ArrayToPdfScheme <T> scheme)
 {
     using (var ms = new MemoryStream())
     {
         var renderer = new PdfDocumentRenderer(true);
         renderer.Document = _createDocument(items, scheme);
         renderer.RenderDocument();
         renderer.PdfDocument.Save(ms);
         return(ms.ToArray());
     }
 }
示例#6
0
        static void _addHeader <T>(Document document, Unit innerWidth, ArrayToPdfScheme <T> scheme)
        {
            if (string.IsNullOrWhiteSpace(scheme.Header))
            {
                return;
            }

            var header    = document.LastSection.Headers.Primary;
            var paragraph = header.AddParagraph();

            paragraph.Format.LeftIndent = Unit.FromMillimeter(_tableLeftBias);
            paragraph.Format.Alignment  = (ParagraphAlignment)scheme.HeaderAlignment;
            paragraph.Format.Font.Size  = scheme.HeaderFontSize;
            paragraph.Format.Font.Bold  = scheme.HeaderFontBold;
            _addTmpText(paragraph, scheme.Header, scheme);
        }
示例#7
0
        static void _addTmpText <T>(Paragraph paragraph, string template, ArrayToPdfScheme <T> scheme)
        {
            foreach (var part in template.Split(new[] { '{', '}' }, StringSplitOptions.RemoveEmptyEntries))
            {
                switch (part)
                {
                case "TITLE":
                    paragraph.AddText(scheme.Title ?? string.Empty);
                    break;

                case "PAGE":
                    paragraph.AddPageField();
                    break;

                case "PAGES":
                    paragraph.AddNumPagesField();
                    break;

                default:
                    paragraph.AddText(part);
                    break;
                }
            }
        }
示例#8
0
        static void _addTable <T>(Document document, Unit innerWidth, IEnumerable <T> items, ArrayToPdfScheme <T> scheme)
        {
            if (scheme.Columns.Count == 0)
            {
                return;
            }

            var table = new Table();

            table.Format.Font.Size = Unit.FromPoint(scheme.TableFontSize);
            table.Borders.Width    = 0.5;


            var colWidth       = Unit.FromPoint(innerWidth / scheme.Columns.Count);
            var settedWidth    = scheme.Columns.Sum(x => x.Width ?? 0);
            var autoWidthCount = scheme.Columns.Count(x => !x.Width.HasValue);
            var autoWidth      = (innerWidth.Millimeter - settedWidth) / (autoWidthCount > 0 ? autoWidthCount : 1);

            // create columns
            scheme.Columns.ForEach(x => table.AddColumn(Unit.FromMillimeter(x.Width ?? autoWidth)).Format.Alignment = (ParagraphAlignment)(x.Alignment ?? scheme.TableAlignment));

            // add header
            var row = table.AddRow();

            row.TopPadding        = 2;
            row.BottomPadding     = 2;
            row.HeadingFormat     = true;
            row.Format.Font.Bold  = true;
            row.Shading.Color     = Colors.LightGray;
            row.VerticalAlignment = VerticalAlignment.Center;
            scheme.Columns.ForEach(x => row.Cells[x.Index].AddParagraph(x.Name ?? string.Empty));

            // add rows
            //var itemsCount = 0;
            foreach (var item in items)
            {
                //itemsCount++;
                row                   = table.AddRow();
                row.TopPadding        = 1;
                row.BottomPadding     = 1;
                row.VerticalAlignment = VerticalAlignment.Center;
                foreach (var col in scheme.Columns)
                {
                    var value = col.ValueFn(item);
                    var cell  = row.Cells[col.Index];
                    cell.AddParagraph(value?.ToString() ?? string.Empty);
                }
            }

            //table.SetEdge(0, 0, scheme.Columns.Count, itemsCount+1, Edge.Box, BorderStyle.Single, 1, Colors.Black);
            document.LastSection.Add(table);
        }