Пример #1
0
        public TCertSys()
        {
            tesOCR = new TTeseract_OCR(); //создаем поисковик

            initDictionary(ref words);    //инициализируем словарь транслитеризации
        }
Пример #2
0
        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, "");
            }
        }