/// <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(); }