static void Main(string[] args) { // ReadPdf(); // 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"; PdfSharpCore.Pdf.Security.PdfSecuritySettings securitySettings = document.SecuritySettings; // Setting one of the passwords automatically sets the security level to // PdfDocumentSecurityLevel.Encrypted128Bit. securitySettings.UserPassword = "******"; securitySettings.OwnerPassword = "******"; // Don't use 40 bit encryption unless needed for compatibility //securitySettings.DocumentSecurityLevel = PdfDocumentSecurityLevel.Encrypted40Bit; // Restrict some rights. securitySettings.PermitAccessibilityExtractContent = false; securitySettings.PermitAnnotations = false; securitySettings.PermitAssembleDocument = false; securitySettings.PermitExtractContent = false; securitySettings.PermitFormsFill = true; securitySettings.PermitFullQualityPrint = false; securitySettings.PermitModifyDocument = true; securitySettings.PermitPrint = false; 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
private void ExecuteProtecteFile() { if (cbProtectFile.Checked) { LoadDocuments(); if (PdfDocuments != null && PdfDocuments.Any()) { string[] registros = System.IO.File.ReadAllLines(txtAdditionalInfoCSVFile.Text); string csvSeparator = CheckCSVSeparator(registros); if (registros != null && registros.Any()) { foreach (KeyValuePair <string, PdfDocument> item in PdfDocuments) { string[] tmp = item.Key.Split("\\", StringSplitOptions.RemoveEmptyEntries); if (tmp != null && tmp.Any()) { string arquivo = tmp.Last(); arquivo = arquivo.Replace(".pdf", "", StringComparison.InvariantCultureIgnoreCase); if (registros.Any(w => w.IndexOf(arquivo, StringComparison.InvariantCultureIgnoreCase) > -1)) { string[] linha = registros.First(w => w.IndexOf(arquivo, StringComparison.InvariantCultureIgnoreCase) > -1).Split(csvSeparator, StringSplitOptions.RemoveEmptyEntries); if (linha != null && linha.Any()) { PdfSharpCore.Pdf.Security.PdfSecuritySettings securitySettings = item.Value.SecuritySettings; securitySettings.UserPassword = arquivo.Replace(".", "", StringComparison.InvariantCultureIgnoreCase).Replace("-", "", StringComparison.InvariantCultureIgnoreCase); securitySettings.OwnerPassword = arquivo; securitySettings.PermitAccessibilityExtractContent = false; securitySettings.PermitAnnotations = false; securitySettings.PermitAssembleDocument = false; securitySettings.PermitExtractContent = false; securitySettings.PermitFormsFill = true; securitySettings.PermitFullQualityPrint = true; securitySettings.PermitModifyDocument = false; securitySettings.PermitPrint = true; } } } } } } } }