Ejemplo n.º 1
0
        public void CreatePDF(Stream stream)
        {
            using (var ds = new DataSet())
            {
                // Fetch data:
                ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"));

                DataTable dtProds = ds.Tables["Products"];
                DataTable dtSupps = ds.Tables["Suppliers"];

                var products =
                    from prod in dtProds.Select()
                    join supp in dtSupps.Select()
                    on prod["SupplierID"] equals supp["SupplierID"]
                    orderby prod["ProductName"]
                    select new
                {
                    ProductID       = prod["ProductID"],
                    ProductName     = prod["ProductName"],
                    Supplier        = supp["CompanyName"],
                    QuantityPerUnit = prod["QuantityPerUnit"],
                    UnitPrice       = $"{prod["UnitPrice"]:C}"
                };

                // Load the template - HTML file with {{mustache}} data references:
                var template = File.ReadAllText(Path.Combine("Resources", "Misc", "ProductListTemplate.html"));
                // Bind the template to data:
                var builder       = new Stubble.Core.Builders.StubbleBuilder();
                var boundTemplate = builder.Build().Render(template, new { Query = products });
                var tmp           = Path.GetTempFileName();
                // Render the bound HTML:
                using (var re = new GcHtmlRenderer(boundTemplate))
                {
                    // PdfSettings allow to provide options for HTML to PDF conversion:
                    var pdfSettings = new PdfSettings()
                    {
                        Margins             = new Margins(0.2f, 1, 0.2f, 1),
                        IgnoreCSSPageSize   = true,
                        DisplayHeaderFooter = true,
                        HeaderTemplate      = "<div style='color:#1a5276; font-size:12px; width:1000px; margin-left:0.2in; margin-right:0.2in'>" +
                                              "<span style='float:left;'>Product Price List</span>" +
                                              "<span style='float:right'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></span>" +
                                              "</div>",
                        FooterTemplate = "<div style='color: #1a5276; font-size:12em; width:1000px; margin-left:0.2in; margin-right:0.2in;'>" +
                                         "<span>(c) GrapeCity, Inc. All Rights Reserved.</span>" +
                                         "<span style='float:right'>Generated on <span class='date'></span></span></div>"
                    };
                    // Render the generated HTML to the temporary file:
                    re.RenderToPdf(tmp, pdfSettings);
                }
                // Copy the created PDF from the temp file to target stream:
                using (var ts = File.OpenRead(tmp))
                    ts.CopyTo(stream);
                // Clean up:
                File.Delete(tmp);
            }
            // Done.
        }
Ejemplo n.º 2
0
        public void CreatePDF(Stream stream)
        {
            // Get a temporary file where the web page will be rendered:
            var tmp = Path.GetTempFileName();
            // The Uri of the web page to render:
            var uri = new Uri(@"https://www.grapecity.com/documents-api-pdf/demos/view-source-cs/WordIndex/");
            // Image used in the footer template:
            var image = @"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF8WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTAzLTI4VDEzOjExOjE1LTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMC0wMS0yMFQxMjo0NjowNi0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wMS0yMFQxMjo0NjowNi0wNTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyNTcxMWNkZC1kZWVmLTU0NDUtYjMwMi0xNTJjNTMzMmE3NDciIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1MzdlNGI5OS0zN2M3LTMyNDItYjQzNi1jN2I2YzM4N2JjOGIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpmNGZmNTI4Ny0yOWE4LTU2NGYtYjQ3YS05ZGZkNjg1NDNiMjciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmY0ZmY1Mjg3LTI5YTgtNTY0Zi1iNDdhLTlkZmQ2ODU0M2IyNyIgc3RFdnQ6d2hlbj0iMjAxOS0wMy0yOFQxMzoxMToxNS0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyNTcxMWNkZC1kZWVmLTU0NDUtYjMwMi0xNTJjNTMzMmE3NDciIHN0RXZ0OndoZW49IjIwMjAtMDEtMjBUMTI6NDY6MDYtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fbzkiAAALSElEQVR4nN2ceZBU1RXGf2/pdbae7qFBhmEfVtlEEUkpVFCKWIpGklhapUYTE4lWRTGmlMQNK0qW0lRFjUlc4pYFDcYYRBHBYAIiRkVRBFkGZmCAYfaZnt7ee/njDktvM72994Z8VVQxr+875/bX595z7rn3HskwDE7FnGtewmYMB5YCC3v/LwH1wJvAI8Be+7oGm57/ZsLfsk39SAcFQdB+4IfAeMADuIFa4BZgD/A44LSpjykYKAReD3QAt2bRdklv25vM7FC2sJvA2cAO4GnAm8N7LuC3wG7gfBP6lTXsInAw8HdgMzChADljgI3AGqC68G7lDjsIfAA4DFxWRJkLgQbgFwinYxmsJHAx0AL81EQddwBtwNUm6kiAFQSeCXwEvAxUWqCvHHgR2A7MMFuZmQRWIL7Ip8B0E/VkwmTgQ8QPFzBLiVkE/hgxXC0bSn1gMXAMuNsM4cUmcCHQCPzcBNmFYjnQBCwqptBifckxwCZEODGkSDLNQBXwKrCVwsKnEyiUQBfwe0RAe17h3bEMZyMC+GfJLYBPQSEE/gBoB24spAM241rEd7gtXwH5EHg+YlH/GMICT3eowMPAAeDCXF/OhcChiJTSRmB0ropOA9QAbwEbEGm0rJANgTLwK+AgsCCvrp1emIdIqT2KsM4+0R+BlwNdwO2F9ioXSIBuGOi6Ye3CNhE3AyHgyr4a9UXgncAriKSmpZBlCQzY39jJwaPdSBLIki1UOoC/APdnapCJwMuBh0zokFAqScTiOj2RuCArCQebujlv2hDWPL6ImZODbN/dwuHmEIoiYQ+P3ANcle6DTASuMK8vYng6HTKyJBGJakhJrCiyRMORLqZPGMTfHr6Y5x9cQNDvYdvOY4TCGopiC4sPIbYdEpCOwIsR+xGm4WhLDxfMrOaeJbNoaukBEje2Aj43Wz49wr8+OAjAonmjePfZxdx70yyONHezp74DRbbcGkcgRmYC0hF4gdk96QpFCfjcXDZvNLUjKmhpDyd8rsgyPeE472xtSHh2+3VnsfGZxcyYUMXHO5sIRyy3xpTVVjoCTU+NGwaUecXG2vxzh3OsNZwwjA3DwO9zs2lbI3FNT3h37HAfqx9bxPKbZ1N3qIPGphAO1bK8Rco6P53mlHFeTBgIL1tZLhYxc8+upsTrQEsiqrLMxc59bWz55EhaObddM4PXfnMpqiKzq64NVbGExBQl6bQaaZ4VD4aBokj4ygSB55wZZOJoP22dkYRmiiLTGYryn48bM4qaM/0MNv7xCiaOqeSzPc3I5s+LKdxYnrPTdAO3U6W8VAxhVZE5a+IgWjsiCUGzYRiUlTjZtrOpT3lBv5e1v/s682fXsH13MxLWOhfLCdR1A7dToazk5OGCaeOqgNSft7LcxY59rdQf6epTpqpIrPzl17h07ihhiRYyaAuBLqdCmddx4tm08VUE/R6iMS2hrdupcqQ5xI49LVnJfv7BBXx1Vg079rWiWuRY7BnCLgWP++Q6vXa4jxFDy+kKxRLaShJEoxq769uylv/szy5i4qhK6g52WOJYrCdQM/C4VDyukwTKssSo6lQCARwOmT31HVnLL/U6eHTZPFRFpr0rYvp8aIMF6rhdKi5nYrQ0dnhFyhAG8LpV6g935qRj2vgqll47nfrDXSnLxGLDFgt0OZWU4HdsjQ+HqpB0XBGPS+VoSw+d3dGc9Nxy1TTmTD+DhiPmkmjLHJhsfQAjhpZRXupMWXmoqkxXKEprUpyYDb5zxSTCEY3kQ6TFhD1e2JFK4OCAl8pyV8owVhWZUDhOV3fq/NgfFs0dzYwJg2huC/ffOE9YT2BvKisZVT43VT4PkWgigbIkEY3phMLxnHUpisT82TW0dkZMy2xbTqBhgDONBUqSxOCAh55IElES6LpOOJo7gQBnTwridaloujnD2JYhnCl7MsjvJRbTU54bhnA++WBkdRkBn5toGrnFgE0WmF5tlc+Nlm7Cl0ib+s8G/nI3vjIX0XhqiFQM2DIHOtT0GTN/hRsjeagZYh5M53iygdSboTHLEdtggZmHcFmJA0WRE76s3tv+1KVfLujsitIZipmWdLVlCGdao5a4HaiKjHFKXkbTDDxuldJTkg+54MDhTprbevK24P4woCzQ7VJRFCnBAuOaTonHQUVpfndrtu08Rmd3zLS9E+sPQUpSxlST0yGj9G6qH0ckqhGocOOvcOel7u0t9ZR48rPebGA5gRLgUNNbQzpPGwrHqA6W5KVrw9YGNm87TDBg3uEK6wmUyOiF0yEc1Rg9rCIvXX94eTu6YZiaF7TlHHOm+UjTDDH/nfKxIsuMqcmdwOf+8QVvbjrAyKFl6CatQsAWC5QyOpFwNI6m6yf4i8V1fOUuxo/M7XrJl/vbePDJrQyp8iKZfL7LUgKP24Eip1fb3RMjHjdOZJHbuyLUDq9g0hh/1jrCEY3vLV9PZyhGoMKDbmIqC6y2QEOMTjWDE2ntiBDTdCRJrB7aOiJMra3KScXVd77Jp7uaGTOsIiW3aAZsCGMyW2BjUzfHHbFhCK987tTBWYu+8o432PB+AxNHV1pCHtgSxkioGZzIvoMdJ1JdnaEYo6or+MqMoVnJvXbZWtb8u47JY/2mOo1kDBgv3BWKsftAO+UlTiRJ4mhziFlTggSyCKBvvG89r27Yy5TaKgzdMPlsSiIGzBDetusYexvaKfE6wBAkXDi7/8PySx7YwF/f2MWZtQHAWvLArvtsaUbwa+/sIxSO41BkmtvDTK0NsOC8vgn8/vL1vLB6Zy955qWs+kI6Ak0LnCRJBMv1jYn7vJs/buSltV9SM6QUgKbWHuafW5N29+44rr/7Lf70+i6m1AZMzfclIYWbdASak7rtha/MySvr99LTu0m0/v0Gbrh3Haoicn7RuIa/3M2COemtLxbX+cbS11n19l6mjquykjyAFNeeLkt5yMweBP1e6g51cPmtqxkWLGXt5v2Uep0MqfIQi+u0d0aZONrPzEnBlHebWnv41o/W8MmuY0ytDaAbhtXDNuW0ZzoLfNfMHsQ1nWClh/2HOli3pZ6hwVICPjexuPhxO0NRptSmXjD/6Ism5t2wih17W5g8JoCmW04ewHvJD9IR+E/E9VXToOkG/go31cESFFlKiNvicYNB/sT005OrPmPhTa/SE44xfqR1QXISGhClWhKQaaNhGbDSzN5kQqnXwa79bWi6wYefH2XF0/9l3eYDjBpWTnmJ64Sl2oCfACnHI6Q+io/dC9xndq+SoSoy7d0RZEmiuU2c3q8ZXIoBpp5x6QcrgLsgtfhYX1td9yNudb/YT7uiQtN1vC6VnnCcIVUlOFTJ9IxKHzCAbwPPZWrQXyC9EihFVEyzBIYhcoZejwM1aYPJYjyF+O4ZyYPsViIRxNXP43Wq/t/xHqIgxXcR1137RC5Lub3AXMSla1NjRZtwFLgEcZ1rZ7Yv5bMWfgtxHWwpaSLz0xTLEBXlVuf6YiHJhEcQdar6nCMGOFYiSlTlfTe60GxMN3Adok7VBwXKshLbEPW8rkRUw8wbxUpnfQ6cw8k6VQMVbYh6XtMRJBaMYucDVwGD6KPGgI1YgSi/9+diCjUroXofouTcKybJzwWrEQ7iLjOEm5mRbgGuAGYCn5moJxO+RBS5vQQRopgCK1L6HyKqWF5DgRN2luhGBMHjgC1mK7NyT+QFwI+oU2UWHuvV8ZSJOhJg9aaShqiCNAxYV0S5G4FRiGrnud0JKxB2VZk8CFyEqBBSV4CcBkTFtbkFyskbdpfpfBdhOUvIzXI0RM2/GuBtE/qVNewm8DieQCypnsii7TOAD/i1if3JGgOFQIAwwhLHAU8isj89vf/qEMRNAm5AVJQbEPgfbZlv3OD+pJUAAAAASUVORK5CYII=";

            // Create a GcHtmlRenderer with the source Uri
            // (note that GcHtmlRenderer ctor and other HTML rendering methods accept either a Uri
            // specifying the HTML page to render, or a string which represents the actual HTML):
            using (var re = new GcHtmlRenderer(uri))
            {
                // PdfSettings allow to provide options for HTML to PDF conversion:
                // - PageRanges allows to skip the first page which is empty in this case.
                // - PageWidth/PageHeight allow to customize page size (defaults are used here for demo).
                // - Margins specify page margins (the default is no margins).
                // - IgnoreCSSPageSize makes sure page size specified here is used.
                // - Landscape allows to change page orientation.
                // - Scale allows to enlarge or reduce the render size (default is 1).
                // - To add custom headers, DisplayHeaderFooter needs to be set to true.
                // - HeaderTemplate/FooterTemplate allow to specify custom page headers.
                var pdfSettings = new PdfSettings()
                {
                    PageRanges          = "2-100",
                    PageWidth           = 8.5f,
                    PageHeight          = 11f,
                    Margins             = new Margins(0.2f, 1, 0.2f, 1),
                    IgnoreCSSPageSize   = true,
                    Landscape           = true,
                    DisplayHeaderFooter = true,
                    HeaderTemplate      = "<div style='-webkit-print-color-adjust:exact;background-color:#395daa;color:white;" +
                                          "padding:0.1in;font-size:12em;width:1000px;margin-left:0.2in;margin-right:0.2in'>" +
                                          "<span style='float:left'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></span>" +
                                          "<span style='float:right'>Document created on <span class='date'></span>" +
                                          "</div>",
                    FooterTemplate = "<div style='font-size:12em;width:1000px;margin-left:0.2in;margin-right:0.2in'>" +
                                     $"<span>Document location: <span class='url'></span><img style='float:right;' width='40' height='40' src='{image}'></img></div>"
                };
                // Render the source Web page to the temporary file:
                re.RenderToPdf(tmp, pdfSettings);
            }
            // Copy the created PDF from the temp file to target stream:
            using (var ts = File.OpenRead(tmp))
                ts.CopyTo(stream);
            // Clean up:
            File.Delete(tmp);
            // Done.
        }
Ejemplo n.º 3
0
        static void Main(string[] args)
        {
            //GcPdfDocument.SetLicenseKey("");

            var pdffile        = @"HTMLPageToPDF.pdf";
            var jpegfile       = @"HTMLPageToPDF.jpeg";
            var pngfile        = @"HTMLPageToPDF.png";
            var uri            = new Uri(@"https://docs.grapecity.com/help/diodocs/pdf/#overview.html");
            var gcHtmlRenderer = new GcHtmlRenderer(uri);

            gcHtmlRenderer.RenderToPdf(pdffile, new PdfSettings());
            gcHtmlRenderer.RenderToJpeg(jpegfile, new JpegSettings());
            gcHtmlRenderer.RenderToPng(pngfile, new PngSettings());
        }
Ejemplo n.º 4
0
        public void CreatePDF(Stream stream)
        {
            // Get a temporary file where the web page will be rendered:
            var tmp = Path.GetTempFileName();
            // The Uri of the web page to render:
            var uri = new Uri("http://www.google.com");

            // Create a GcHtmlRenderer with the source Uri
            // (note that GcHtmlRenderer ctor and other HTML rendering methods accept either a Uri
            // specifying the HTML page to render, or a string which represents the actual HTML):
            using (var re = new GcHtmlRenderer(uri))
                // Render the source Web page to the temporary file:
                re.RenderToPdf(tmp);
            // Copy the created PDF from the temp file to target stream:
            using (var ts = File.OpenRead(tmp))
                ts.CopyTo(stream);
            // Clean up:
            File.Delete(tmp);
            // Done.
        }
Ejemplo n.º 5
0
        private string SaveHtmlToImage(string htmlsource, string exportedfile)
        {
            try
            {
                // let's configure image settings
                var jpegSettings = new JpegSettings();
                jpegSettings.WindowSize         = new Size(1443, 1100);
                jpegSettings.CompressionQuality = 100;

                // let's save HTML page to jpeg image
                using (var htmlRenderer = new GcHtmlRenderer(htmlsource))
                {
                    htmlRenderer.RenderToJpeg(exportedfile, jpegSettings);
                }
                return(exportedfile);
            }
            catch (Exception ex)
            {
                return(string.Empty);
            }
        }
Ejemplo n.º 6
0
        static void Main(string[] args)
        {
            //GcPdfDocument.SetLicenseKey("");

            var doc  = new GcPdfDocument();
            var page = doc.NewPage();
            var g    = page.Graphics;

            var html = @"
                <!DOCTYPE html>
                <html>
                  <head>
                    <style>
                        p.round {
                        font: 28px Yu Gothic;
                        color: Blue;
                        padding: 3px 5px 3px 5px;
                        }
                    </style>
                  </head>
                  <body>
                    <p class='round'>Hello, World!</p>
                    <p class='round'>こんにちは、DioDocs(ディオドック)です</p>
                  </body>
                </html>";

            g.DrawHtml(html,
                       72,
                       72,
                       new HtmlToPdfFormat(false),
                       out SizeF size);

            doc.Save("HTMLStringToPDF.pdf");

            var gcHtmlRenderer = new GcHtmlRenderer(html);

            gcHtmlRenderer.RenderToJpeg("HTMLStringToImage.jpeg", new JpegSettings());
            gcHtmlRenderer.RenderToPng("HTMLStringToImage.png", new PngSettings());
        }
Ejemplo n.º 7
0
        static void Main(string[] args)
        {
            //GcPdfDocument.SetLicenseKey("");

            var doc  = new GcPdfDocument();
            var page = doc.NewPage();
            var g    = page.Graphics;

            g.DrawHtml(File.ReadAllText("ActiveReports.html"),
                       72,
                       72,
                       new HtmlToPdfFormat(false),
                       out SizeF size);

            doc.Save("HTMLFileToPDF.pdf");


            var gcHtmlRenderer = new GcHtmlRenderer(File.ReadAllText("ActiveReports.html"));

            gcHtmlRenderer.RenderToJpeg("HTMLFileToPDF.jpeg", new JpegSettings());
            gcHtmlRenderer.RenderToPng("HTMLFileToPDF.png", new PngSettings());
        }
Ejemplo n.º 8
0
        static void Main(string[] args)
        {
            var uri    = new Uri(args[0]);
            int width  = Int32.Parse(args[1]);
            int height = Int32.Parse(args[2]);

            using (var re = new GcHtmlRenderer(uri))
            {
                re.VirtualTimeBudget = 15000;             //Задержка перед созданием изображения

                PngSettings pngSettings = new PngSettings //Параметры изображения
                {
                    DefaultBackgroundColor = Color.White,
                    WindowSize             = new Size(width, height)
                };

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    re.RenderToPng(memoryStream, pngSettings);

                    Console.WriteLine(Convert.ToBase64String(memoryStream.ToArray()));
                }
            }
        }
Ejemplo n.º 9
0
        public void CreatePDF(Stream stream)
        {
            const string TTAG = "___TABLE___";

            // HTML page template:
            const string tableTpl =
                "<!DOCTYPE html>" +
                "<html>" +
                "<head>" +
                "<style>" +

                "html * {" +
                "  font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif !important;" +
                "}" +

                "h1 {" +
                "  color: #1a5276;" +
                "  background-color: #d2b4de;" +
                "  text-align: center;" +
                "  padding: 6px;" +
                "}" +

                "thead {display: table-header-group;}" +

                "#products {" +
                "  font-family: 'Trebuchet MS', Arial, Helvetica, sans-serif;" +
                "  border-collapse: collapse;" +
                "  width: 100%;" +
                "}" +

                "#products td, #products th {" +
                "  border: 1px solid #ddd;" +
                "  padding: 8px;" +
                "}" +

                "#products tr:nth-child(even){background-color: #f2f2f2;}" +

                "#products tr:hover {background-color: #ddd;}" +

                "#products th {" +
                "  padding-top: 12px;" +
                "  padding-bottom: 12px;" +
                "  text-align: left;" +
                "  background-color: #a569bd;" +
                "  color: white;" +
                "}" +
                "</style>" +
                "</head>" +
                "<body>" +

                TTAG +

                "</body>" +
                "</html>";

            const string tableHead = "<h1>Product Price List</h1>";

            const string tableFmt =
                "<table id='products'>" +
                "  <thead>" +
                "    <th>Product ID</th>" +
                "    <th>Description</th>" +
                "    <th>Supplier</th>" +
                "    <th>Quantity Per Unit</th>" +
                "    <th>Unit Price</th>" +
                "  </thead>" +
                "{0}" +
                "</table>";

            const string dataRowFmt =
                "  <tr>" +
                "    <td>{0}</td>" +
                "    <td>{1}</td>" +
                "    <td>{2}</td>" +
                "    <td>{3}</td>" +
                "    <td align='right'>{4:C}</td>" +
                "  </tr>";

            using (var ds = new DataSet())
            {
                ds.ReadXml(Path.Combine("Resources", "data", "GcNWind.xml"));

                DataTable dtProds = ds.Tables["Products"];
                DataTable dtSupps = ds.Tables["Suppliers"];

                var products =
                    from prod in dtProds.Select()
                    join supp in dtSupps.Select()
                    on prod["SupplierID"] equals supp["SupplierID"]
                    orderby prod["ProductName"]
                    select new
                {
                    ProductID       = prod["ProductID"],
                    ProductName     = prod["ProductName"],
                    Supplier        = supp["CompanyName"],
                    QuantityPerUnit = prod["QuantityPerUnit"],
                    UnitPrice       = prod["UnitPrice"]
                };

                var sb = new StringBuilder();
                sb.AppendLine(tableHead);
                foreach (var prod in products)
                {
                    sb.AppendFormat(dataRowFmt, prod.ProductID, prod.ProductName, prod.Supplier, prod.QuantityPerUnit, prod.UnitPrice);
                }

                var html = tableTpl.Replace(TTAG, string.Format(tableFmt, sb.ToString()));


                var tmp = Path.GetTempFileName();
                using (var re = new GcHtmlRenderer(html))
                {
                    // PdfSettings allow to provide options for HTML to PDF conversion:
                    var pdfSettings = new PdfSettings()
                    {
                        Margins             = new Margins(0.2f, 1, 0.2f, 1),
                        IgnoreCSSPageSize   = true,
                        DisplayHeaderFooter = true,
                        HeaderTemplate      = "<div style='color:#1a5276; font-size:12px; width:1000px; margin-left:0.2in; margin-right:0.2in'>" +
                                              "<span style='float:left;'>Product Price List</span>" +
                                              "<span style='float:right'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></span>" +
                                              "</div>",
                        FooterTemplate = "<div style='color: #1a5276; font-size:12em; width:1000px; margin-left:0.2in; margin-right:0.2in;'>" +
                                         "<span>(c) GrapeCity, Inc. All Rights Reserved.</span>" +
                                         "<span style='float:right'>Generated on <span class='date'></span></span></div>"
                    };
                    // Render the source Web page to the temporary file:
                    re.RenderToPdf(tmp, pdfSettings);
                }
                // Copy the created PDF from the temp file to target stream:
                using (var ts = File.OpenRead(tmp))
                    ts.CopyTo(stream);
                // Clean up:
                File.Delete(tmp);
            }
            // Done.
        }