Beispiel #1
0
        static Rect RenderTableHeader(C1WordDocument word, Font font, Rect rc, string[] fields)
        {
            // calculate cell width (same for all columns)
            Rect rcCell = rc;

            rcCell.Width  = rc.Width / fields.Length;
            rcCell.Height = 0;

            // calculate cell height (max of all columns)
            foreach (string field in fields)
            {
                var height = word.MeasureString(field, font, rcCell.Width).Height;
                rcCell.Height = Math.Max(rcCell.Height, height);
            }
            rcCell.Height += 6; // add 6 point margin

            // render header cells
            var fmt = new StringFormat();

            fmt.LineAlignment = VerticalAlignment.Center;
            foreach (string field in fields)
            {
                word.FillRectangle(Colors.Black, rcCell);
                word.DrawString(field, font, Colors.White, rcCell, fmt);
                rcCell = WordUtils.Offset(rcCell, rcCell.Width, 0);
            }

            // update rectangle and return it
            return(WordUtils.Offset(rc, 0, rcCell.Height));
        }
Beispiel #2
0
        static Rect RenderTableRow(C1WordDocument word, Font font, Font hdrFont, Rect rcPage, Rect rc, string[] fields, DataRow dr)
        {
            // calculate cell width (same for all columns)
            Rect rcCell = rc;

            rcCell.Width  = rc.Width / fields.Length;
            rcCell.Height = 0;

            // calculate cell height (max of all columns)
            rcCell = WordUtils.Inflate(rcCell, -4, 0);
            foreach (string field in fields)
            {
                string text   = dr[field].ToString();
                var    height = word.MeasureString(text, font, rcCell.Width).Height;
                rcCell.Height = Math.Max(rcCell.Height, height);
            }
            rcCell         = WordUtils.Inflate(rcCell, 4, 0); // add 4 point margin
            rcCell.Height += 2;

            // break page if we have to
            if (rcCell.Bottom > rcPage.Bottom)
            {
                word.PageBreak();
                rc       = RenderTableHeader(word, hdrFont, rcPage, fields);
                rcCell.Y = rc.Y;
            }

            // center vertically just to show how
            StringFormat fmt = new StringFormat();

            fmt.LineAlignment = VerticalAlignment.Center;

            // render data cells
            foreach (string field in fields)
            {
                // get content
                string text = dr[field].ToString();

                // set horizontal alignment
                double d;
                fmt.Alignment = (double.TryParse(text, NumberStyles.Any, CultureInfo.CurrentCulture, out d))
                    ? HorizontalAlignment.Right
                    : HorizontalAlignment.Left;

                // render cell
                word.DrawRectangle(Colors.LightGray, rcCell);
                rcCell = WordUtils.Inflate(rcCell, -4, 0);
                word.DrawString(text, font, Colors.Black, rcCell, fmt);
                rcCell = WordUtils.Inflate(rcCell, 4, 0);
                rcCell = WordUtils.Offset(rcCell, rcCell.Width, 0);
            }

            // update rectangle and return it
            return(WordUtils.Offset(rc, 0, rcCell.Height));
        }
        void CreateDocumentVisualTree(C1WordDocument rtf, FrameworkElement targetElement)
        {
            // set up to render
            var font = new Font("Courier", 14);
            var img  = new WriteableBitmap(CreateBitmap(targetElement));

            // go render
            bool firstPage = true;

            foreach (Stretch stretch in new Stretch[] { Stretch.Fill, Stretch.None, Stretch.Uniform, Stretch.UniformToFill })
            {
                // add page break
                if (!firstPage)
                {
                    //rtf.NewPage();
                }
                firstPage = false;

                // set up to render
                var alignment = ContentAlignment.TopLeft;
                //var rc = WordUtils.Inflate(rtf.PageRectangle, -72, -72);
                var sz = rtf.PageSize;
                var rc = new Rect(72, 72, sz.Width - 144, sz.Height - 144);
                rc.Height /= 2;

                // render element as image
                rtf.DrawString("Element as Image, Stretch: " + stretch.ToString(), font, Colors.Black, rc);
                rc = WordUtils.Inflate(rc, -20, -20);
                //rtf.DrawImage(img, rc, alignment, stretch);
                rtf.DrawImage(img, rc);
                rtf.DrawRectangle(Colors.Green, rc);
                rc = WordUtils.Inflate(rc, +20, +20);
                rtf.DrawRectangle(Colors.Green, rc);

                // move to bottom of the page
                rc = WordUtils.Offset(rc, 0, rc.Height + 20);

                // render element
                rtf.DrawString("Element as VisualTree, Stretch: " + stretch.ToString(), font, Colors.Black, rc);
                rc = WordUtils.Inflate(rc, -20, -20);
                rtf.DrawElement(targetElement, rc, alignment, stretch);
                rtf.DrawRectangle(Colors.Green, rc);
                rc = WordUtils.Inflate(rc, +20, +20);
                rtf.DrawRectangle(Colors.Green, rc);
            }
        }
Beispiel #4
0
        //---------------------------------------------------------------------------------
        #region ** table of contents

        static void CreateDocumentTOC(C1WordDocument word)
        {
            // create pdf document
            word.Info.Title = "Document with Table of Contents";

            // add title
            Font titleFont = new Font("Tahoma", 24, RtfFontStyle.Bold);
            Rect rcPage    = WordUtils.PageRectangle(word);
            Rect rc        = WordUtils.RenderParagraph(word, word.Info.Title, titleFont, rcPage, rcPage, false);

            rc.Y += 12;

            // create nonsense document
            var  bkmk       = new List <string[]>();
            Font headerFont = new Font("Arial", 14, RtfFontStyle.Bold);
            Font bodyFont   = new Font("Times New Roman", 11);

            for (int i = 0; i < 30; i++)
            {
                // create ith header (as a link target and outline entry)
                string header = string.Format("{0}. {1}", i + 1, BuildRandomTitle());
                rc = WordUtils.RenderParagraph(word, header, headerFont, rcPage, rc, true, true);

                // save bookmark to build TOC later
                int pageNumber = 1;
                bkmk.Add(new string[] { pageNumber.ToString(), header });

                // create some text
                rc.X     += 36;
                rc.Width -= 36;
                for (int j = 0; j < 3 + _rnd.Next(20); j++)
                {
                    string text = BuildRandomParagraph();
                    rc    = WordUtils.RenderParagraph(word, text, bodyFont, rcPage, rc);
                    rc.Y += 6;
                }
                rc.X     -= 36;
                rc.Width += 36;
                rc.Y     += 20;
            }

            // start Table of Contents
            word.PageBreak();                   // start TOC on a new page
            //int tocPage = word.CurrentPage;	// save page index (to move TOC later)
            //int tocPage = 1;	// save page index (to move TOC later)
            rc        = WordUtils.RenderParagraph(word, "Table of Contents", titleFont, rcPage, rcPage, true);
            rc.Y     += 12;
            rc.X     += 30;
            rc.Width -= 40;

            // render Table of Contents
            Pen dottedPen = new Pen(Colors.Gray, 1.5f);

            dottedPen.DashStyle = DashStyle.Dot;
            StringFormat sfRight = new StringFormat();

            sfRight.Alignment = HorizontalAlignment.Right;
            rc.Height         = bodyFont.Size * 1.2;
            foreach (string[] entry in bkmk)
            {
                // get bookmark info
                string page   = entry[0];
                string header = entry[1];

                // render header name and page number
                word.DrawString(header, bodyFont, Colors.Black, rc);
                word.DrawString(page, bodyFont, Colors.Black, rc, sfRight);

#if true
                // connect the two with some dots (looks better than a dotted line)
                string dots = ". ";
                var    wid  = word.MeasureString(dots, bodyFont).Width;
                var    x1   = rc.X + word.MeasureString(header, bodyFont).Width + 8;
                var    x2   = rc.Right - word.MeasureString(page, bodyFont).Width - 8;
                var    x    = rc.X;
                for (rc.X = x1; rc.X < x2; rc.X += wid)
                {
                    word.DrawString(dots, bodyFont, Colors.Gray, rc);
                }
                rc.X = x;
#else
                // connect with a dotted line (another option)
                var x1 = rc.X + word.MeasureString(header, bodyFont).Width + 5;
                var x2 = rc.Right - word.MeasureString(page, bodyFont).Width - 5;
                var y  = rc.Top + bodyFont.Size;
                word.DrawLine(dottedPen, x1, y, x2, y);
#endif
                // add local hyperlink to entry
                //rtf.AddLink("#" + header, rc);

                // move on to next entry
                rc = WordUtils.Offset(rc, 0, rc.Height);
                if (rc.Bottom > rcPage.Bottom)
                {
                    word.PageBreak();
                    rc.Y = rcPage.Y;
                }
            }

            // move table of contents to start of document
            //var arr = new WordPage[rtf.Pages.Count - tocPage];
            //rtf.Pages.CopyTo(tocPage, arr, 0, arr.Length);
            //rtf.Pages.RemoveRange(tocPage, arr.Length);
            //rtf.Pages.InsertRange(0, arr);
        }