public DocumentModificationResult AddDocumentPageBitmap(OrderedBitmap bitmap)
        {
            if (_documentPages.ContainsKey((int)bitmap.Order))
            {
                return(DocumentModificationResult.Failure(new AddedBitmapForPageTwice((int)bitmap.Order)));
            }

            return(ReplaceDocumentPageBitmap(bitmap));
        }
        private RecognizedChoicePart RecognizeChoicePart(OrderedBitmap page, IActorRef senderRef, DocumentToProcess document,
                                                         ICroppedArea croppedPart, ICroppedArea roiExtractResult)
        {
            var recognitionResult = _handwrittenChoiceRecognizer.RecognizeFrom(roiExtractResult).Result as RecognizedChoicePart;

            recognitionResult.AreaName = croppedPart.AreaUsedForCropping.AreaName;

            senderRef.Tell(new DocumentPageChoiceAreaProcessingCompleted(document.Id, (int)page.Order,
                                                                         croppedPart.AreaUsedForCropping.AreaName, recognitionResult));

            return(recognitionResult);
        }
        private RecognizedTextPart RecognizeTextPart(OrderedBitmap page, IActorRef selfRef, DocumentToProcess document,
                                                     ICroppedArea croppedPart, FlattenedCroppedArea downscaleResult)
        {
            var recognitionResult = _handwrittenInputRecognizer.RecognizeFrom(downscaleResult).Result;

            recognitionResult.AreaName = croppedPart.AreaUsedForCropping.AreaName;

            selfRef.Tell(new DocumentPageTextAreaProcessingCompleted(document.Id, (int)page.Order,
                                                                     croppedPart.AreaUsedForCropping.AreaName, recognitionResult));

            return(recognitionResult as RecognizedTextPart);
        }
        private void ProcessPage(OrderedBitmap page, IActorRef senderRef, DocumentToProcess document)
        {
            senderRef.Tell(new DocumentPageProcessingStarted(document.Id, (int)page.Order));
            var pageDefinition = document.TemplateDefinition.DefinedPages[(int)page.Order];

            //Extracting from input only parts that are handwritten elements (ie. delta between empty document and filled by hand document)
            var extractedParts = _imagePreparationSteps.HandwrittenInputExtractor.ExtractHandwrittenInput(page.Bitmap, pageDefinition);
            //And cropping them according to defined template
            var croppingResult = _imagePreparationSteps.TemplateAreasCropper.CropUserInput(extractedParts.Result, document.Id, pageDefinition);

            //Processed parts
            var processedTextAreas   = new List <RecognizedTextPart>();
            var processedChoiceAreas = new List <RecognizedChoicePart>();

            foreach (var croppedPart in croppingResult.Result)
            {
                senderRef.Tell(new DocumentPageAreaProcessingStarted(document.Id, (int)page.Order, croppedPart.AreaUsedForCropping.AreaName));

                var cleanResult      = _imagePreparationSteps.CroppedAreaCleaner.CleanUp(croppedPart).Result;
                var roiExtractResult = _imagePreparationSteps.RegionOfInterestExtractor.ExtractRegionOfInterestFrom(cleanResult).Result;

                //Choice part, ie. checkbox on paper
                if (croppedPart.AreaUsedForCropping.ExpectedData == TemplatePartExpectedDataType.Choice)
                {
                    processedChoiceAreas.Add(RecognizeChoicePart(page, senderRef, document, croppedPart, roiExtractResult));
                }
                //Text part, ie. field to fill with name/surname/personal id etc.
                else
                {
                    var downscaleResult = _imagePreparationSteps.CroppedAreaScaler.ScaleAndFlatten(roiExtractResult).Result;
                    processedTextAreas.Add(RecognizeTextPart(page, senderRef, document, croppedPart, downscaleResult));
                }
            }

            var processedPage = new ProcessedDocumentPage(processedTextAreas, processedChoiceAreas, (int)page.Order);

            var savePageResult = _saveProcessedPageHandler.Handle(processedPage.AsSaveCommand());

            if (savePageResult.Successful)
            {
                senderRef.Tell(new DocumentPageProcessingCompleted(document.Id, processedPage));
            }
            //TODO: Create failure communication, ie. selfRef.Tell(new Failure())
            else
            {
                Console.WriteLine("Failed to save recognized parts for page: " + page.Order + "of document: " + document.Id);
            }
        }
        public DocumentModificationResult ReplaceDocumentPageBitmap(OrderedBitmap bitmap)
        {
            if (!TemplateDefinition.DefinedPages.ContainsKey((int)bitmap.Order))
            {
                return(DocumentModificationResult.Failure(new AddedBitmapForNonexistentPage((int)bitmap.Order)));
            }

            if (_documentPages.ContainsKey((int)bitmap.Order))
            {
                _documentPages[(int)bitmap.Order] = bitmap;
            }
            else
            {
                _documentPages.Add((int)bitmap.Order, bitmap);
            }

            return(DocumentModificationResult.Success());
        }