public static async Task <OCRResult> GetTextFromStreamAsync(Stream stream, OctarineEngine.IEngine engine, OCRStatus status) { var result = new OCRResult(); try { (OCRPage page, OctarineError error, string errorMessage) = await engine.GetTextFromStreamAsync(stream); if (page == null) { status.Error = error; status.ErrorMessage = errorMessage; return(null); } if (status.OCRCancellationToken.IsCancellationRequested) { status.Error = OctarineError.CancellationRequested; return(null); } result.AddPage(page); return(result); } catch (Exception ex) { status.Error = OctarineError.WrongFileFormat; status.ErrorMessage = ex.Message; return(null); } }
private void ShowLanguagesForEngine(OctarineEngine.IEngine engine) { lst_language.Items.Clear(); lst_language.SelectedIndex = -1; int i = 0; if (engine.Languages != null) { foreach (var lang in engine.Languages) { lst_language.Items.Add(lang.Name); if (lang.Code == engine.CurrentLanguage.Code) { lst_language.SelectedIndex = i; } ++i; } } else { lst_language.Items.Add("Rozpoznaj automatycznie"); lst_language.SelectedIndex = 0; } if (lst_language.SelectedIndex >= 0 && engine.Languages != null) { ShowQualitiesForLanguage(engine, engine.Languages[lst_language.SelectedIndex]); } else { ShowQualitiesForLanguage(engine, null); } btn_downloadLanguages.Enabled = engine.CanDownloadLanguages; }
public InternalOCRProcessorStatus(OctarineEngine.IEngine engine, OCRStatus status, Stream source, int pageNumber, OCRPage[] pages) { Engine = engine; Status = status; Source = source; PageNumber = pageNumber; Pages = pages; Started = false; }
private static void RegisterEngines() { Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies(); foreach (Type p in GetLoadedTypes()) { try { if (typeof(OctarineEngine.IEngine).IsAssignableFrom(p) && p.IsClass) { OctarineEngine.IEngine engine = (OctarineEngine.IEngine)Activator.CreateInstance(p); if (engine.ShouldRegister) { OctarineEngines.RegisterEngine(engine); } } } catch {} } }
public static void RegisterEngine(OctarineEngine.IEngine engine) { registeredEngines.Add(engine); }
public static async Task <OCRResult> GetTextFromFileAsync(string filePath, OctarineEngine.IEngine engine, OCRStatus status, int pageFirst = 0, int pageLast = 0) { var result = new OCRResult(filePath); try { var file = await StorageFile.GetFileFromPathAsync(filePath); if (Path.GetExtension(filePath).ToLower() == ".pdf") { var pdfDoc = await PdfDocument.LoadFromFileAsync(file); if (pageFirst <= 0) { pageFirst = 1; } if (pageLast <= 0 || pageLast > pdfDoc.PageCount) { pageLast = (int)pdfDoc.PageCount; } uint pagesToRecognize = (uint)(pageLast - pageFirst + 1); status.PageCount = pagesToRecognize; Stream[] streams = new Stream[pagesToRecognize]; int pagesRunning = 0; int numThreads = Environment.ProcessorCount; for (int p = pageFirst - 1; p < pageLast; p++) { while (pagesRunning > numThreads) { await Task.Delay(10); } using (PdfPage pdfPage = pdfDoc.GetPage((uint)p)) { int i = (int)p - pageFirst + 1; _ = Task.Run(async() => { ++pagesRunning; var stream = new InMemoryRandomAccessStream(); await pdfPage.RenderToStreamAsync(stream); streams[i] = stream.AsStream(); --pagesRunning; }); } await Task.Delay(10); } while (pagesRunning > 0) { await Task.Delay(200); } OCRPage[] pages = new OCRPage[status.PageCount]; for (int i = pageFirst - 1; i < pageLast; i++) { if (status.Error != OctarineError.Success) { break; } while (status.ActiveWorkers > numThreads) { await Task.Delay(200); } var st = new InternalOCRProcessorStatus(engine, status, streams[i - pageFirst + 1], i - pageFirst + 1, pages); _ = Task.Run(() => ProcessWithPageAsync(st)); await Task.Delay(250); } if (status.Error != OctarineError.Success) { return(null); } while (status.ActiveWorkers > 0) { await Task.Delay(200); } if (status.Error != OctarineError.Success) { return(null); } foreach (OCRPage page in pages) { result.AddPage(page); } return(result); } else { var stream = await file.OpenAsync(FileAccessMode.Read); (OCRPage page, OctarineError error, string errorMessage) = await engine.GetTextFromStreamAsync(stream.AsStream()); if (page == null) { status.Error = error; status.ErrorMessage = errorMessage; return(null); } if (status.OCRCancellationToken.IsCancellationRequested) { status.Error = OctarineError.CancellationRequested; return(null); } result.AddPage(page); return(result); } } catch (Exception ex) { status.Error = OctarineError.WrongFileFormat; status.ErrorMessage = ex.Message; return(null); } }