Exemplo n.º 1
0
        private void AddTable(string tableName, Dictionary<string, List<Dictionary<string, object>>> items, ref pdfDocument doc)
        {
            var page = doc.addPage(predefinedPageSize.csA4Page);
            page.addText(tableName, 40, page.height - 30, doc.getFontReference(predefinedFont.csHelvetica), 8);

            var table = new pdfTable(doc, 1, pdfColor.Black, 2)
            {
                coordX = 40,
                coordY = page.height - 40
            };
            //tableName == "Mat 2a" || tableName == "Mat 7"
            if ( (items.Count == 1 && items.First().Value.Count < 1) || documentCertficate[tableName.Replace(" ", string.Empty)] == "No Credit")
            {
                table.tableHeader.addColumn(255);
                table.tableHeader.addColumn(255);
                if (items.Count > 0)
                {
                    var nameRow = table.createRow();
                    nameRow[0].addText(items.First().Key);
                    table.addRow(nameRow);
                }
                var footerRow = table.createRow();
                footerRow[0].addText("Score", doc.getFontReference(predefinedFont.csHelveticaBold), 10);
                footerRow[1].addParagraph(documentCertficate[tableName.Replace(" ", string.Empty)], 10, predefinedAlignment.csLeft);
                table.addRow(footerRow);
                page.addTable(table);
                return;
            }

            var columnCount = items.First().Value != null && items.First().Value.Any() ? items.First().Value.First().Keys.Count + 1 : 2;

            for (var i = 0; i < columnCount; i++)
            {
                table.tableHeader.addColumn((int)Math.Floor((decimal)(510 / columnCount)));
            }

            foreach (var item in items)
            {
                if (item.Value.Count > 0)
                {
                    var row = table.createRow();
                    row[0].addParagraph(item.Key, doc.getFontReference(predefinedFont.csHelveticaBold), 10, 10, 255, predefinedAlignment.csLeft);
                    var i = 1;
                    foreach (var key in item.Value[0].Keys)
                    {
                        row[i].addParagraph(key, doc.getFontReference(predefinedFont.csHelveticaBold), 10, 10, 255, predefinedAlignment.csLeft);
                        i++;
                    }
                    table.addRow(row);
                    foreach (var elementGroup in item.Value)
                    {
                        row = table.createRow();
                        row[0].addText((item.Value.IndexOf(elementGroup) + 1).ToString(CultureInfo.InvariantCulture));
                        i = 1;
                        foreach (var kvp in elementGroup)
                        {
                            if (kvp.Key == "Green Guide Rating")
                            {
                                var point = (decimal)kvp.Value;
                                string grade;
                                if (point > 2)
                                {
                                    grade = "A+";
                                }
                                else if (point > 1)
                                {
                                    grade = "A";
                                }
                                else if (point > (decimal)0.5)
                                {
                                    grade = "B";
                                }
                                else if (point > (decimal)0.25)
                                {
                                    grade = "C";
                                }
                                else if (point > 0)
                                {
                                    grade = "D";
                                }
                                else
                                {
                                    grade = "E";
                                }
                                row[i].addText(grade);
                            }
                            else if (kvp.Key == "Tier Level")
                            {
                                if (kvp.Value.ToString().Contains("Excellent"))
                                {
                                    row[i].addText("Excellent");
                                }
                                else if (kvp.Value.ToString().Contains("Very Good"))
                                {
                                    row[i].addText("Very Good");
                                }
                                else if (kvp.Value.ToString().Contains("Good"))
                                {
                                    row[i].addText("Good");
                                }
                                else if (kvp.Value.ToString().Contains("Certified"))
                                {
                                    row[i].addText("Certified EMS");
                                }
                                else if (kvp.Value.ToString().Contains("Verified"))
                                {
                                    row[i].addText("Verified");
                                }
                                else
                                {
                                    row[i].addText(string.Empty);
                                }
                            }
                            else
                            {
                                row[i].addParagraph(kvp.Value != null ? kvp.Value.ToString() : string.Empty, 10, predefinedAlignment.csLeft);
                            }
                            i++;
                        }
                        table.addRow(row);
                    }
                }
            }
            if (documentCertficate.ContainsKey(tableName.Replace(" ", string.Empty)))
            {
                var footerRow = table.createRow();
                footerRow[columnCount - 2].addText("Score", doc.getFontReference(predefinedFont.csHelveticaBold), 10);
                footerRow[columnCount - 1].addParagraph(documentCertficate[tableName.Replace(" ", string.Empty)], 10,
                    predefinedAlignment.csLeft);
                table.addRow(footerRow);
            }
            page.addTable(table);
        }
Exemplo n.º 2
0
        private void CreatePdf(string pdfFilePath)
        {
            var pdfDoc = new pdfDocument("BREEAM Materials Report", "");

            var coverPage = pdfDoc.addPage(predefinedPageSize.csA4Page);

            coverPage.addText("BREEAM Materials", 40, coverPage.height - 140, pdfDoc.getFontReference(predefinedFont.csHelveticaBold), 20);
            coverPage.addText(string.Format("Project Name: {0}", projectName), 40, coverPage.height - 165, pdfDoc.getFontReference(predefinedFont.csHelvetica), 10);
            coverPage.addText(string.Format("Project Type: {0}", projectType), 40, coverPage.height - 180, pdfDoc.getFontReference(predefinedFont.csHelvetica), 10);
            coverPage.addText(string.Format("Building Type: {0}", buildingType), 40, coverPage.height - 195, pdfDoc.getFontReference(predefinedFont.csHelvetica), 10);
            coverPage.addText(string.Format("Project Phase: {0}", projectPhase), 40, coverPage.height - 210, pdfDoc.getFontReference(predefinedFont.csHelvetica), 10);

            if (documentCertficate.ContainsKey("Mat1"))
            {
                var mat1Items = new Dictionary<string, List<Dictionary<string, object>>>();

                var gr = externalWalls.GroupBy(ew => ew.ElementNumber);

                var mat1ExternalWallGroup =
                    gr
                     .Select(
                         ew =>
                             new Dictionary<string, object>()
                            {
                                {"Name", ew.First().Name},
                                {"Element Number", ew.Key},
                                {"Area", ew.Sum(w => w.NetSideArea).ToString("N")},
                                {"Green Guide Rating", ew.First().Point}
                            });
                if (mat1ExternalWallGroup.Any())
                {
                    mat1Items.Add("External Wall", mat1ExternalWallGroup.ToList());
                }

                var mat1CurtainWallGroup = curtainWalls.GroupBy(ew => ew.ElementNumber)
                        .Select(
                            ew =>
                                new Dictionary<string, object>()
                            {
                                {"Name", ew.First().Name},
                                {"Element Number", ew.Key},
                                {"Area", ew.Sum(w => w.GrossSideArea).ToString("N")},
                                {"Green Guide Rating", ew.First().Point}
                            });
                if (mat1CurtainWallGroup.Any())
                {
                    mat1Items.Add("Curtain Wall", mat1CurtainWallGroup.ToList());
                }

                var mat1WindowGroup = windows.GroupBy(ew => ew.ElementNumber)
                        .Select(
                            w =>
                                new Dictionary<string, object>()
                            {
                                {"Name", w.First().Name},
                                {"Element Number", w.Key},
                                {"Area", w.Sum(wi => wi.NetArea).ToString("N")},
                                {"Green Guide Rating", w.First().Point}
                            });
                if (mat1WindowGroup.Any())
                {
                    mat1Items.Add("Window", mat1WindowGroup.ToList());
                }

                var mat1FloorSlabsGroup = slabs.Where(s => s.SlabType == SlabType.Floor).GroupBy(s => s.ElementNumber)
                        .Select(
                            s =>
                                new Dictionary<string, object>()
                            {
                                {"Name", s.First().Name},
                                {"Element Number", s.Key},
                                {"Area", s.Sum(sl => sl.NetArea).ToString("N")},
                                {"Green Guide Rating", s.First().Point}
                            });
                if (mat1FloorSlabsGroup.Any())
                {
                    mat1Items.Add("Upper Floor", mat1FloorSlabsGroup.ToList());
                }

                var mat1RoofSlabGroup = slabs.Where(s => s.SlabType == SlabType.Roof).GroupBy(s => s.ElementNumber)
                        .Select(
                            s =>
                                new Dictionary<string, object>()
                            {
                                {"Name", s.First().Name},
                                {"Element Number", s.Key},
                                {"Area", s.Sum(sl => sl.NetArea).ToString("N")},
                                {"Green Guide Rating", s.First().Point}
                            });
                if (mat1RoofSlabGroup.Any())
                {
                    mat1Items.Add("Roof", mat1RoofSlabGroup.ToList());
                }
                if (!mat1Items.Any())
                {
                    mat1Items.Add("Material Specification", new List<Dictionary<string, object>>());
                }
                AddTable("Mat 1", mat1Items, ref pdfDoc);
            }

            if (documentCertficate.ContainsKey("Mat2a"))
            {
                var mat2aItems = new Dictionary<string, List<Dictionary<string, object>>>();
                mat2aItems.Add("Natural Boundary", new List<Dictionary<string, object>>());
                AddTable("Mat 2a", mat2aItems, ref pdfDoc);
            }
            if (documentCertficate.ContainsKey("Mat2b"))
            {
                var mat2BItems = new Dictionary<string, List<Dictionary<string, object>>>();

                var mat2BBoundaryWallGroup = boundaryWalls.GroupBy(bw => bw.ElementNumber)
                    .Select(
                        bw =>
                            new Dictionary<string, object>()
                            {
                                {"Name", bw.First().Name},
                                {"Element Number", bw.Key},
                                {"Area", bw.Sum(w => w.NetSideArea).ToString("N")},
                                {"Green Guide Rating", bw.First().Point}
                            });
                if (mat2BBoundaryWallGroup.Any())
                {
                    mat2BItems.Add("Boundary Protection", mat2BBoundaryWallGroup.ToList());
                }

                var mat2BLandingSlabGroup = slabs.Where(s => s.SlabType == SlabType.Landing).GroupBy(s => s.ElementNumber)
                        .Select(
                            s =>
                                new Dictionary<string, object>()
                            {
                                {"Name", s.First().Name},
                                {"ElementNumber", s.Key},
                                {"Area", s.Sum(sl => sl.NetArea).ToString("N")},
                                {"Green Guide Rating", s.First().Point}
                            });
                if (mat2BLandingSlabGroup.Any())
                {
                    mat2BItems.Add("Hard Landscaping", mat2BLandingSlabGroup.ToList());
                }
                if (!mat2BItems.Any())
                {
                    mat2BItems.Add("Hard Landscaping and Boundary Protection", new List<Dictionary<string, object>>());
                }
                AddTable("Mat 2b", mat2BItems, ref pdfDoc);
            }

            if (documentCertficate.ContainsKey("Mat3"))
            {

                var mat3Items = new Dictionary<string, List<Dictionary<string, object>>>();

                if (documentCertficate["Mat3"] == "No Credit")
                {
                    mat3Items.Add("Façade Reuse", new List<Dictionary<string, object>>());
                }
                else
                {
                    var mat3ExternalWallGroup = externalWalls.Where(ew => ew.FacadeReuse).GroupBy(ew => ew.ElementNumber)
                    .Select(
                        ew =>
                            new Dictionary<string, object>()
                            {
                                {"Name", ew.First().Name},
                                {"ElementNumber", ew.Key},
                                {"Area", ew.Sum(w => w.NetSideArea).ToString("N")},
                                {"Percentage", (ew.Sum(w => w.NetSideArea)/externalWalls.Sum(w => w.NetSideArea)).ToString("P")}
                            });
                    if (mat3ExternalWallGroup.Any())
                    {
                        mat3Items.Add("Reused External Wall", mat3ExternalWallGroup.ToList());
                    }

                    var mat3CurtainWallGroup = curtainWalls.Where(cw => cw.FacadeReuse).GroupBy(ew => ew.ElementNumber)
                            .Select(
                                cw =>
                                    new Dictionary<string, object>()
                            {
                                {"Name", cw.First().Name},
                                {"ElementNumber", cw.Key},
                                {"Area", cw.Sum(w => w.GrossSideArea).ToString("N")},
                                {"Percentage", (cw.Sum(w => w.GrossSideArea)/curtainWalls.Sum(w => w.GrossSideArea)).ToString("P")}
                            });
                    if (mat3CurtainWallGroup.Any())
                    {
                        mat3Items.Add("Reused Curtain Wall", mat3CurtainWallGroup.ToList());
                    }

                    var mat3WindowGroup = windows.Where(w => w.FacadeReuse).GroupBy(w => w.ElementNumber)
                            .Select(
                                w =>
                                    new Dictionary<string, object>()
                            {
                                {"Name", w.First().Name},
                                {"ElementNumber", w.Key},
                                {"Area", w.Sum(wi => wi.NetArea).ToString("N")},
                                {"Percentage", (w.Sum(wi => wi.NetArea)/windows.Sum(wi => wi.NetArea)).ToString("P")}
                            });

                    if (mat3WindowGroup.Any())
                    {
                        mat3Items.Add("Reused Window", mat3WindowGroup.ToList());
                    }
                    if (!mat3Items.Any())
                    {
                        mat3Items.Add("Façade Reuse", new List<Dictionary<string, object>>());
                    }
                }

                AddTable("Mat 3", mat3Items, ref pdfDoc);

            }

            if (documentCertficate.ContainsKey("Mat4"))
            {
                var mat4Items = new Dictionary<string, List<Dictionary<string, object>>>();
                if (documentCertficate["Mat4"] == "No Credit")
                {
                    mat4Items.Add("Structure Reuse", new List<Dictionary<string, object>>());
                }
                else
                {
                    var mat4ExternalWallGroup = externalWalls.Where(ew => ew.LoadBearing && ew.StructureReuse).GroupBy(ew => ew.ElementNumber)
                        .Select(
                            ew =>
                                new Dictionary<string, object>()
                            {
                                {"Name", ew.First().Name},
                                {"ElementNumber", ew.Key},
                                {"Volume", ew.Sum(w => w.NetVolume).ToString("N")},
                                {"Percentage", (ew.Sum(w => w.NetVolume)/externalWalls.Where(w => w.LoadBearing).Sum(w => w.NetVolume)).ToString("P")}
                            });
                    if (mat4ExternalWallGroup.Any())
                    {
                        mat4Items.Add("Reused External Wall", mat4ExternalWallGroup.ToList());
                    }

                    var mat4InteriorWallGroup = interiorWalls.Where(iw => iw.LoadBearing && iw.StructureReuse).GroupBy(iw => iw.ElementNumber)
                            .Select(
                                cw =>
                                    new Dictionary<string, object>()
                            {
                                {"Name", cw.First().Name},
                                {"ElementNumber", cw.Key},
                                {"Volume", cw.Sum(w => w.NetVolume).ToString("N")},
                                {"Percentage", (cw.Sum(w => w.NetVolume)/interiorWalls.Where(w => w.LoadBearing).Sum(w => w.NetVolume)).ToString("P")}
                            });
                    if (mat4InteriorWallGroup.Any())
                    {
                        mat4Items.Add("Reused Interior Wall", mat4InteriorWallGroup.ToList());
                    }

                    var mat4SlabsGroup = slabs.Where(s => s.SlabType == SlabType.Floor && s.LoadBearing && s.StructureReuse).GroupBy(s => s.ElementNumber)
                            .Select(
                                s =>
                                    new Dictionary<string, object>()
                            {
                                {"Name", s.First().Name},
                                {"ElementNumber", s.Key},
                                {"Volume", s.Sum(w => w.NetVolume).ToString("N")},
                                {"Percentage", (s.Sum(w => w.NetVolume)/slabs.Where(w => w.SlabType == SlabType.Floor && w.LoadBearing).Sum(w => w.NetVolume)).ToString("P")}
                            });

                    if (mat4SlabsGroup.Any())
                    {
                        mat4Items.Add("Reused Slab", mat4SlabsGroup.ToList());
                    }

                    var mat4ColumnGroup = columns.Where(c => c.StructureReuse).GroupBy(c => c.ElementNumber)
                            .Select(
                                c =>
                                    new Dictionary<string, object>()
                            {
                                {"Name", c.First().Name},
                                {"ElementNumber", c.Key},
                                {"Volume", c.Sum(w => w.NetVolume).ToString("N")},
                                {"Percentage", (c.Sum(co => co.NetVolume)/columns.Sum(co => co.NetVolume)).ToString("P")}
                            });

                    if (mat4ColumnGroup.Any())
                    {
                        mat4Items.Add("Reused Column", mat4ColumnGroup.ToList());
                    }

                    var mat4BeamGroup = beams.Where(b => b.StructureReuse).GroupBy(b => b.ElementNumber)
                            .Select(
                                b =>
                                    new Dictionary<string, object>()
                            {
                                {"Name", b.First().Name},
                                {"ElementNumber", b.Key},
                                {"Volume", b.Sum(w => w.NetVolume).ToString("N")},
                                {"Percentage", (b.Sum(be => be.NetVolume)/columns.Sum(be => be.NetVolume)).ToString("P")}
                            });
                    if (mat4BeamGroup.Any())
                    {
                        mat4Items.Add("Reused Beam", mat4BeamGroup.ToList());
                    }
                    if (!mat4Items.Any())
                    {
                        mat4Items.Add("Structure Reuse", new List<Dictionary<string, object>>());
                    }
                }
                AddTable("Mat 4", mat4Items, ref pdfDoc);
            }

            if (documentCertficate.ContainsKey("Mat5"))
            {
                var mat5Items = new Dictionary<string, List<Dictionary<string, object>>>();
                var mat5ExternalWallGroup = externalWalls.Where(ew => ew.Rsm).GroupBy(ew => ew.ElementNumber)
                    .Select(
                        ew =>
                            new Dictionary<string, object>()
                            {
                                {"Name", ew.First().Name},
                                {"Element Number", ew.Key},
                                {"Area", ew.Sum(w => w.NetSideArea).ToString("N")},
                                {"Percentage", (ew.Sum(w => w.NetSideArea)/externalWalls.Sum(w => w.NetSideArea)).ToString("P")},
                                {"Tier Level", ew.First().RsmText}
                            });

                if (mat5ExternalWallGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Walls", mat5ExternalWallGroup.ToList());
                }

                var mat5InteriorWallGroup = interiorWalls.Where(iw => iw.Rsm).GroupBy(iw => iw.ElementNumber)
                        .Select(
                            iw =>
                                new Dictionary<string, object>()
                            {
                                {"Name", iw.First().Name},
                                {"Element Number", iw.Key},
                                {"Area", iw.Sum(w => w.GrossSideArea).ToString("N")},
                                {"Percentage", (iw.Sum(w => w.GrossSideArea)/interiorWalls.Sum(w => w.GrossSideArea)).ToString("P")},
                                {"Tier Level", iw.First().RsmText}
                            });
                if (mat5InteriorWallGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Walls", mat5InteriorWallGroup.ToList());
                }

                var mat5RoofGroup =
                    slabs.Where(s => s.Rsm && s.SlabType == SlabType.Roof)
                        .GroupBy(s => s.ElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().Name},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        {"Percentage", (s.Sum(w => w.NetArea)/slabs.Where(sl => sl.SlabType == SlabType.Roof).Sum(w => w.NetArea)).ToString("P")},
                        {"Tier Level", s.First().RsmText}
                    });
                if (mat5RoofGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Roof", mat5RoofGroup.ToList());
                }

                var mat5FloorGroup = slabs.Where(s => s.Rsm && s.SlabType == SlabType.Floor)
                        .GroupBy(s => s.ElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().Name},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        {"Percentage", (s.Sum(w => w.NetArea)/slabs.Where(sl => sl.SlabType == SlabType.Floor).Sum(w => w.NetArea)).ToString("P")},
                        {"Tier Level", s.First().RsmText}
                    });

                if (mat5FloorGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Floor", mat5FloorGroup.ToList());
                }

                var mat5BaselabGroup = slabs.Where(s => s.Rsm && s.SlabType == SlabType.BaseSlab)
                        .GroupBy(s => s.ElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().Name},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        {"Percentage", (s.Sum(w => w.NetArea)/slabs.Where(sl => sl.SlabType == SlabType.BaseSlab).Sum(w => w.NetArea)).ToString("P")},
                        {"Tier Level", s.First().RsmText}
                    });

                if (mat5BaselabGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Foundation", mat5BaselabGroup.ToList());
                }

                var mat5ColumnGroup =
                    columns.Where(c => c.Rsm).GroupBy(c => c.ElementNumber).Select(c => new Dictionary<string, object>
                {
                    {"Name", c.First().Name},
                    {"Element Number", c.Key},
                    {"Area", c.Sum(w => w.GrossSurfaceArea).ToString("N")},
                    {"Percentage", (c.Sum(w => w.GrossSurfaceArea)/columns.Sum(w => w.GrossSurfaceArea)).ToString("P")},
                    {"Tier Level", c.First().RsmText}
                });

                if (mat5ColumnGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Column", mat5ColumnGroup.ToList());
                }

                var mat5BeamGroup = beams.Where(c => c.Rsm).GroupBy(c => c.ElementNumber).Select(c => new Dictionary<string, object>
                {
                    {"Name", c.First().Name},
                    {"Element Number", c.Key},
                    {"Area", c.Sum(w => w.GrossSurfaceArea).ToString("N")},
                    {"Percentage", (c.Sum(w => w.GrossSurfaceArea)/beams.Sum(w => w.GrossSurfaceArea)).ToString("P")},
                    {"Tier Level", c.First().RsmText}
                });
                if (mat5BeamGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Beam", mat5BeamGroup.ToList());
                }

                var mat5StairGroup =
                    stairs.Where(s => s.Rsm).GroupBy(s => s.ElementNumber).Select(s => new Dictionary<string, object>
                {
                    {"Name", s.First().Name},
                    {"Element Number", s.Key},
                    {"Area", s.Sum(sf => sf.Area).ToString("N")},
                    {"Percentage", (s.Sum(sf => sf.Area)/stairs.Sum(sf => sf.Area)).ToString("P")},
                    {"Tier Level", s.First().RsmText}
                });

                if (mat5StairGroup.Any())
                {
                    mat5Items.Add("Responsibly Sourced Stair", mat5StairGroup.ToList());
                }
                if (!mat5Items.Any())
                {
                    mat5Items.Add("Responsibly Sourced Materials", new List<Dictionary<string, object>>());
                }
                AddTable("Mat 5", mat5Items, ref pdfDoc);
            }

            if (documentCertficate.ContainsKey("Mat6a"))
            {
                var mat6AItems = new Dictionary<string, List<Dictionary<string, object>>>();

                var mat6AExternalWallGroup =
                externalWalls.Where(ew => ew.InsulationLayerThickness > 0)
                    .GroupBy(ew => ew.InsulationMaterialElementNumber)
                    .Select(ew => new Dictionary<string, object>
                    {
                        {"Name", ew.First().InsulationMaterialName},
                        {"Element Number", ew.Key},
                        {"Area", ew.Sum(w => w.NetSideArea).ToString("N")},
                        //{"Percentage", (ew.Sum(w => w.NetSideArea) / externalWalls.Sum(w => w.NetSideArea)).ToString("P")},
                        {"Green Guide Rating", ew.First().InsulationLayerMaterialPoint}
                    });

                mat6AItems.Add("External Wall Insulation", mat6AExternalWallGroup.ToList());

                var mat6ABaseSlabGroup = slabs.Where(s => s.InsulationLayerThickness > 0 && s.SlabType == SlabType.BaseSlab)
                        .GroupBy(s => s.InsulationMaterialElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().InsulationMaterialName},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        //{"Percentage", (s.Sum(w => w.NetArea) / slabs.Where(sl => sl.SlabType == SlabType.BaseSlab).Sum(w => w.NetArea)).ToString("P")},
                        {"Green Guide Rating", s.First().InsulationLayerMaterialPoint}
                    });

                mat6AItems.Add("Ground Insulation", mat6ABaseSlabGroup.ToList());

                var mat6ARoofSlabGroup = slabs.Where(s => s.InsulationLayerThickness > 0 && s.SlabType == SlabType.Roof)
                        .GroupBy(s => s.InsulationMaterialElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().InsulationMaterialName},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        //{"Percentage", (s.Sum(w => w.NetArea) / slabs.Where(sl => sl.SlabType == SlabType.Roof).Sum(w => w.NetArea)).ToString("P")},
                        {"Green Guide Rating", s.First().InsulationLayerMaterialPoint}
                    });

                mat6AItems.Add("Roof Insulation", mat6ARoofSlabGroup.ToList());
                if (!mat6AItems.Any())
                {
                    mat6AItems.Add("Insulation", new List<Dictionary<string, object>>());
                }
                AddTable("Mat 6a", mat6AItems, ref pdfDoc);
            }

            if (documentCertficate.ContainsKey("Mat6b"))
            {
                var mat6BItems = new Dictionary<string, List<Dictionary<string, object>>>();
                var mat6BExternalWallGroup =
                externalWalls.Where(ew => ew.InsulationLayerThickness > 0 && ew.InsulationMaterialName.Contains("RSM"))
                    .GroupBy(ew => ew.InsulationMaterialElementNumber)
                    .Select(ew => new Dictionary<string, object>
                    {
                        {"Name", ew.Single().InsulationMaterialName},
                        {"Element Number", ew.Key},
                        {"Area", ew.Sum(w => w.NetSideArea).ToString("N")},
                        {"Percentage", (ew.Sum(w => w.NetSideArea) / externalWalls.Sum(w => w.NetSideArea)).ToString("P")},
                        {"Green Guide Rating", ew.Single().InsulationLayerMaterialPoint}
                    });
                if (mat6BExternalWallGroup.Any())
                {
                    mat6BItems.Add("Responsibly Sourced External Wall Insulation", mat6BExternalWallGroup.ToList());
                }

                var mat6BBaseSlabGroup = slabs.Where(s => s.InsulationLayerThickness > 0 && s.SlabType == SlabType.BaseSlab && s.InsulationMaterialName.Contains("RSM"))
                        .GroupBy(s => s.InsulationMaterialElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().InsulationMaterialName},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        {"Percentage", (s.Sum(w => w.NetArea) / slabs.Where(sl => sl.SlabType == SlabType.BaseSlab).Sum(w => w.NetArea)).ToString("P")},
                        {"Green Guide Rating", s.First().InsulationLayerMaterialPoint}
                    });
                if (mat6BBaseSlabGroup.Any())
                {
                    mat6BItems.Add("Responsibly Sourced Ground Insulation", mat6BBaseSlabGroup.ToList());
                }

                var mat6BRoofSlabGroup = slabs.Where(s => s.InsulationLayerThickness > 0 && s.SlabType == SlabType.Roof && s.InsulationMaterialName.Contains("RSM"))
                        .GroupBy(s => s.InsulationMaterialElementNumber)
                        .Select(s => new Dictionary<string, object>
                    {
                        {"Name", s.First().InsulationMaterialName},
                        {"Element Number", s.Key},
                        {"Area", s.Sum(w => w.NetArea).ToString("N")},
                        {"Percentage", (s.Sum(w => w.NetArea) / slabs.Where(sl => sl.SlabType == SlabType.Roof).Sum(w => w.NetArea)).ToString("P")},
                        {"Green Guide Rating", s.First().InsulationLayerMaterialPoint}
                    });
                if (mat6BRoofSlabGroup.Any())
                {
                    mat6BItems.Add("Responsibly Sourced Roof Insulation", mat6BRoofSlabGroup.ToList());
                }
                if (!mat6BItems.Any())
                {
                    mat6BItems.Add("Responsibly Sourced Insulation", new List<Dictionary<string, object>>());
                }
                AddTable("Mat 6b", mat6BItems, ref pdfDoc);
            }

            if (documentCertficate.ContainsKey("Mat7"))
            {
                var mat7Items = new Dictionary<string, List<Dictionary<string, object>>>();
                mat7Items.Add("Designing for Robustness", new List<Dictionary<string, object>>());
                AddTable("Mat 7", mat7Items, ref pdfDoc);
            }

            pdfDoc.createPDF(pdfFilePath);
            pdfDoc = null;
        }
		private pdfPage getNewPage(ref double yPos)
		{
			yPos = topMargin;
			if (document == null)
			{
				document = new pdfDocument(myInterface.GetCompetitions()[0].Name,"Allberg Winshooter");
				font = document.getFontReference(predefinedFont.csTimes);
				fontCompetitionHeader = document.getFontReference(predefinedFont.csTimesBold);
				fontHeader = document.getFontReference(predefinedFont.csTimesBold);
			}

			//double xsize = 210/conversionPixelsToMM; // A4 = 210*297mm (35,3*35,3 mm)
			//double ysize = 297/conversionPixelsToMM;
			bottomMargin = (int)((297-20));
			//pdfPage myPage = document.addPage((int)ysize, (int)xsize);
			pdfPage myPage = document.addPage(predefinedPageSize.csA4Page);

			sharpPDF.Fonts.pdfAbstractFont headerFont = document.getFontReference(predefinedFont.csTimes);

			// Add copyright text
			addText(myPage, "WinShooter", 
				leftMargin, (int)((bottomMargin+3)), headerFont, 10);

			//addText(myPage, "©" + settings.PrinterSettings.Copyright, 
			//	leftMargin+155, (int)((bottomMargin+3)), headerFont, 10);

			// Add club logo
			Image image = settings.Logo;

			int logoHeight = image.Height;
			int logoWidth = image.Width;

			calculateLogoSize(image, 60, 200, out logoHeight, out logoWidth);

			int logoX = myPage.width - 20 - logoWidth;
			int logoY = myPage.height - 20 - logoHeight;

			try
			{
				sharpPDF.Elements.pdfImageReference imageRef = document.getImageReference("logo");
				myPage.addImage(imageRef, logoX, logoY, logoHeight, logoWidth);
			}
			catch (sharpPDF.Exceptions.pdfImageNotLoadedException)
			{
				document.addImageReference((System.Drawing.Image)image, "logo");
				sharpPDF.Elements.pdfImageReference imageRef = document.getImageReference("logo");
				myPage.addImage(imageRef, logoX, logoY, logoHeight, logoWidth);
			}

			// Add Winshooter logo
			image = settings.GetWinshooterLogo(1000, 1000);

			logoHeight = image.Height;
			logoWidth = image.Width;

			calculateLogoSize(image, 50, 200, out logoHeight, out logoWidth);

			logoX = myPage.width - 20 - logoWidth;
			logoY = 10;

			try
			{
				sharpPDF.Elements.pdfImageReference imageRef = document.getImageReference("WinShooterLogo");
				myPage.addImage(imageRef, logoX, logoY, logoHeight, logoWidth);
			}
			catch (sharpPDF.Exceptions.pdfImageNotLoadedException)
			{
				document.addImageReference((System.Drawing.Image)image, "WinShooterLogo");
				sharpPDF.Elements.pdfImageReference imageRef = document.getImageReference("WinShooterLogo");
				myPage.addImage(imageRef, logoX, logoY, logoHeight, logoWidth);
			}

			//
			TextStart = 20 + conversionPixelsToMM * logoHeight;

			return myPage;
		}