GcDocsDataSheet.cs
// // This code is part of Document Solutions for PDF demos. // Copyright (c) MESCIUS inc. All rights reserved. // using System; using System.IO; using System.Drawing; using System.Linq; using System.Collections.Generic; using GrapeCity.Documents.Pdf; using GrapeCity.Documents.Pdf.AcroForms; using GrapeCity.Documents.Text; using GrapeCity.Documents.Common; using GrapeCity.Documents.Drawing; using System.Numerics; using DsPdfWeb.Demos.Common; namespace DsPdfWeb.Demos { // This sample generates a two-page data sheet about the new // Document Solutions product line. public class GcDocsDataSheet { private FontCollection _fc = new FontCollection(); Color _darkGray = Color.FromArgb(64, 64, 64); Color _lightGray = Color.FromArgb(232, 232, 232); Color _blue = Color.FromArgb(0x3B, 0x5C, 0xAA); List<IDisposable> _disposables = new List<IDisposable>(); // Main entry point of this sample: public int CreatePDF(Stream stream) { var doc = new GcPdfDocument(); _fc.RegisterDirectory(Path.Combine("Resources", "Fonts")); // First page: Page1(doc); // Second page: Page2(doc); // Save the PDF: doc.Save(stream); // Dispose images after the document has been saved: _disposables.ForEach(d_ => d_.Dispose()); // Done: return doc.Pages.Count; } IImage GetImage(string path) { var image = Util.ImageFromFile(path); _disposables.Add(image); return image; } void Page1(GcPdfDocument doc) { var page = doc.Pages.Add(); var g = page.Graphics; var tl = new TextLayout(g.Resolution) { FontCollection = _fc }; var gclogo = GetImage(Path.Combine("Resources", "ImagesBis", "gc-logo-100px.png")); var gclogoRc = new RectangleF(36, 0, 72 * 1.8f, 72); g.DrawImage(gclogo, gclogoRc, null, new ImageAlign(ImageAlignHorz.Left, ImageAlignVert.Center, true, true, true, false, false), out RectangleF[] rcs); g.DrawLine(rcs[0].Right + 10, rcs[0].Top, rcs[0].Right + 10, rcs[0].Bottom, _darkGray, 1); tl.Clear(); tl.ParagraphAlignment = ParagraphAlignment.Center; tl.MaxHeight = gclogoRc.Height; tl.Append("Developer Solutions", new TextFormat() { FontName = "open sans", FontSize = 16, ForeColor = _darkGray }); tl.PerformLayout(true); g.DrawTextLayout(tl, new PointF(gclogoRc.Right + 20, gclogoRc.Y)); var back = GetImage(Path.Combine("Resources", "ImagesBis", "GCDocs-datasheet-sm.png")); var backRcClip = new RectangleF(0, 72, page.Size.Width, page.Size.Width - 72 * 1.75f); var backRc = new RectangleF(-72, -72 * 4, page.Size.Width + 72 * 4, page.Size.Height + 72 * 4); g.DrawImage(back, backRc, backRcClip, ImageAlign.StretchImage); g.FillRectangle(new RectangleF(0, backRcClip.Bottom, page.Size.Width, page.Size.Height - backRcClip.Bottom), _lightGray); g.DrawLine(backRcClip.X, backRcClip.Bottom, backRcClip.Right, backRcClip.Bottom, Color.White, 1, null); g.DrawLine(backRcClip.X, backRcClip.Bottom + 1, backRcClip.Right, backRcClip.Bottom + 1, _darkGray, 1, null); var blueRc = new RectangleF(0, backRcClip.Y, page.Size.Width, 72 * 4); g.FillRectangle(blueRc, Color.FromArgb(220, _blue)); blueRc.Inflate(0, -36); g.FillRectangle(new RectangleF(blueRc.Location, new SizeF(10, blueRc.Height)), Color.White); blueRc.Inflate(-36, 0); tl.Clear(); tl.ParagraphAlignment = ParagraphAlignment.Near; tl.MaxWidth = blueRc.Width; tl.MaxHeight = blueRc.Height; tl.Append("NEW PRODUCT LINE", new TextFormat() { FontName = "open sans semibold", FontSize = 20, ForeColor = Color.White }); tl.PerformLayout(true); g.DrawTextLayout(tl, blueRc.Location); var midRc = new RectangleF(blueRc.X, blueRc.Y + tl.ContentHeight, blueRc.Width, blueRc.Height - tl.ContentHeight); tl.Clear(); tl.ParagraphAlignment = ParagraphAlignment.Far; tl.Append( "Take total control of your digital documents with this NEW collection of ultra-fast, low-footprint document APIs for .NET Standard 2.0. These intuitive, extensible APIs " + "allow you to create, load, modify, and save Excel spreadsheets and PDF files in any .NET Standard 2.0 application", new TextFormat() { FontName = "open sans light", FontSize = 14, ForeColor = Color.White }); tl.PerformLayout(true); g.DrawTextLayout(tl, blueRc.Location); midRc.Height -= tl.ContentHeight; midRc.Inflate(0, -20); var hex = GetImage(Path.Combine("Resources", "ImagesBis", "gcd-hex-logo-white.png")); var hexRc = new RectangleF(midRc.Location, new SizeF(midRc.Height, midRc.Height)); g.DrawImage(hex, hexRc, null, ImageAlign.StretchImage); tl.Clear(); tl.ParagraphAlignment = ParagraphAlignment.Center; tl.MaxHeight = midRc.Height; tl.Append("Document Solutions", new TextFormat() { FontName = "open sans semibold", FontSize = 26, ForeColor = Color.White }); tl.PerformLayout(true); g.DrawTextLayout(tl, new PointF(midRc.X + midRc.Height + 10, midRc.Y)); var pointRc = new RectangleF(0, backRcClip.Bottom, page.Size.Width / 2, (page.Size.Height - backRcClip.Bottom) / 2 - 12); tl.ParagraphAlignment = ParagraphAlignment.Near; tl.MaxWidth = pointRc.Width; tl.MaxHeight = pointRc.Height; tl.MarginLeft = 80; tl.MarginTop = 25; tl.MarginBottom = 0; addPoint(GetImage(Path.Combine("Resources", "ImagesBis", "ico-hex-.NET.png")), "Expand the reach of modern apps", "With full support for .NET Standard 2.0, you can target multiple platforms, devices, and cloud with one code base."); pointRc.Offset(0, pointRc.Height); addPoint(GetImage(Path.Combine("Resources", "ImagesBis", "ico-hex-code.png")), "Comprehensive, highly programmable", "Do more with your Excel spreadsheets and PDFs: these APIs support Windows, Mac, Linux, and a wide variety of features for your documents."); pointRc.Offset(pointRc.Width, -pointRc.Height); tl.MarginRight = 30; addPoint(GetImage(Path.Combine("Resources", "ImagesBis", "ico-hex-speed.png")), "High-speed, small footprint", "The API architecture is designed to generate large, optimized documents, fast—while remaining lightweight and extensible."); pointRc.Offset(0, pointRc.Height); addPoint(GetImage(Path.Combine("Resources", "ImagesBis", "ico-hex-nodependences.png")), "No dependencies", "Generate and edit digital documents with no Acrobat or Excel dependencies."); g.FillRectangle(new RectangleF(0, page.Size.Height - 16, page.Size.Width, 16), _darkGray); drawCircle(new PointF(page.Size.Width - 160, backRcClip.Bottom - 105)); void addPoint(IImage img, string caption, string text) { var imgRc = new RectangleF(pointRc.X + 20, pointRc.Y + tl.MarginTop, 48, 48); g.DrawImage(img, imgRc, null, new ImageAlign() { AlignHorz = ImageAlignHorz.Center, AlignVert = ImageAlignVert.Center, BestFit = true }); tl.Clear(); tl.AppendLine(caption, new TextFormat() { FontName = "open sans semibold", FontSize = 11 }); tl.Append(text, new TextFormat() { FontName = "open sans light", FontSize = 11 }); tl.PerformLayout(true); if (!tl.ContentHeightFitsInBounds) throw new Exception("Unexpected: text overflow."); g.DrawTextLayout(tl, pointRc.Location); } void drawCircle(PointF p) { float D = 128; float angle = (float)(16 * Math.PI) / 180f; g.Transform = Matrix3x2.CreateTranslation(-D / 2, -D / 2) * Matrix3x2.CreateRotation(angle) * Matrix3x2.CreateTranslation(p.X + D / 2, p.Y + D / 2); var r = new RectangleF(PointF.Empty, new SizeF(D, D)); for (int i = 0; i < 3; ++i) { g.FillEllipse(r, Color.FromArgb(30 + i * 10, _darkGray)); r.Inflate(-1, -1); } g.FillEllipse(r, _darkGray); r.Inflate(-1, -1); g.FillEllipse(r, Color.White); r.Inflate(-6, -6); g.FillEllipse(r, _darkGray); tl.Clear(); tl.MaxHeight = tl.MaxWidth = D; tl.MarginLeft = tl.MarginRight = tl.MarginTop = tl.MarginBottom = 0; tl.TextAlignment = TextAlignment.Center; tl.ParagraphAlignment = ParagraphAlignment.Center; tl.ParagraphSpacing = -4; var tf = new TextFormat() { FontName = "open sans light", FontSize = 18, ForeColor = Color.White }; tl.Append("DEPLOY\nTO", tf); tl.Append(" AZURE\n", new TextFormat(tf) { FontName = "open sans semibold" }); tl.Append(" "); tl.PerformLayout(true); g.DrawTextLayout(tl, PointF.Empty); g.Transform = Matrix3x2.Identity; } } void Page2(GcPdfDocument doc) { var page = doc.Pages.Add(); var g = page.Graphics; var tl = new TextLayout(g.Resolution) { FontCollection = _fc }; var col0X = 36; var colWidth = page.Size.Width / 3 - 40; var colGap = 20; var vgap = 10; var ser1Y = 100; var ser2Y = 72 * 6; var h = 45; List<(string caption, List<string> points)> dspdf = new List<(string, List<string>)>() { ("Advanced Text Handling", new List<string> { "Standard PDF Fonts, Truetype Fonts, Open type Fonts, WOFF Fonts, system font loading, font embedding, fallback and linked fonts, EUDC fonts", "Advanced text rendering features", "Special character support", }), ("Cross-Platform, Cross-Framework compatibility", new List<string> { ".NET Standard 2.0", ".NET Core 2.0", ".NET Framework", "Mono", "Xamarin iOS", "VSTO-style API" }), ("Security", new List<string> { "Encryption and decrpyption", "User and owner passwords", "AllowCopyContent, AllowEditAnnotations, AllowEditContent, AllowPrint", "Digital Signatures" }), ("Annotations", new List<string> { "Figures", "Comments", "Text", "Signatures", "Stamps", "Modify, extract or delete annotations from existing PDFs" }), ("Fillable Form Fields", new List<string> { "Textbox", "Checkbox", "Combobox", "Listbox", "Radio button", "Push button", "Signature field", "Modify, extract or delete form fields from existing PDFs" }), ("Navigation", new List<string> { "Outlines", "Hyperlinks" }), ("Additional Features", new List<string> { "50 barcodes and properties", "Create PDF/A files", "Maintain document history with document properties", "Generate linearized PDFs for fast web view", "Full image and graphic support on all platforms", "Add and delete pages", "Chage page sizes", "Page orientation" }), }; List<(string caption, List<string> points)> gcexcel = new List<(string, List<string>)>() { ("Fast and Efficient", new List<string> { "Lightweight", "Optimized for processing large Excel documents quickly" }), ("Cross-Platform, Cross-Framework compatibility", new List<string> { ".NET Standard 2.0", ".NET Core 2.0", ".NET Framework", "Mono", "Xamarin.iOS", "VSTO-style API", }), ("Data Visualization", new List<string> { "Shapes and pictures", "Slicers", "Sparklines", "Charts", }), ("Powerful Calculation Engine", new List<string> { "450+ Excel functions", "Calculate", "Query", "Generate", "Sorting", "Filtering", "Grouping", }), ("Seamless Excel Compatibility", new List<string> { "Import and export Excel files", "Export to PDF", "Encrypt files", "Workbooks and worksheets", "Cell range operations", "Pivot and Excel tables", "Data validation", "Annotations", "Comments", }), ("Conditional Formatting Rules", new List<string> { "Cell value", "Average", "Color scale", "Data bar", "Icon sets", "Top and Bottom", "Unique", "Expression", }), ("Flexible Themes And Components", new List<string> { "Customizable themes", "Configurable components", "Summary data", "Custom styles", "Embedded drawing objects", "Integrated calculation engine", }), }; addHeader(45, "Document Solutions for PDF", "This high-speed, feature-rich PDF document API for .NET Standard 2.0 gives you total " + "control of your PDF documents, with no dependencies on Adobe Acrobat.Generate, " + "edit, and store feature - rich PDF documents without compromising design or features."); var ipt = new PointF(col0X, ser1Y); foreach (var (caption, points) in dspdf) { var rc = addList(ipt, caption, points.ToArray()); if (rc.Bottom < ser2Y - 120) ipt = new PointF(rc.X, rc.Bottom + vgap); else ipt = new PointF(rc.X + colWidth + colGap, ser1Y); } addHeader(ser2Y, "Document Solutions for Excel", "Generate high-performance Excel spreadsheets with no dependencies on Excel! " + "Generate, convert, calculate, format, and parse spreadsheets in any app."); var topY = ser2Y + h + 10; ipt = new PointF(col0X, topY); foreach (var (caption, points) in gcexcel) { var rc = addList(ipt, caption, points.ToArray()); if (rc.Bottom < page.Size.Height - 100) ipt = new PointF(rc.X, rc.Bottom + vgap); else ipt = new PointF(rc.X + colWidth + colGap, topY); } var hdrRc = new RectangleF(28, 0, page.Size.Width - 28 * 2, 36); g.FillRectangle(hdrRc, _darkGray); var w = hdrRc.Width / 7; string[] hdrs = new string[] { "Create", "Load", "Edit", "Save", "Analyze" }; var hdrTf = new TextFormat() { FontName = "open sans", FontSize = 12, ForeColor = Color.White }; var trc = new RectangleF(hdrRc.X + w, hdrRc.Y, w, hdrRc.Height); for (int i = 0; i < hdrs.Length; ++i) { g.DrawString(hdrs[i], hdrTf, trc, TextAlignment.Center, ParagraphAlignment.Center, false); if (i < hdrs.Length - 1) g.DrawLine(trc.Right, trc.Top + 12, trc.Right, trc.Bottom - 12, Color.White, 1); trc.Offset(w, 0); } var ftrRc = new RectangleF(0, page.Size.Height - 36, page.Size.Width, 36); g.FillRectangle(ftrRc, _darkGray); var ftr0 = "mescius.com"; var ftr1 = "© MESCIUS inc. All rights reserved. All other product and brand names are trademarks and/or registered trademarks of their respective holders."; ftrRc.Inflate(-col0X, -5); hdrTf.FontSize = 12; g.DrawString(ftr0, hdrTf, ftrRc, TextAlignment.Leading, ParagraphAlignment.Near, false); hdrTf.FontSize = 6; g.DrawString(ftr1, hdrTf, ftrRc, TextAlignment.Leading, ParagraphAlignment.Far, false); ftrRc.Inflate(0, -5); g.DrawImage(GetImage(Path.Combine("Resources", "ImagesBis", "logo-GC-white.png")), ftrRc, null, new ImageAlign() { AlignHorz = ImageAlignHorz.Right, AlignVert = ImageAlignVert.Center, BestFit = true }); void addHeader(float y, string caption, string text) { var bluerc = new RectangleF(0, y, 28, h); g.FillRectangle(bluerc, _blue); var caprc = new RectangleF(bluerc.Right, y, 72 * 2.75f, h); g.FillRectangle(caprc, _lightGray); caprc.X = col0X; caprc.Width -= col0X - bluerc.Width; g.DrawString(caption, new TextFormat() { FontName = "open sans semibold", FontSize = 12 }, caprc, TextAlignment.Leading, ParagraphAlignment.Center, false); var textrc = new RectangleF(caprc.Right, caprc.Top, page.Size.Width - caprc.Right, caprc.Height); textrc.Inflate(-10, 0); g.DrawString(text, new TextFormat() { FontName = "open sans light", FontSize = 9 }, textrc, TextAlignment.Leading, ParagraphAlignment.Center, true); } RectangleF addList(PointF pt, string caption, params string[] items) { var tf = new TextFormat() { FontName = "open sans light", FontSize = 9 }; var ret = new RectangleF(pt, SizeF.Empty); tl.Clear(); tl.MaxWidth = colWidth; tl.AppendLine(caption, new TextFormat() { FontName = "open sans", FontBold = true, FontSize = 9 }); tl.PerformLayout(true); g.DrawTextLayout(tl, pt); ret.Width = tl.ContentWidth; ret.Height = tl.ContentHeight; pt.Y += ret.Height; tl.Clear(); var itemPrefix = "\u2022 "; tl.FirstLineIndent = -g.MeasureStringWithTrailingWhitespace(itemPrefix, tf).Width; foreach (var item in items) tl.AppendLine(itemPrefix + item, tf); tl.PerformLayout(true); g.DrawTextLayout(tl, pt); ret.Width = Math.Max(ret.Width, tl.ContentWidth); ret.Height += tl.ContentHeight; return ret; } } } }