static void Main(string[] args) { // TfsRemover.RemoveTFS(); TreeInfo ti = GetAncestors(); int maxNumPeople = (int)System.Math.Pow(2.0, (double)ti.MaxGeneration); System.Console.WriteLine(maxNumPeople); System.Collections.Generic.Dictionary <int, System.Collections.Generic.Dictionary <int , DataPoint> > dict = new System.Collections.Generic.Dictionary <int , System.Collections.Generic.Dictionary <int, DataPoint> >(); PdfSharpCore.Fonts.GlobalFontSettings.FontResolver = new FontResolver(); MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel.Shapes .ImageSource.ImageSourceImpl = new PdfSharpCore.ImageSharp.ImageSharpImageSource <Rgba32>(); using (PdfSharpCore.Pdf.PdfDocument document = new PdfSharpCore.Pdf.PdfDocument()) { document.Info.Title = "Family Tree"; document.Info.Author = "FamilyTree Ltd. - Stefan Steiger"; document.Info.Subject = "Family Tree"; document.Info.Keywords = "Family Tree, Genealogical Tree, Genealogy, Bloodline, Pedigree"; document.ViewerPreferences.Direction = PdfSharpCore.Pdf.PdfReadingDirection.LeftToRight; PdfSharpCore.Pdf.PdfPage page = document.AddPage(); // page.Width = PdfSettings.PaperFormatSettings.Width // page.Height = PdfSettings.PaperFormatSettings.Height const double GOLDEN_RATIO = 1.61803398875; // https://en.wikipedia.org/wiki/Golden_ratio double marginLeft = 125; double marginTop = marginLeft; double textBoxWidth = 200; double textBoxHeight = textBoxWidth / GOLDEN_RATIO; double textBoxVdistance = textBoxHeight / (GOLDEN_RATIO / (GOLDEN_RATIO * GOLDEN_RATIO)); double textBoxLargeHdistance = textBoxWidth / (GOLDEN_RATIO * GOLDEN_RATIO); double textBoxSmallHdistance = textBoxLargeHdistance / (GOLDEN_RATIO * GOLDEN_RATIO); int numGenerationsToList = 5; int maxGenerationIndex = numGenerationsToList - 1; int numItems = (int)System.Math.Pow(2, maxGenerationIndex); page.Orientation = PdfSharpCore.PageOrientation.Landscape; page.Width = marginLeft * 2 + numItems * textBoxWidth + (numItems / 2) * textBoxSmallHdistance + (numItems / 2 - 1) * textBoxLargeHdistance ; page.Height = marginTop * 2 + numGenerationsToList * textBoxHeight + (numGenerationsToList - 1) * textBoxVdistance ; double dblLineWidth = 1.0; string strHtmlColor = "#FF00FF"; PdfSharpCore.Drawing.XColor lineColor = XColorHelper.FromHtml(strHtmlColor); PdfSharpCore.Drawing.XPen pen = new PdfSharpCore.Drawing.XPen(lineColor, dblLineWidth); PdfSharpCore.Drawing.XFont font = new PdfSharpCore.Drawing.XFont("Arial" , 12.0, PdfSharpCore.Drawing.XFontStyle.Bold ); using (PdfSharpCore.Drawing.XGraphics gfx = PdfSharpCore.Drawing.XGraphics.FromPdfPage(page)) { gfx.MUH = PdfSharpCore.Pdf.PdfFontEncoding.Unicode; PdfSharpCore.Drawing.Layout.XTextFormatter tf = new PdfSharpCore.Drawing.Layout.XTextFormatter(gfx); tf.Alignment = PdfSharpCore.Drawing.Layout.XParagraphAlignment.Left; PdfSharpCore.Drawing.Layout.XTextFormatterEx2 etf = new PdfSharpCore.Drawing.Layout.XTextFormatterEx2(gfx); for (int generationNumber = maxGenerationIndex; generationNumber > -1; --generationNumber) { dict[generationNumber] = new System.Collections.Generic.Dictionary <int, DataPoint>(); int num = (int)System.Math.Pow(2.0, generationNumber); for (int i = 0; i < num; ++i) { if (generationNumber != maxGenerationIndex) { var dp1 = dict[generationNumber + 1][i * 2]; var dp2 = dict[generationNumber + 1][i * 2 + 1]; var rect1 = dp1.rect; var rect2 = dp2.rect; double xNew = (rect1.TopLeft.X + rect2.TopRight.X) / 2.0; double yNew = marginTop + generationNumber * textBoxHeight + generationNumber * textBoxVdistance; gfx.DrawLine(pen, xNew, yNew + rect1.Height, rect1.X + rect1.Width / 2.0, rect1.Y); gfx.DrawLine(pen, xNew, yNew + rect1.Height, rect2.X + rect2.Width / 2.0, rect2.Y); xNew = xNew - rect1.Width / 2.0; dict[generationNumber][i] = new DataPoint() { Person = ( from itemList in ti.ls[generationNumber] where itemList.Id == dp1.Person.Child select itemList ).FirstOrDefault(), rect = new DataStructures.Rectangle(xNew, yNew, rect1.Width, rect1.Height) }; } else { System.Console.WriteLine($"i: {i}"); int numSmallSpaces = (i + 1) / 2; System.Console.WriteLine($"numSmallSpaces: {numSmallSpaces}"); int numPairs = i / 2; System.Console.WriteLine($"numPairs: {numPairs}"); double rectX = marginLeft + i * textBoxWidth + numSmallSpaces * textBoxSmallHdistance + numPairs * textBoxLargeHdistance ; double rectY = marginTop + generationNumber * textBoxHeight + generationNumber * textBoxVdistance ; dict[generationNumber][i] = new DataPoint() { Person = ti.ls[generationNumber][i], rect = new DataStructures.Rectangle(rectX, rectY, textBoxWidth, textBoxHeight) }; } gfx.DrawRectangle(pen, dict[generationNumber][i].rect.ToXRect()); string text = $@"Generation {generationNumber} Person {i}"; text = dict[generationNumber][i].Person.composite_name; tf.DrawString(text , font , PdfSharpCore.Drawing.XBrushes.Black , dict[generationNumber][i].rect.ToXRect() , PdfSharpCore.Drawing.XStringFormats.TopLeft ); } // Next i } // Next generationNumber } // End Using gfx byte[] baPdfDocument; using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { document.Save(ms, false); ms.Flush(); // baPdfDocument = new byte[ms.Length]; // ms.Seek(0, System.IO.SeekOrigin.Begin); // ms.Read(baPdfDocument, 0, (int)ms.Length); baPdfDocument = ms.ToArray(); } // End Using ms System.IO.File.WriteAllBytes("FamilyTree.pdf", baPdfDocument); //document.Save(filename); } // End Using document System.Console.WriteLine(System.Environment.NewLine); System.Console.WriteLine(" --- Press any key to continue --- "); System.Console.ReadKey(); } // End Sub Main
static void OldSimpleMain(string[] args) { PdfSharpCore.Fonts.GlobalFontSettings.FontResolver = new FontResolver(); MigraDocCore.DocumentObjectModel.MigraDoc.DocumentObjectModel.Shapes .ImageSource.ImageSourceImpl = new PdfSharpCore.ImageSharp.ImageSharpImageSource <SixLabors.ImageSharp.PixelFormats.Rgba32>(); using (PdfSharpCore.Pdf.PdfDocument document = new PdfSharpCore.Pdf.PdfDocument()) { document.Info.Title = "Family Tree"; document.Info.Author = "FamilyTree Ltd. - Stefan Steiger"; document.Info.Subject = "Family Tree"; document.Info.Keywords = "Family Tree, Genealogical Tree, Genealogy, Bloodline, Pedigree"; document.ViewerPreferences.Direction = PdfSharpCore.Pdf.PdfReadingDirection.LeftToRight; PdfSharpCore.Pdf.PdfPage page = document.AddPage(); // page.Width = PdfSettings.PaperFormatSettings.Width // page.Height = PdfSettings.PaperFormatSettings.Height page.Width = 500; page.Height = 1000; page.Orientation = PdfSharpCore.PageOrientation.Landscape; double mid = page.Width / 2; double textBoxWidth = 200; double halfTextBoxWidth = textBoxWidth / 2; using (PdfSharpCore.Drawing.XGraphics gfx = PdfSharpCore.Drawing.XGraphics.FromPdfPage(page)) { gfx.MUH = PdfSharpCore.Pdf.PdfFontEncoding.Unicode; PdfSharpCore.Drawing.Layout.XTextFormatter tf = new PdfSharpCore.Drawing.Layout.XTextFormatter(gfx); tf.Alignment = PdfSharpCore.Drawing.Layout.XParagraphAlignment.Left; PdfSharpCore.Drawing.Layout.XTextFormatterEx2 etf = new PdfSharpCore.Drawing.Layout.XTextFormatterEx2(gfx); string fn = @"C:\Users\username\Pictures\4_Warning_Signs_Of_Instability_In_Russia1.png"; // fn = @"C:\Users\username\Pictures\62e867ba-9bb7-40d0-b01f-57f7cc951929.jpg"; // DrawImg(fn, gfx, 10, 10); double dblWidth = 1.0; string strHtmlColor = "#FF00FF"; PdfSharpCore.Drawing.XColor LineColor = XColorHelper.FromHtml(strHtmlColor); PdfSharpCore.Drawing.XPen pen = new PdfSharpCore.Drawing.XPen(LineColor, dblWidth); double dblX1 = 100; double dblY1 = 100; double dblX2 = 200; double dblY2 = 200; gfx.DrawLine(pen, dblX1, dblY1, dblX2, dblY2); double rectX = 100; double rectY = 100; double rectWidth = 200; double rectHeight = 100; PdfSharpCore.Drawing.XRect rect = new PdfSharpCore.Drawing.XRect(rectX, rectY , rectWidth, rectHeight ); PdfSharpCore.Drawing.XFont font = new PdfSharpCore.Drawing.XFont("Arial" , 12.0, PdfSharpCore.Drawing.XFontStyle.Bold ); int lastFittingChar = 0; double neededHeight = 0.0; string text = @"I bi dr Gummiboum U schtah eifach so chli da So wie jedä Gummiboum 'sch im Fau aues, woni cha U i nime d Tage so wie si sii U si chömed u gö wider verbii U aues wird anders oder blibt wies isch gsii Ja i nime d Tage so we si sii U si chömed u gö wider verbii Aues wird anders oder blibt wies isch gsii Ja aues wird anders oder blibt wies isch gsii I bi dr Gummiboum U verstoube fängs ä chli Oh Gummiboum I bin ä geile huere Gummiboum öppert mues ne schliesslich sii"; etf.PrepareDrawString(text, font, rect, out lastFittingChar, out neededHeight); System.Console.WriteLine(lastFittingChar); System.Console.WriteLine(neededHeight); string foo = text.Substring(0, lastFittingChar); System.Console.WriteLine(foo); tf.DrawString(text , font , PdfSharpCore.Drawing.XBrushes.Black , rect , PdfSharpCore.Drawing.XStringFormats.TopLeft ); //gfx.DrawRectangle(PdfSharpCore.Drawing.XBrushes.HotPink, rect); gfx.DrawRectangle(pen, rect); } // End Using gfx byte[] baPdfDocument; using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { document.Save(ms, false); ms.Flush(); // baPdfDocument = new byte[ms.Length]; // ms.Seek(0, System.IO.SeekOrigin.Begin); // ms.Read(baPdfDocument, 0, (int)ms.Length); baPdfDocument = ms.ToArray(); } // End Using ms System.IO.File.WriteAllBytes("FamilyTree.pdf", baPdfDocument); //document.Save(filename); } // End Using document System.Console.WriteLine(System.Environment.NewLine); System.Console.WriteLine(" --- Press any key to continue --- "); System.Console.ReadKey(); } // End Sub Main
// StaticConvertFromString // https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/ColorConverter.cs public static PdfSharpCore.Drawing.XColor FromHtml(string htmlColor) { if (string.IsNullOrEmpty(htmlColor)) { // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.Color.Empty); return(System.Drawing.Color.Empty); } if (htmlColor.StartsWith("#")) { htmlColor = htmlColor.Substring(1); if (htmlColor.Length == 3) { string R = htmlColor.Substring(0, 1); string G = htmlColor.Substring(1, 1); string B = htmlColor.Substring(2, 1); htmlColor = System.Convert.ToString(System.Convert.ToString(System.Convert.ToString(System.Convert.ToString(R + R) + G) + G) + B) + B; } // (htmlColor.Length == 3) if (htmlColor.Length == 6) { string sR = htmlColor.Substring(0, 2); string sG = htmlColor.Substring(2, 2); string sB = htmlColor.Substring(4, 2); byte R = System.Convert.ToByte(sR, 16); byte G = System.Convert.ToByte(sG, 16); byte B = System.Convert.ToByte(sB, 16); PdfSharpCore.Drawing.XColor xc = new PdfSharpCore.Drawing.XColor(); xc.R = R; xc.G = G; xc.B = B; xc.A = 1.0; return(xc); } // (htmlColor.Length == 6) throw new ArgumentException("Invalid HTML color."); } // (htmlColor.StartsWith("#")) switch (htmlColor.ToLowerInvariant()) { case "buttonface": case "threedface": //return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.Control); return(System.Drawing.SystemColors.Control); case "buttonhighlight": case "threedlightshadow": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.ControlLightLight); return(System.Drawing.SystemColors.ControlLightLight); case "buttonshadow": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.ControlDark); return(System.Drawing.SystemColors.ControlDark); case "captiontext": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.ActiveCaptionText); return(System.Drawing.SystemColors.ActiveCaptionText); case "threeddarkshadow": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.ControlDarkDark); return(System.Drawing.SystemColors.ControlDarkDark); case "threedhighlight": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.ControlLight); return(System.Drawing.SystemColors.ControlLight); case "background": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.Desktop); return(System.Drawing.SystemColors.Desktop); case "buttontext": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.ControlText); return(System.Drawing.SystemColors.ControlText); case "infobackground": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.SystemColors.Info); return(System.Drawing.SystemColors.Info); // special case for Color.LightGray versus html's LightGrey (#340917) case "lightgrey": // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.Color.LightGray); return(System.Drawing.Color.LightGray); } // End Switch (htmlColor.ToLowerInvariant()) PdfSharpCore.Drawing.XKnownColor kk = default(PdfSharpCore.Drawing.XKnownColor); if (TryEnumParse <PdfSharpCore.Drawing.XKnownColor>(htmlColor, true, ref kk)) { return(PdfSharpCore.Drawing.XColor.FromKnownColor(kk)); } // return PdfSharpCore.Drawing.XColor.FromArgb(System.Drawing.Color.Empty); return(System.Drawing.Color.Empty); } // FromHtml