public static bool TenantDocumentPerformOcr(Tenant tenant, Document document, WorkerRoleParameters workerRoleParameters, out Exception exception) { var result = false; Document ocrDocument = null; List <DocumentTemplate> ocrDocumentTemplate = null; List <DocumentFragment> ocrDocumentFragment = null; exception = null; try { List <Template> allTemplates = null; List <TemplateElement> allElements = null; using (var context = new ContextTenant(tenant.DatabaseConnectionString)) { allTemplates = context .Templates .AsNoTracking() .Include(t => t.Elements) .Include(t => t.Elements.Select(x => x.ElementDetails)) .Where(t => (t.IsActive == true) && (t.IsFinalized == true)) .ToList(); if (allTemplates.Count <= 0) { throw (new Exception("No templates found.")); } } // workerRoleParameters??? // Download file from azure. Stream stream = null; List <OcrResultInfo> ocrresultinfos = new List <OcrResultInfo> (); if (WorkerRoleSimulation.GetTenantDocumentFileStream(tenant, document, out stream, out exception)) { Image documentImage = null; using (var image = Image.FromStream(stream)) { documentImage = (Image)image.Clone(); // LeadTools code. // Stream and image available. } // TODO: Replace with Server.MapPath. //LeadToolsOCR leadtoolsocr = new LeadToolsOCR (workerRoleParameters.OcrEngineSettings.GetPathData().FullName, tenant.Id.ToString (), string.Empty, out exception); //if (exception != null) { throw exception; } List <LeadtoolsBarcodeData> barcodedata = null; bool foundbarcode = false; // leadtoolsocr.ReadBarcode (documentImage, out barcodedata, out exception); //if (exception != null) { throw exception; } if (foundbarcode) { //What to do if multiple barcodes are found. int templateid = 0; bool foundId = int.TryParse(barcodedata.First().Value, out templateid); if (!(foundId) || templateid <= 0) { } //What to do if Form Id is Not Found by the barcode Template template = allTemplates.Where(t => t.Id == ((long)templateid)).ToArray().FirstOrDefault(); if (template.TemplateType == TemplateType.Form) { double _computeddifference = 0.0; if ((documentImage.Width <= documentImage.Height) && (!(documentImage.Height <= 0))) { _computeddifference = ((Convert.ToDouble(documentImage.Width)) / (Convert.ToDouble(documentImage.Height))); } else { if (!(documentImage.Width <= 0)) { _computeddifference = documentImage.Height / documentImage.Width; } } var elements = allElements.Where(e => e.TemplateId == (long)templateid).ToList(); List <ComputeCoordinates> cordlistlist = new List <ComputeCoordinates> (); //cordlistlist = leadtoolsocr.GetAllZoneData (elements, _computeddifference, documentImage); //what to do with form matched results //foreach (ComputeCoordinates cordata in cordlistlist) //{ // returnedresult += cordata.Text; //} } } else { result = AutoOCR(workerRoleParameters.OcrEngineSettings, tenant, documentImage, document, allTemplates, out ocrDocument, out ocrDocumentFragment, out ocrDocumentTemplate, out exception); if (exception != null) { throw exception; } } // Perform OCR and time-consuming tasks. } else { throw (exception); } using (var context = new ContextTenant(tenant.DatabaseConnectionString)) { using (var transaction = context.Database.BeginTransaction()) { try { if (ocrDocument != null) { context.Documents.Attach(ocrDocument); context.Entry(ocrDocument).State = EntityState.Modified; context.SaveChanges(); } if (ocrDocumentFragment != null) { foreach (var documentfragment in ocrDocumentFragment) { context.DocumentFragments.Add(documentfragment); context.SaveChanges(); } } if (ocrDocumentTemplate != null) { foreach (var documenttemplate in ocrDocumentTemplate) { context.DocumentTemplate.Add(documenttemplate); context.SaveChanges(); } } //context.Templates.Attach(templates[0]); context.SaveChanges(); // Do not call this line from anywhere else. transaction.Commit(); } catch (Exception e) { transaction.Rollback(); } } } result = true; } catch (Exception e) { exception = e; } return(result); }
private static void SimulateWorkerRole(WorkerRoleParameters workerRoleParameters) { Exception exception = null; Console.WriteLine(); Console.WriteLine(); Console.Write("OCR Thread Started."); try { workerRoleParameters.CancellationToken.ThrowIfCancellationRequested(); do { try { Document document = null; List <Tenant> tenants = null; workerRoleParameters.CancellationToken.ThrowIfCancellationRequested(); Console.WriteLine(); Console.WriteLine(); Console.Write("Getting tenants."); if (Business.GetTenants(out tenants, out exception)) { Console.WriteLine(); Console.Write($"Found {tenants.Count:N0} tenants."); foreach (var tenant in tenants) { workerRoleParameters.CancellationToken.ThrowIfCancellationRequested(); Console.WriteLine(); Console.Write($"Processing tenant: [{tenant.Id}]: [{tenant.Domain}]."); Console.WriteLine(); Console.Write($"Getting queued document."); if (Business.TenantDocumentGet(tenant, out document, out exception)) { if (document == null) { Console.WriteLine(); Console.Write($"None found."); } else { Console.WriteLine(); Console.Write($"Found document: Id: {document.Id}, Name: {document.Name}, Folder: {document.Folder?.Name}, User: {document.User.UserName}."); try { workerRoleParameters.CancellationToken.ThrowIfCancellationRequested(); if (!WorkerRoleSimulation.TenantDocumentPerformOcr(tenant, document, workerRoleParameters, out exception)) { Console.WriteLine(); Console.Write($"Exception: {exception.Message}"); } } catch (OperationCanceledException) { // Ignore. } catch (Exception e) { Console.WriteLine(); Console.Write($"Exception: {e.Message}"); } } } else { // TODO: Requires an exit strategy. Console.WriteLine(); Console.Write($"Exception: {exception.Message}"); } Thread.Sleep(1000); } } else { // TODO: Requires an exit strategy. Console.WriteLine(); Console.Write($"Exception: {exception.Message}"); } Thread.Sleep(1000); Console.WriteLine(); Console.Write("Working"); } catch (OperationCanceledException) { throw; } catch (Exception e) { // TODO: Log. // TODO: Decide whether to exit loop. Trace.TraceError(e.ToString()); throw; } }while (!workerRoleParameters.CancellationToken.IsCancellationRequested); } catch (OperationCanceledException) { // Ignore. } catch { // TODO: Log. throw; } }