public TCertSys() { tesOCR = new TTeseract_OCR(); //создаем поисковик initDictionary(ref words); //инициализируем словарь транслитеризации }
private void OcrBtn_Click(object sender, EventArgs e) { try { if (docFilePath == "") { folderBrowserDialog.ShowDialog(); } { //if(true) //чистим объекты формы textBox.Text = ""; isDoneProcLabel.Text = ""; Dictionary <string, string> words = null; //инициализируем словарь транслитеризации initDictionary(ref words); //folderBrowserDialog.SelectedPath = "C:\\Users\\YashuninAM\\Desktop\\[ПО]Разработка\\[ПО]Распознаватель_сертов_и_приложений\\2\\Сертификаты\\Сертификаты\\Test"; //folderBrowserDialog.SelectedPath = "C:\\Users\\YashuninAM\\Desktop\\[ПО]Разработка\\[ПО]Распознаватель_сертов_и_приложений\\2\\Сертификаты\\Сертификаты\\Test_debug"; //folderBrowserDialog.SelectedPath = @"C:\Users\YashuninAM\Desktop\[ПО]Разработка\[ПО]Распознаватель_сертов_и_приложений\2\Сертификаты\Сертификаты\[ПРОММАШТЕСТ]Test_Debug"; //folderBrowserDialog.SelectedPath = @"C:\Users\Alexey\Desktop\[ПРОММАШТЕСТ]Test_Debug"; //создаем pdf конвертер TPDFConverter pdfConverter = new TPDFConverter(); //для записи Image'й в файл TFileWriter fileWriter = new TFileWriter(); //создаем графические фильтры TCropTool cropTool = new TCropTool(); TResizeTool resizeTool = new TResizeTool(); //создаем поисковик TTeseract_OCR tesOCR = new TTeseract_OCR(); //забираем кол-во тасков if (Tasks_amount_txtbox.Text != "") { delimTaskValue = Convert.ToInt32(Tasks_amount_txtbox.Text); abbyOCR = new TABBYFineReader(delimTaskValue);//ставим значение от delimTaskValue (в коде ниже) } else { abbyOCR = new TABBYFineReader(delimTaskValue);//ставим значение от delimTaskValue (в коде ниже) } //контейнеры для обработанных изображений List <Image> imagePdfPages = null; List <Image> imageCropPages = new List <Image>(); List <Image> imageScaledPages = new List <Image>(); //задаем выходной формат изображения System.Drawing.Imaging.ImageFormat imgFormat = System.Drawing.Imaging.ImageFormat.Png; //удаляем старые выходные данные string currentPath = System.IO.Directory.GetCurrentDirectory(); //сохраняем путь к папке входных данных string inputFolder = folderBrowserDialog.SelectedPath; //получаем название папки для дальнейшего экспорта содержимого string folderName = ""; if (docFilePath == "") { folderName = Path.GetFileName(Path.GetDirectoryName(folderBrowserDialog.SelectedPath + "\\")); } else { string filePath = (File.ReadAllLines(docFilePath)[0]); folderName = Path.GetFileName(Path.GetDirectoryName(filePath)); } string outFilePath = currentPath + "\\[OUT]Data\\" + folderName; //string outFilePath = @"\\msk-dc01-elma1p\elmabin\cert archive\\" + folderName; //создаем папку для выходных документов pdf System.IO.Directory.CreateDirectory(outFilePath); //создаем папку для текущего документа System.IO.Directory.CreateDirectory(currentPath + "\\[OUT]Data\\"); //пишем список оставшихся файлов для распознания, если упало string outCrashFolder = currentPath + "\\[Crash]Log"; if (System.IO.Directory.Exists(outCrashFolder)) { System.IO.Directory.Delete(outCrashFolder, true); } System.IO.Directory.CreateDirectory(outCrashFolder); //составляем список pdf файлов if (docFilePath != "") { string[] lines = File.ReadAllLines(docFilePath, Encoding.UTF8); fileNames = new List <string>(); for (int i = 0; i < lines.Length; i++) { fileNames.Add(lines[i]); } } else { fileNames = getPdfFiles(inputFolder); } //устанавливаем предел прогресс-бара processProgressBar.Maximum = fileNames.Count; //рендерим, распознаем, сохраняем документы for (int i = 0; i < fileNames.Count; i++) { //пишем текущий файл в документ для последующего учета if (File.Exists(currentPath + "\\[OUT]Data\\Current_file.txt") == true) { File.Delete(currentPath + "\\[OUT]Data\\Current_file.txt"); } System.IO.File.WriteAllText(currentPath + "\\[OUT]Data\\Current_file.txt", fileNames[i]); //сохраняем индекс для аварийного случая curIndFileNames = i; //чтобы система успевала обработать запросы и других COM-библиотек Application.DoEvents(); //читаем pdf документ и рендерим в imag'ы try { imagePdfPages = pdfConverter.pdfToImage(fileNames[i], 300, 3.0f); //throw new System.ArgumentException("Parameter cannot be null", "original"); } catch (System.Exception error) { //сохраняем название проблемного файла saveErrorFile(error, fileNames[i]); continue; } //////////////////////////////////////////////////////////////////////////// //вырезаем верхнюю часть страницы(20%) и сохраняем отдельно float cropValue = 0.09f; float cropHeightOffset = 0.08f; for (int j = 0; j < imagePdfPages.Count; j++) { Image img = imagePdfPages[j]; int imgCropHeight = Convert.ToInt32((img.Height) * (cropValue)); int imgCropHeightOffset = Convert.ToInt32((img.Height) * (cropHeightOffset)); Rectangle imgCropRect = new Rectangle(0, imgCropHeightOffset, img.Width, imgCropHeight); img = cropTool.cropImage(img, imgCropRect); imagePdfPages[j] = img; } //////////////////////////////////////////////////////////////////////////// //увеличиваем размер входного изображения(т.е масштабируем) float scaleValue = 1.5f;// начинаем с 50% for (int j = 0; j < imagePdfPages.Count; j++) { Image img = imagePdfPages[j]; int newWidth = Convert.ToInt32((img.Width) * (scaleValue)); int newHeight = Convert.ToInt32((img.Height) * (scaleValue)); Bitmap imgBitmap = resizeTool.resizeImage(img, newWidth, newHeight); imageScaledPages.Add((Image)imgBitmap); } //создаем список задач ocrTasks = new Task[imagePdfPages.Count]; //проходим по страницам документа List <pdfPageInfo> infoPages = new List <pdfPageInfo>(imagePdfPages.Count);//информация по страницам pdf //распознаем страницы for (int j = 0; j < imageScaledPages.Count; j++) { object arg = j; ocrTasks[j] = new Task(() => ocrImage(ref imagePdfPages, ref imageScaledPages, ref infoPages, arg)); } /*//кол-во тасков, запускаемых одновременно * int delimTaskValue=2;*/ //запускаем таски for (int j = 0; j < ocrTasks.Length; j++) { if (((j + 1) % delimTaskValue == 0)) { Task[] delimTasks = new Task[delimTaskValue]; for (int k = 0; k < delimTaskValue; k++) { delimTasks[k] = ocrTasks[(j + 1) - delimTaskValue + k]; } for (int k = 0; k < delimTaskValue; k++) { delimTasks[k].Start(); } //ждем завершения всех тасков Task.WaitAll(delimTasks); //удаляем следы FineReader'а abbyOCR.destroyFRProcess(); } //ocrTasks[j].Start(); } //разбираем остаточную страницу(если есть) int ostatokPages = (ocrTasks.Length % 2); if (ostatokPages != 0) { ocrTasks[ocrTasks.Length - 1].Start(); ocrTasks[ocrTasks.Length - 1].Wait(); } //ждем завершения всех тасков //Task.WaitAll(ocrTasks); //если документ состоит из сертификата и приложений, то сохраняем if (infoPages.Count > 0) { //сохраняем документы fileWriter.exportSertificatesAndPrilozenia(fileNames[i], outFilePath, infoPages); } //throw new ArgumentNullException();//для отладки лога //пишем лог if (textBox.Text == "") { string textBoxStrTemp = "[" + (i + 1) + "] = " + fileNames[i] + "\n"; textBox.Text = textBoxStrTemp.Replace("\n", Environment.NewLine); } else { string textBoxStr = textBox.Text + "\n[" + (i + 1) + "] = " + fileNames[i] + "\n"; textBox.Text = textBoxStr.Replace("\n", Environment.NewLine); } processProgressBar.Value += 1; //обновляем форму this.Refresh(); Application.DoEvents(); //чистим infoPages infoPages.Clear(); //чистим контейнеры с изображениями, поскольку размеры контейнеров равны, то берем один из двух for (int j = 0; j < imagePdfPages.Count; j++) { imagePdfPages[j].Dispose(); imageScaledPages[j].Dispose(); } imagePdfPages.Clear(); imageScaledPages.Clear(); //удаляем временные файлы FineReader'а abbyOCR.destroyOutFolders(); //удаляем следы FineReader'а abbyOCR.destroyFRProcess(); //txtResult.Text = infoPage.fullNumber_; } //когда процесс закончен, то выводим уведомления isDoneProcLabel.Text = "Done"; MessageBox.Show("Done"); } } catch (Exception error) { saveErrorFile(error, ""); } }