/// <summary>
        /// Извлекает все необходимые данные из файла и сохраняет в класс ExtractedData.
        /// </summary>
        /// <param name="richTextBox">Объект richTextBox для извлечения данных из текста</param>
        /// <returns>Извлеченные данные из текста.</returns>
        private ExtractedData ExtractData(RichTextBox richTextBox)
        {
            // Непонятно. Почему-то структура долга и кбк при сохранении в rtf теряет переносы строки если не добавить экранирование к \n.
            // Пока на всякий случай оставил .Replace т.к. это был костыль для последних документов, без которого ничего не работало.
            // Причина бага не найдена. Будет исправлено переделкой формата выходного документа из .rtf в .docx.
            ExtractedData extractedData = new ExtractedData
            {
                FullName      = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.FullName, RegexOptions.IgnoreCase),
                Address       = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.Address, RegexOptions.IgnoreCase),
                DateOfBirth   = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.DateOfBirth, RegexOptions.IgnoreCase),
                BirthPlace    = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.BirthPlace, RegexOptions.IgnoreCase),
                Inn           = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.Inn, RegexOptions.IgnoreCase),
                DebtStructure = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.DebtStructure).Replace("\n", "\\\n"),
                BankDetails   = MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.BankDetails).Replace("\n", "\\\n")
            };

            // Определяем общую сумму задолженности для расчета госпошлины БЕЗ учета копеек.
            if (Int32.TryParse(MyRegex.FindDataWithRegex(richTextBox.Text, MyRegex.AllDebt), out int allDebt))
            {
                extractedData.AllDebt = allDebt;
            }
            else
            {
                MessageBox.Show("В тексте не было найдено общей суммы задолженности, возможно вы пытаетесь извлечь данные из неподходящего документа");
            }
            return(extractedData);
        }
 public DataViewForm(ExtractedData extractedData)
 {
     InitializeComponent();
     fullNameTextBox.Text          = extractedData.FullName;
     addressTextBox.Text           = extractedData.Address;
     bplTextBox.Text               = extractedData.BirthPlace;
     dobTextBox.Text               = extractedData.DateOfBirth;
     innTextBox.Text               = extractedData.Inn;
     allDebtNumericUpDown.Value    = Convert.ToDecimal(extractedData.AllDebt);
     debtStructureRichTextBox.Text = extractedData.DebtStructure;
     bankDetailsRichTextBox.Text   = extractedData.BankDetails;
     stateDutyNumericUpDown.Value  = extractedData.CalculateStateDuty();
 }
 /// <summary>
 /// Вставляет извлеченные данные в шаблон.
 /// </summary>
 /// <param name="rtf">Строка в формате RTF (richTextBox.Rtf).</param>
 /// <param name="extractedData">Объект с извлеченными из заявления данными.</param>
 /// <returns>Строка в формате RTF (richTextBox.Rtf).</returns>
 private string CreateCourtOrder(string rtf, ExtractedData extractedData)
 {
     rtf = rtf.Replace("#FULLNAME#", extractedData.FullName);
     rtf = rtf.Replace("#FULLNAMEGENITIVE#", extractedData.FullNameGenitive);
     rtf = rtf.Replace("#DATEOFBIRTH#", extractedData.DateOfBirth);
     rtf = rtf.Replace("#PLACEOFBIRTH#", extractedData.BirthPlace);
     rtf = rtf.Replace("#ADDRESS#", extractedData.Address);
     rtf = rtf.Replace("#INDIVIDUALTAXNUMBER#", extractedData.Inn);
     rtf = rtf.Replace("#DEBTSTRUCTURE#", extractedData.DebtStructure);
     rtf = rtf.Replace("#GOSPOSHLINA#", extractedData.CalculateStateDuty().ToString());
     rtf = rtf.Replace("#BANKDETAILS#", extractedData.BankDetails);
     return(rtf);
 }
        /// <summary>
        /// Автоматическое создание судебных приказов для всех файлов в папке.
        /// </summary>
        private void DirectoryCreateOrderButton_Click(object sender, EventArgs e)
        {
            using (FolderBrowserDialog dialog = new FolderBrowserDialog())
            {
                dialog.Description = "Выбор директории";
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    var files    = Directory.GetFiles(dialog.SelectedPath);
                    var rtfFiles = files.Where(f => Path.GetExtension(f).ToLower() == ".rtf");
                    // Максимум прогрессбара равен числу обрабатываемых файлов.
                    progressBarMultiThreading.Maximum = rtfFiles.Count();
                    LockAllButtons();

                    // todo: Исправить ошибку: при обработке нескольких копий файла, например делаю 20 копий
                    // "обезличенного заявления", из них штук пять останутся необработанными, в то время
                    // как программа напишет, что обработала все файлы.
                    // Ошибка из-за того, что несколько потоков пытаются сохранить файл с одним именем.
                    // Сейчас вылетают MessageBox с текстом исключения. Нужно исправить.
                    // Баг временно исправлен добавление ID потока в имя сохраняемого файла. Но нужно сделать иначе.
                    Thread th = new Thread(new ThreadStart(() =>
                    {
                        Parallel.ForEach(rtfFiles, delegate(string file)
                        {
                            RichTextBox box = new RichTextBox {
                                Rtf = ExtractTextFromRtf(file)
                            };
                            ExtractedData extData = ExtractData(box);
                            box.Rtf = CreateCourtOrder(WorkWithFiles.CourtOrderTemplate, extData);
                            SaveCourtOrder(new FileInfo(file), extData.FullName + " " + Environment.CurrentManagedThreadId, box);
                            progressBarMultiThreading.Invoke((Action)(() => { progressBarMultiThreading.PerformStep(); }));
                        });

                        // todo: Добавить проверку на оставшиеся необработанными файлы.
                        MessageBox.Show($"Обработано документов: {rtfFiles.Count()}");
                        OrdersInDirectoryWasCreated();
                    }));
                    th.Start();
                }
            }
        }
 /// <summary>
 /// При нажатии кнопки извлекает все необходимые данные и сохраняет в объект extractedData.
 /// </summary>
 private void ExtractDataButton_Click(object sender, EventArgs e)
 {
     extractedData = ExtractData(richTextBox);
     DataExtracted();
 }