/// <summary>
        /// Shows how to position and align text
        /// </summary>
        static void CreateDocumentText(C1PdfDocument pdf)
        {
            // use landscape for more impact
            pdf.Landscape = true;

            // measure and show some text
            var text = Strings.DocumentBasicText;
            var font = new Font("Segoe UI Light", 12, PdfFontStyle.Italic);

            // create StringFormat used to set text alignment and line spacing
            var fmt = new StringFormat();

            fmt.LineSpacing = -1.5; // 1.5 char height
            fmt.Alignment   = HorizontalAlignment.Center;

            // measure it
            var sz = pdf.MeasureString(text, font, 72 * 3, fmt);
            var rc = new Rect(pdf.PageRectangle.Width / 2, 72, sz.Width, sz.Height);

            rc = PdfUtils.Offset(rc, 110, 0);

            // draw a rounded frame
            rc = PdfUtils.Inflate(rc, 0, 0);
            pdf.FillRectangle(Colors.Teal, rc, new Size(0, 0));
            //pdf.DrawRectangle(new Pen(Colors.DarkGray, 5), rc, new Size(0, 0));
            rc = PdfUtils.Inflate(rc, -10, -10);

            // draw the text
            //pdf.RotateAngle = 90;
            pdf.DrawString(text, font, Colors.White, rc, fmt);
            //pdf.RotateAngle = 0;

            // point in center for rotate the text
            rc = pdf.PageRectangle;
            var pt = new Point(rc.X + rc.Width / 2, rc.Y + rc.Height / 2);

            // rotate the string in small increments
            var step = 6;

            text = Strings.DocumentBasicText2;
            for (int i = 0; i <= 360; i += step)
            {
                pdf.RotateAngle = i;
                var s = string.Format(text, i);
                font = new Font("Courier New", 8 + i / 30.0, PdfFontStyle.Bold);
                byte b = (byte)(255 * (1 - i / 360.0));
                pdf.DrawString(s, font, Color.FromArgb(0xff, b, b, b), pt);
            }
        }
Beispiel #2
0
        static void CreateDocumentTOC(C1PdfDocument pdf)
        {
            // create pdf document
            pdf.DocumentInfo.Title = Strings.TableOfContentsDocumentTitle;

            // add title
            Font titleFont = new Font("Tahoma", 24, PdfFontStyle.Bold);
            Rect rcPage    = PdfUtils.PageRectangle(pdf);
            Rect rc        = PdfUtils.RenderParagraph(pdf, pdf.DocumentInfo.Title, titleFont, rcPage, rcPage, false);

            rc.Y += 12;

            // create nonsense document
            var  bkmk       = new List <string[]>();
            Font headerFont = new Font("Arial", 14, PdfFontStyle.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 = PdfUtils.RenderParagraph(pdf, header, headerFont, rcPage, rc, true, true);

                // save bookmark to build TOC later
                int pageNumber = pdf.CurrentPage + 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    = PdfUtils.RenderParagraph(pdf, text, bodyFont, rcPage, rc);
                    rc.Y += 6;
                }
                rc.X     -= 36;
                rc.Width += 36;
                rc.Y     += 20;
            }

            // start Table of Contents
            pdf.NewPage();                      // start TOC on a new page
            int tocPage = pdf.CurrentPage;      // save page index (to move TOC later)

            rc        = PdfUtils.RenderParagraph(pdf, Strings.TableOfContentsDocumentTitle, 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 = C1.Xaml.Pdf.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
                pdf.DrawString(header, bodyFont, Colors.Black, rc);
                pdf.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  = pdf.MeasureString(dots, bodyFont).Width;
                var    x1   = rc.X + pdf.MeasureString(header, bodyFont).Width + 8;
                var    x2   = rc.Right - pdf.MeasureString(page, bodyFont).Width - 8;
                var    x    = rc.X;
                for (rc.X = x1; rc.X < x2; rc.X += wid)
                {
                    pdf.DrawString(dots, bodyFont, Colors.Gray, rc);
                }
                rc.X = x;
#else
                // connect with a dotted line (another option)
                var x1 = rc.X + pdf.MeasureString(header, bodyFont).Width + 5;
                var x2 = rc.Right - pdf.MeasureString(page, bodyFont).Width - 5;
                var y  = rc.Top + bodyFont.Size;
                pdf.DrawLine(dottedPen, x1, y, x2, y);
#endif
                // add local hyperlink to entry
                pdf.AddLink(Strings.PoundSign + header, rc);

                // move on to next entry
                rc = PdfUtils.Offset(rc, 0, rc.Height);
                if (rc.Bottom > rcPage.Bottom)
                {
                    pdf.NewPage();
                    rc.Y = rcPage.Y;
                }
            }

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