List <Bitmap> getOcrTextLineImages() { if (ActualRectangle == null) { return(null); } RectangleF ar = ActualRectangle.Value; List <Ocr.CharBox> cbs; if (ActualField.ColumnOfTable != null) { if (!TableFieldActualInfo.Found) { return(null); } cbs = (List <Ocr.CharBox>)TableFieldActualInfo.GetValue(Template.Field.ValueTypes.OcrCharBoxs); } else { cbs = Ocr.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, ar); } List <Bitmap> ls = new List <Bitmap>(); List <Line <Ocr.CharBox> > ols = GetLinesWithAdjacentBorders(cbs, TableFieldActualInfo == null ? ar : TableFieldActualInfo.ActualRectangle.Value); foreach (Line <Ocr.CharBox> l in ols) { RectangleF r = new RectangleF(ar.X, l.Top, ar.Width, l.Bottom - l.Top); using (Bitmap b = page.GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio)) { ls.Add(b == null ? b : GetImageScaled2Pdf(b)); } } return(ls); }
List <string> getOcrTextLines() { if (ActualRectangle == null) { return(null); } RectangleF ar = (RectangleF)ActualRectangle; if (ActualField.ColumnOfTable == null) { if (page.PageCollection.ActiveTemplate.FieldOcrMode.HasFlag(Template.FieldOcrModes.SingleFieldFromFieldImage)) { string s = Ocr.This.GetTextSurroundedByRectangle(page.ActiveTemplateBitmap, ar, page.PageCollection.ActiveTemplate.TesseractPageSegMode); return(Regex.Split(s, "$", RegexOptions.Multiline).ToList()); } else { return(Ocr.GetTextLinesSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, ar, page.PageCollection.ActiveTemplate.TextAutoInsertSpace)); } } if (!TableFieldActualInfo.Found) { return(null); } List <Ocr.CharBox> cbs = (List <Ocr.CharBox>)TableFieldActualInfo.GetValue(Template.Field.ValueTypes.OcrCharBoxs); List <string> ls = new List <string>(); if (page.PageCollection.ActiveTemplate.FieldOcrMode.HasFlag(Template.FieldOcrModes.ColumnFieldFromFieldImage)) { List <Line <Ocr.CharBox> > ols = GetLinesWithAdjacentBorders(cbs, TableFieldActualInfo.ActualRectangle.Value); foreach (Line <Ocr.CharBox> l in ols) { float x = ar.X > TableFieldActualInfo.ActualRectangle.Value.X ? ar.X : TableFieldActualInfo.ActualRectangle.Value.X; RectangleF r = new RectangleF( x, l.Top, (ar.Right < TableFieldActualInfo.ActualRectangle.Value.Right ? ar.Right : TableFieldActualInfo.ActualRectangle.Value.Right) - x, l.Bottom - l.Top ); ls.Add(Ocr.This.GetTextSurroundedByRectangle(page.ActiveTemplateBitmap, r, page.PageCollection.ActiveTemplate.TesseractPageSegMode)); } } else { foreach (Line <Ocr.CharBox> l in GetLines(cbs, page.PageCollection.ActiveTemplate.TextAutoInsertSpace)) { StringBuilder sb = new StringBuilder(); foreach (Ocr.CharBox cb in l.CharBoxs) { if (cb.R.Left >= ar.Left && cb.R.Right <= ar.Right && cb.R.Top >= ar.Top && cb.R.Bottom <= ar.Bottom) { sb.Append(cb.Char); } } ls.Add(sb.ToString()); } } return(ls); }
List <string> getOcrTextLinesAsTableColumn() { if (ActualRectangle == null) { return(null); } if (!TableFieldActualInfo.Found) { return(null); } RectangleF ar = (RectangleF)ActualRectangle; List <Ocr.CharBox> cbs = (List <Ocr.CharBox>)TableFieldActualInfo.getValue(Template.Field.ValueTypes.OcrCharBoxs, true); List <string> ls = new List <string>(); foreach (Ocr.Line l in Ocr.GetLines(cbs, page.PageCollection.ActiveTemplate.TextAutoInsertSpace)) { StringBuilder sb = new StringBuilder(); foreach (Ocr.CharBox cb in l.CharBoxs) { if (cb.R.Left >= ar.Left && cb.R.Right <= ar.Right && cb.R.Top >= ar.Top && cb.R.Bottom <= ar.Bottom) { sb.Append(cb.Char); } } ls.Add(sb.ToString()); } return(ls); }
public override void Initialize(DataGridViewRow row, Action <DataGridViewRow> onLeft) { base.Initialize(row, onLeft); _object = (Template.Anchor.OcrText)row.Tag; if (_object == null) { _object = new Template.Anchor.OcrText(); } StringBuilder sb = new StringBuilder(); foreach (var l in Ocr.GetLines(_object.CharBoxs.Select(x => new Ocr.CharBox { Char = x.Char, R = x.Rectangle.GetSystemRectangleF() }), textAutoInsertSpace)) { foreach (var cb in l.CharBoxs) { sb.Append(cb.Char); } sb.Append("\r\n"); } text.Text = sb.ToString(); PositionDeviationIsAbsolute.Checked = _object.PositionDeviationIsAbsolute; try { PositionDeviation.Value = (decimal)_object.PositionDeviation; } catch { } SearchRectangleMargin.Value = _object.SearchRectangleMargin; SearchRectangleMargin.Enabled = cSearchRectangleMargin.Checked; cSearchRectangleMargin.Checked = SearchRectangleMargin.Value >= 0; OcrEntirePage.Checked = _object.OcrEntirePage; }
object getValue(Template.Field.ValueTypes valueType) { RectangleF r = (RectangleF)ActualRectangle; switch (valueType) { case Template.Field.ValueTypes.PdfText: case Template.Field.ValueTypes.PdfTextLines: List <string> ls; if (ActualField.ColumnOfTable == null) { ls = Pdf.GetTextLinesSurroundedByRectangle(page.PdfCharBoxs, r, page.pageCollection.ActiveTemplate.TextAutoInsertSpace); } else { ls = getTextLinesAsTableColumn(); } if (valueType == Template.Field.ValueTypes.PdfText) { return(string.Join("\r\n", ls)); } return(ls); case Template.Field.ValueTypes.PdfCharBoxs: return(Pdf.GetCharBoxsSurroundedByRectangle(page.PdfCharBoxs, r)); case Template.Field.ValueTypes.OcrText: return(Ocr.This.GetTextSurroundedByRectangle(page.ActiveTemplateBitmap, r)); case Template.Field.ValueTypes.OcrTextLines: throw new Exception("To be implemented."); case Template.Field.ValueTypes.OcrCharBoxs: return(Ocr.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, r)); case Template.Field.ValueTypes.Image: using (Bitmap b = page.GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio)) { return(Page.GetScaledImage2Pdf(b)); } default: throw new Exception("Unknown option: " + valueType); } }
List <Ocr.CharBox> getOcrCharBoxs() { if (ActualRectangle == null) { return(null); } RectangleF ar = (RectangleF)ActualRectangle; Template.Field.Ocr aof = ActualField as Template.Field.Ocr; if (ActualField.ColumnOfTable == null) { if (aof?.SingleFieldFromFieldImage ?? page.PageCollection.ActiveTemplate.SingleFieldFromFieldImage) { return(Ocr.This.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateBitmap, ar, aof?.TesseractPageSegMode ?? page.PageCollection.ActiveTemplate.TesseractPageSegMode)); } else { return(Ocr.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, ar)); } } if (!TableFieldActualInfo.Found) { return(null); } if (aof?.ColumnCellFromCellImage ?? page.PageCollection.ActiveTemplate.ColumnCellFromCellImage) { float x = ar.X > TableFieldActualInfo.ActualRectangle.Value.X ? ar.X : TableFieldActualInfo.ActualRectangle.Value.X; float y = ar.Top > TableFieldActualInfo.ActualRectangle.Value.Top ? ar.Top : TableFieldActualInfo.ActualRectangle.Value.Top; RectangleF r = new RectangleF( x, y, (ar.Right < TableFieldActualInfo.ActualRectangle.Value.Right ? ar.Right : TableFieldActualInfo.ActualRectangle.Value.Right) - x, (ar.Bottom < TableFieldActualInfo.ActualRectangle.Value.Bottom ? ar.Bottom : TableFieldActualInfo.ActualRectangle.Value.Bottom) - y ); return(Ocr.This.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateBitmap, ar, aof?.TesseractPageSegMode ?? page.PageCollection.ActiveTemplate.TesseractPageSegMode)); } else { List <Ocr.CharBox> cbs = (List <Ocr.CharBox>)TableFieldActualInfo.GetValue(Template.Field.Types.OcrCharBoxs); return(cbs.Where(a => /*!check: ar.Contains(a.R)*/ a.R.Left >= ar.Left && a.R.Right <= ar.Right && a.R.Top >= ar.Top && a.R.Bottom <= ar.Bottom).ToList()); } }
List <Bitmap> getOcrTextLineImages() { if (ActualRectangle == null) { return(null); } if (ActualField.ColumnOfTable != null && !TableFieldActualInfo.Found) { return(null); } RectangleF ar = ActualRectangle.Value; List <Ocr.CharBox> cbs; if (ActualField.ColumnOfTable == null) { cbs = Ocr.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, ar); } else { cbs = (List <Ocr.CharBox>)TableFieldActualInfo.GetValue(Template.Field.ValueTypes.OcrCharBoxs); } List <Bitmap> ls = new List <Bitmap>(); foreach (Ocr.Line l in Ocr.GetLines(cbs, page.PageCollection.ActiveTemplate.TextAutoInsertSpace)) { RectangleF r = new RectangleF(ar.X, l.Top, ar.Width, l.Bottom - l.Top); Bitmap b = page.GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio); if (b == null) { return(null); } using (b) { ls.Add(GetScaledImage2Pdf(b)); } } return(ls); }
public static void DisposeThis() { _This?.Dispose(); _This = null; }
object extractFieldAndDrawSelectionBox(Template.Field field) { try { if (pages == null) { return(null); } if (field.Rectangle == null) { return(null); } pages.ActiveTemplate = GetTemplateFromUI(false); if (field.LeftAnchor != null && !findAndDrawAnchor(field.LeftAnchor.Id)) { return(null); } if (field.TopAnchor != null && !findAndDrawAnchor(field.TopAnchor.Id)) { return(null); } if (field.RightAnchor != null && !findAndDrawAnchor(field.RightAnchor.Id)) { return(null); } if (field.BottomAnchor != null && !findAndDrawAnchor(field.BottomAnchor.Id)) { return(null); } Page.FieldActualInfo fai = pages[currentPageI].GetFieldActualInfo(field); if (!fai.Found) { return(null); } RectangleF r = (RectangleF)fai.ActualRectangle; owners2resizebleBox[field] = new ResizebleBox(field, r, Settings.Appearance.SelectionBoxBorderWidth); object v = fai.GetValue(field.Type); switch (field.Type) { case Template.Field.Types.PdfText: case Template.Field.Types.PdfTextLines: case Template.Field.Types.PdfCharBoxs: if (field.ColumnOfTable != null) { if (!fai.TableFieldActualInfo.Found) { return(null); } drawBoxes(Settings.Appearance.TableBoxColor, Settings.Appearance.TableBoxBorderWidth, new List <RectangleF> { (RectangleF)fai.TableFieldActualInfo.ActualRectangle }); if (ShowFieldTextLineSeparators.Checked) { RectangleF tableAR = (RectangleF)fai.TableFieldActualInfo.ActualRectangle; List <Page.Line <Pdf.CharBox> > lines = Page.GetLines(Pdf.GetCharBoxsSurroundedByRectangle(pages[currentPageI].PdfCharBoxs, tableAR), null, null).ToList(); List <RectangleF> lineBoxes = new List <RectangleF>(); for (int i = 1; i < lines.Count; i++) { if (lines[i].Bottom <tableAR.Top || lines[i].Top> tableAR.Bottom || lines[i].Bottom <r.Top || lines[i].Top> r.Bottom ) { continue; } lineBoxes.Add(new RectangleF { X = r.X, Y = lines[i].Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } else { if (ShowFieldTextLineSeparators.Checked) { List <Page.Line <Pdf.CharBox> > lines = Page.GetLines(Pdf.GetCharBoxsSurroundedByRectangle(pages[currentPageI].PdfCharBoxs, r), null, null).ToList(); List <RectangleF> lineBoxes = new List <RectangleF>(); for (int i = 1; i < lines.Count; i++) { lineBoxes.Add(new RectangleF { X = r.X, Y = lines[i].Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); return(v); case Template.Field.Types.OcrText: case Template.Field.Types.OcrTextLines: case Template.Field.Types.OcrCharBoxs: Template.Field.Ocr of = field as Template.Field.Ocr; if (field.ColumnOfTable != null) { if (!fai.TableFieldActualInfo.Found) { return(null); } drawBoxes(Settings.Appearance.TableBoxColor, Settings.Appearance.TableBoxBorderWidth, new List <RectangleF> { (RectangleF)fai.TableFieldActualInfo.ActualRectangle }); if (ShowFieldTextLineSeparators.Checked) { List <Page.Line <Ocr.CharBox> > ols = Page.GetLines((List <Ocr.CharBox>)fai.TableFieldActualInfo.GetValue(Template.Field.Types.OcrCharBoxs), null, field.CharFilter ?? pages.ActiveTemplate.CharFilter); if (of.AdjustLineBorders ?? pages.ActiveTemplate.AdjustLineBorders) { Page.AdjustBorders(ols, fai.TableFieldActualInfo.ActualRectangle.Value); } else { Page.PadLines(ols, field.LinePaddingY ?? pages.ActiveTemplate.LinePaddingY); } if (ols.Count > 0) { ols.RemoveAt(0); } List <RectangleF> lineBoxes = new List <RectangleF>(); foreach (Page.Line <Ocr.CharBox> l in ols) { lineBoxes.Add(new RectangleF { X = r.X, Y = l.Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } else { if (ShowFieldTextLineSeparators.Checked) { List <Ocr.CharBox> cbs; if (of.SingleFieldFromFieldImage ?? pages.ActiveTemplate.SingleFieldFromFieldImage) { cbs = Ocr.This.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateBitmap, r, of.TesseractPageSegMode ?? pages.ActiveTemplate.TesseractPageSegMode); } else { cbs = Ocr.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateOcrCharBoxs, r); } if (cbs != null) { List <Page.Line <Ocr.CharBox> > ols = Page.GetLines(cbs, null, field.CharFilter ?? pages.ActiveTemplate.CharFilter); if (of.AdjustLineBorders ?? pages.ActiveTemplate.AdjustLineBorders) { Page.AdjustBorders(ols, r); } else { Page.PadLines(ols, field.LinePaddingY ?? pages.ActiveTemplate.LinePaddingY); } if (ols.Count > 0) { ols.RemoveAt(0); } List <RectangleF> lineBoxes = new List <RectangleF>(); foreach (Page.Line <Ocr.CharBox> l in ols) { lineBoxes.Add(new RectangleF { X = r.X, Y = l.Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); return(v); case Template.Field.Types.Image: drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); return(v); case Template.Field.Types.OcrTextLineImages: drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); return(v); default: throw new Exception("Unknown option: " + field.Type); } } catch (Exception ex) { Log.Error(ex); Message.Error(ex, this); } return(null); }
public TemplateForm(TemplateManager templateManager) { InitializeComponent(); Icon = Win.AssemblyRoutines.GetAppIcon(); Text = Program.FullName + " - Template Editor"; templateManager.TemplateForm = this; this.templateManager = templateManager; this.bitmapPreparationForm = new ScanTemplateForm(this); initializeAnchorsTable(); initializeConditionsTable(); initializeFieldsTable(); TesseractPageSegMode.DataSource = Enum.GetValues(typeof(Tesseract.PageSegMode)); picture.MouseDown += delegate(object sender, MouseEventArgs e) { if (pages == null) { return; } Point p = new Point((int)(e.X / (float)pictureScale.Value), (int)(e.Y / (float)pictureScale.Value)); ResizebleBox rb = findResizebleBox(p, out ResizebleBoxSides resizebleBoxSide); if (rb != null) { drawingMode = resizebleBoxSide == ResizebleBoxSides.Left || resizebleBoxSide == ResizebleBoxSides.Right ? DrawingModes.resizingSelectionBoxV : DrawingModes.resizingSelectionBoxH; Cursor.Current = drawingMode == DrawingModes.resizingSelectionBoxV ? Cursors.VSplit : Cursors.HSplit; selectionBoxPoint0 = rb.R.Location; selectionBoxPoint1 = rb.R.Location; selectionBoxPoint2 = new Point(rb.R.Right, rb.R.Bottom); } else { if (ModifierKeys.HasFlag(Keys.Shift)) { drawingMode = DrawingModes.movingImage; Cursor.Current = Cursors.SizeAll; screenMousePosition0 = Control.MousePosition; imageScrollPostion0 = new Point(splitContainer1.Panel2.HorizontalScroll.Value, splitContainer1.Panel2.VerticalScroll.Value);//to avoid jerking } else { drawingMode = DrawingModes.drawingSelectionBox; selectionBoxPoint0 = p; selectionBoxPoint1 = p; selectionBoxPoint2 = p; } } showSelectionCoordinates(selectionBoxPoint1); }; picture.MouseWheel += delegate(object sender, MouseEventArgs e) { if (pages == null) { return; } }; picture.MouseMove += delegate(object sender, MouseEventArgs e) { if (pages == null) { return; } Point p; if (drawingMode == DrawingModes.movingImage) { p = Control.MousePosition; int h = imageScrollPostion0.X + screenMousePosition0.X - p.X; if (h < splitContainer1.Panel2.HorizontalScroll.Minimum) { h = splitContainer1.Panel2.HorizontalScroll.Minimum; } else if (h > splitContainer1.Panel2.HorizontalScroll.Maximum) { h = splitContainer1.Panel2.HorizontalScroll.Maximum; } splitContainer1.Panel2.HorizontalScroll.Value = h; int v = imageScrollPostion0.Y + screenMousePosition0.Y - p.Y; if (v < splitContainer1.Panel2.VerticalScroll.Minimum) { v = splitContainer1.Panel2.VerticalScroll.Minimum; } else if (v > splitContainer1.Panel2.VerticalScroll.Maximum) { v = splitContainer1.Panel2.VerticalScroll.Maximum; } splitContainer1.Panel2.VerticalScroll.Value = v; return; } p = new Point((int)(e.X / (float)pictureScale.Value), (int)(e.Y / (float)pictureScale.Value)); switch (drawingMode) { case DrawingModes.NULL: showSelectionCoordinates(p); if (findResizebleBox(p, out ResizebleBoxSides resizebleBoxSide) != null) { Cursor.Current = resizebleBoxSide == ResizebleBoxSides.Left || resizebleBoxSide == ResizebleBoxSides.Right ? Cursors.VSplit : Cursors.HSplit; } else { Cursor.Current = Cursors.Default; } return; case DrawingModes.drawingSelectionBox: if (selectionBoxPoint0.X < p.X) { selectionBoxPoint1.X = selectionBoxPoint0.X; selectionBoxPoint2.X = p.X; } else { selectionBoxPoint1.X = p.X; selectionBoxPoint2.X = selectionBoxPoint0.X; } if (selectionBoxPoint0.Y < p.Y) { selectionBoxPoint1.Y = selectionBoxPoint0.Y; selectionBoxPoint2.Y = p.Y; } else { selectionBoxPoint1.Y = p.Y; selectionBoxPoint2.Y = selectionBoxPoint0.Y; } break; case DrawingModes.resizingSelectionBoxV: if (Math.Abs(selectionBoxPoint2.X - p.X) < Math.Abs(p.X - selectionBoxPoint1.X)) { selectionBoxPoint2.X = p.X; } else { selectionBoxPoint1.X = p.X; } break; case DrawingModes.resizingSelectionBoxH: if (Math.Abs(selectionBoxPoint2.Y - p.Y) < Math.Abs(p.Y - selectionBoxPoint1.Y)) { selectionBoxPoint2.Y = p.Y; } else { selectionBoxPoint1.Y = p.Y; } break; } showSelectionCoordinates(selectionBoxPoint1, selectionBoxPoint2); RectangleF r = new RectangleF(selectionBoxPoint1.X, selectionBoxPoint1.Y, selectionBoxPoint2.X - selectionBoxPoint1.X, selectionBoxPoint2.Y - selectionBoxPoint1.Y); clearImageFromBoxes(); drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <System.Drawing.RectangleF> { r }); }; picture.MouseUp += delegate(object sender, MouseEventArgs e) { try { if (pages == null) { return; } if (drawingMode == DrawingModes.NULL) { return; } if (drawingMode == DrawingModes.movingImage) { Cursor.Current = Cursors.Default; } drawingMode = DrawingModes.NULL; Template.RectangleF r = new Template.RectangleF(selectionBoxPoint1.X, selectionBoxPoint1.Y, selectionBoxPoint2.X - selectionBoxPoint1.X, selectionBoxPoint2.Y - selectionBoxPoint1.Y); if (r.Width == 0 || r.Y == 0)//accidental tap { return; } switch (settingMode) { case SettingModes.SetAnchor: { if (currentAnchorControl == null) { break; } //currentAnchorControl.SetTagFromControl();??? Template.Anchor a = (Template.Anchor)currentAnchorControl.Row.Tag; if (pages[currentPageI].DetectedImageScale >= 0 && pages[currentPageI].DetectedImageScale < 1 && a.Id == GetTemplateFromUI(false).ScalingAnchorId) { Message.Exclaim("When the detected image scale is not 1, changing coordinates of the scaling anchor must not be done. Either switch off scaling by anchor and reload the page or open a page where the detected image scale is 1.", this); break; } a.Position = new Template.PointF { X = r.X, Y = r.Y }; try { switch (a.Type) { case Template.Anchor.Types.PdfText: { Template.Anchor.PdfText pt = (Template.Anchor.PdfText)a; pt.CharBoxs = new List <Template.Anchor.PdfText.CharBox>(); foreach (Pdf.CharBox cb in Pdf.GetCharBoxsSurroundedByRectangle(pages[currentPageI].PdfCharBoxs, r.GetSystemRectangleF(), true)) { pt.CharBoxs.Add(new Template.Anchor.PdfText.CharBox { Char = cb.Char, Rectangle = new Template.RectangleF(cb.R.X, cb.R.Y, cb.R.Width, cb.R.Height), }); } pt.Size = new Template.SizeF { Width = r.Width, Height = r.Height }; } break; case Template.Anchor.Types.OcrText: { Template.Anchor.OcrText ot = (Template.Anchor.OcrText)a; ot.CharBoxs = new List <Template.Anchor.OcrText.CharBox>(); var selectedOcrCharBoxs = new List <Ocr.CharBox>(); if (ot.OcrEntirePage) { selectedOcrCharBoxs.AddRange(Ocr.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateOcrCharBoxs, r.GetSystemRectangleF())); } else { using (Bitmap b = pages[currentPageI].GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Pdf2ImageResolutionRatio, r.Y / Settings.Constants.Pdf2ImageResolutionRatio, r.Width / Settings.Constants.Pdf2ImageResolutionRatio, r.Height / Settings.Constants.Pdf2ImageResolutionRatio)) { if (b == null) { throw new Exception("Selected image is empty."); } foreach (Ocr.CharBox cb in Ocr.This.GetCharBoxs(b, pages.ActiveTemplate.TesseractPageSegMode)) { cb.R.X += r.X; cb.R.Y += r.Y; selectedOcrCharBoxs.Add(cb); } } } foreach (Ocr.CharBox cb in selectedOcrCharBoxs) { ot.CharBoxs.Add(new Template.Anchor.OcrText.CharBox { Char = cb.Char, Rectangle = new Template.RectangleF(cb.R.X, cb.R.Y, cb.R.Width, cb.R.Height), }); } ot.Size = new Template.SizeF { Width = r.Width, Height = r.Height }; } break; case Template.Anchor.Types.ImageData: { Template.Anchor.ImageData id = (Template.Anchor.ImageData)a; using (Bitmap b = pages[currentPageI].GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Pdf2ImageResolutionRatio, r.Y / Settings.Constants.Pdf2ImageResolutionRatio, r.Width / Settings.Constants.Pdf2ImageResolutionRatio, r.Height / Settings.Constants.Pdf2ImageResolutionRatio)) { if (b == null) { throw new Exception("Selected image is empty."); } id.Image = new ImageData(b); } } break; case Template.Anchor.Types.CvImage: { Template.Anchor.CvImage ci = (Template.Anchor.CvImage)a; using (Bitmap b = pages[currentPageI].GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Pdf2ImageResolutionRatio, r.Y / Settings.Constants.Pdf2ImageResolutionRatio, r.Width / Settings.Constants.Pdf2ImageResolutionRatio, r.Height / Settings.Constants.Pdf2ImageResolutionRatio)) { if (b == null) { throw new Exception("Selected image is empty."); } ci.Image = new CvImage(b); } } break; default: throw new Exception("Unknown option: " + a.Type); } setAnchorRow(currentAnchorControl.Row, a); clearImageFromBoxes(); findAndDrawAnchor(a.Id); } finally { anchors.EndEdit(); } } break; case SettingModes.SetField: { if (fields.SelectedRows.Count < 1) { break; } var row = fields.SelectedRows[0]; Template.Field f = (Template.Field)row.Tag; f.Rectangle = r; if (f.LeftAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.LeftAnchor.Id); f.LeftAnchor.Shift = aai.Shift.Width; } if (f.TopAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.TopAnchor.Id); f.TopAnchor.Shift = aai.Shift.Height; } if (f.RightAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.RightAnchor.Id); f.RightAnchor.Shift = aai.Shift.Width; } if (f.BottomAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.BottomAnchor.Id); f.BottomAnchor.Shift = aai.Shift.Height; } setFieldRow(row, f); } break; case SettingModes.NULL: break; default: throw new Exception("Unknown option: " + settingMode); } } catch (Exception ex) { Message.Error2(ex, this); } }; Shown += delegate { Application.DoEvents();//make form be drawn completely setUIFromTemplate(templateManager.Template); }; this.EnumControls((Control c) => { if (c is SplitContainer s) { s.BackColor = Color.FromArgb(80, 70, 0); s.SplitterWidth = 2; s.Panel1.BackColor = SystemColors.Control; s.Panel2.BackColor = SystemColors.Control; } }, true); testFile.TextChanged += delegate { try { dispose(false); if (string.IsNullOrWhiteSpace(testFile.Text)) { return; } templateManager.LastTestFile = testFile.Text; testFile.SelectionStart = testFile.Text.Length; testFile.ScrollToCaret(); if (!File.Exists(testFile.Text)) { string m = "File '" + testFile.Text + "' does not exist!"; Log.Error(m); Message.Error(m, this); return; } pages = new PageCollection(testFile.Text, true); totalPageNumber = pages.TotalCount; lTotalPages.Text = " / " + totalPageNumber; showPage(1); } catch (Exception ex) { Log.Error(ex); Message.Error(ex, this); } }; pictureScale.ValueChanged += delegate { if (!loadingTemplate) { setScaledImage(); } }; Load += delegate { //Application.DoEvents();//make form be drawn completely //BeginInvoke((Action<Template>)setUIFromTemplate, templateManager.Template); }; FormClosed += delegate { bitmapPreparationForm.Close(); }; bSave.Click += Save_Click; bOK.Click += OK_Click; bCancel.Click += delegate { Close(); }; Help.LinkClicked += Help_LinkClicked; Configure.LinkClicked += Configure_LinkClicked; About.LinkClicked += About_LinkClicked; bTestFile.Click += delegate(object sender, EventArgs e) { OpenFileDialog d = new OpenFileDialog(); if (!string.IsNullOrWhiteSpace(testFile.Text)) { d.InitialDirectory = PathRoutines.GetFileDir(testFile.Text); } else if (!string.IsNullOrWhiteSpace(templateManager.TestFileDefaultFolder)) { d.InitialDirectory = templateManager.TestFileDefaultFolder; } d.Filter = "PDF|*.pdf|" + "All files (*.*)|*.*"; if (d.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } testFile.Text = d.FileName; }; ShowPdfText.LinkClicked += ShowPdfText_LinkClicked; ShowOcrText.LinkClicked += ShowOcrText_LinkClicked; ShowAsJson.LinkClicked += showAsJson_LinkClicked; tCurrentPage.Leave += delegate { changeCurrentPage(); }; tCurrentPage.KeyDown += delegate(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { changeCurrentPage(); } }; }
/// <summary> /// First it must be called before any use of the PdfDocumentParser. /// Then it can be called to re-initialize. /// </summary> /// <param name="ocrConfig"></param> public static void Initialize(Ocr.Config ocrConfig)//trigger Program() { Ocr.DisposeThis(); Settings.Constants.OcrConfig = ocrConfig; }
public TemplateForm(TemplateManager templateManager) { InitializeComponent(); Icon = Win.AssemblyRoutines.GetAppIcon(); Text = Program.FullName + ": Template Editor"; this.templateManager = templateManager; initializeAnchorsTable(); initializeConditionsTable(); initializeFieldsTable(); picture.MouseDown += delegate(object sender, MouseEventArgs e) { if (pages == null) { return; } Point p = new Point((int)(e.X / (float)pictureScale.Value), (int)(e.Y / (float)pictureScale.Value)); ResizebleBox rb = findResizebleBox(p, out ResizebleBoxSides resizebleBoxSide); if (rb != null) { drawingMode = resizebleBoxSide == ResizebleBoxSides.Left || resizebleBoxSide == ResizebleBoxSides.Right ? DrawingModes.resizingSelectionBoxV : DrawingModes.resizingSelectionBoxH; Cursor.Current = drawingMode == DrawingModes.resizingSelectionBoxV ? Cursors.VSplit : Cursors.HSplit; selectionBoxPoint0 = rb.R.Location; selectionBoxPoint1 = rb.R.Location; selectionBoxPoint2 = new Point(rb.R.Right, rb.R.Bottom); } else { drawingMode = DrawingModes.drawingSelectionBox; selectionBoxPoint0 = p; selectionBoxPoint1 = p; selectionBoxPoint2 = p; } selectionCoordinates.Text = selectionBoxPoint1.ToString(); }; picture.MouseMove += delegate(object sender, MouseEventArgs e) { if (pages == null) { return; } Point p = new Point((int)(e.X / (float)pictureScale.Value), (int)(e.Y / (float)pictureScale.Value)); switch (drawingMode) { case DrawingModes.NULL: selectionCoordinates.Text = p.ToString(); if (findResizebleBox(p, out ResizebleBoxSides resizebleBoxSide) != null) { Cursor.Current = resizebleBoxSide == ResizebleBoxSides.Left || resizebleBoxSide == ResizebleBoxSides.Right ? Cursors.VSplit : Cursors.HSplit; } else { Cursor.Current = Cursors.Default; } return; case DrawingModes.drawingSelectionBox: if (selectionBoxPoint0.X < p.X) { selectionBoxPoint1.X = selectionBoxPoint0.X; selectionBoxPoint2.X = p.X; } else { selectionBoxPoint1.X = p.X; selectionBoxPoint2.X = selectionBoxPoint0.X; } if (selectionBoxPoint0.Y < p.Y) { selectionBoxPoint1.Y = selectionBoxPoint0.Y; selectionBoxPoint2.Y = p.Y; } else { selectionBoxPoint1.Y = p.Y; selectionBoxPoint2.Y = selectionBoxPoint0.Y; } break; case DrawingModes.resizingSelectionBoxV: if (Math.Abs(selectionBoxPoint2.X - p.X) < Math.Abs(p.X - selectionBoxPoint1.X)) { selectionBoxPoint2.X = p.X; } else { selectionBoxPoint1.X = p.X; } break; case DrawingModes.resizingSelectionBoxH: if (Math.Abs(selectionBoxPoint2.Y - p.Y) < Math.Abs(p.Y - selectionBoxPoint1.Y)) { selectionBoxPoint2.Y = p.Y; } else { selectionBoxPoint1.Y = p.Y; } break; } selectionCoordinates.Text = selectionBoxPoint1.ToString() + ":" + selectionBoxPoint2.ToString(); RectangleF r = new RectangleF(selectionBoxPoint1.X, selectionBoxPoint1.Y, selectionBoxPoint2.X - selectionBoxPoint1.X, selectionBoxPoint2.Y - selectionBoxPoint1.Y); clearImageFromBoxes(); drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <System.Drawing.RectangleF> { r }); }; picture.MouseUp += delegate(object sender, MouseEventArgs e) { try { if (pages == null) { return; } if (drawingMode == DrawingModes.NULL) { return; } drawingMode = DrawingModes.NULL; Template.RectangleF r = new Template.RectangleF(selectionBoxPoint1.X, selectionBoxPoint1.Y, selectionBoxPoint2.X - selectionBoxPoint1.X, selectionBoxPoint2.Y - selectionBoxPoint1.Y); if (r.Width == 0 || r.Y == 0)//accidental tap { return; } switch (settingMode) { case SettingModes.SetAnchor: { if (currentAnchorControl == null) { break; } currentAnchorControl.SetTagFromControl(); Template.Anchor a = (Template.Anchor)currentAnchorControl.Row.Tag; a.Position = new Template.PointF { X = r.X, Y = r.Y }; try { switch (a.Type) { case Template.Anchor.Types.PdfText: { Template.Anchor.PdfText pt = (Template.Anchor.PdfText)a; pt.CharBoxs = new List <Template.Anchor.PdfText.CharBox>(); List <Pdf.Line> lines = Pdf.GetLines(Pdf.GetCharBoxsSurroundedByRectangle(pages[currentPageI].PdfCharBoxs, r.GetSystemRectangleF(), true), null); foreach (Pdf.Line l in lines) { foreach (Pdf.CharBox cb in l.CharBoxs) { pt.CharBoxs.Add(new Template.Anchor.PdfText.CharBox { Char = cb.Char, Rectangle = new Template.RectangleF(cb.R.X, cb.R.Y, cb.R.Width, cb.R.Height), }); } } pt.Size = new Template.SizeF { Width = r.Width, Height = r.Height }; } break; case Template.Anchor.Types.OcrText: { Template.Anchor.OcrText ot = (Template.Anchor.OcrText)a; ot.CharBoxs = new List <Template.Anchor.OcrText.CharBox>(); var selectedOcrCharBoxs = new List <Ocr.CharBox>(); if (ot.OcrEntirePage) { selectedOcrCharBoxs.AddRange(Ocr.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateOcrCharBoxs, r.GetSystemRectangleF())); } else { foreach (Ocr.CharBox cb in Ocr.This.GetCharBoxs(pages[currentPageI].GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio))) { cb.R.X += r.X; cb.R.Y += r.Y; selectedOcrCharBoxs.Add(cb); } } foreach (Ocr.Line l in Ocr.GetLines(selectedOcrCharBoxs, null)) { foreach (Ocr.CharBox cb in l.CharBoxs) { ot.CharBoxs.Add(new Template.Anchor.OcrText.CharBox { Char = cb.Char, Rectangle = new Template.RectangleF(cb.R.X, cb.R.Y, cb.R.Width, cb.R.Height), }); } } ot.Size = new Template.SizeF { Width = r.Width, Height = r.Height }; } break; case Template.Anchor.Types.ImageData: { Template.Anchor.ImageData id = (Template.Anchor.ImageData)a; using (Bitmap b = pages[currentPageI].GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio)) { id.Image = new ImageData(b); } } break; case Template.Anchor.Types.CvImage: { Template.Anchor.CvImage ci = (Template.Anchor.CvImage)a; using (Bitmap b = pages[currentPageI].GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio)) { ci.Image = new CvImage(b); } } break; default: throw new Exception("Unknown option: " + a.Type); } setAnchorRow(currentAnchorControl.Row, a); clearImageFromBoxes(); findAndDrawAnchor(a.Id); } finally { anchors.EndEdit(); } } break; case SettingModes.SetField: { if (fields.SelectedRows.Count < 1) { break; } var row = fields.SelectedRows[0]; Template.Field f = (Template.Field)row.Tag; f.Rectangle = r; if (f.LeftAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.LeftAnchor.Id); f.LeftAnchor.Shift = aai.Shift.Width; } if (f.TopAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.TopAnchor.Id); f.TopAnchor.Shift = aai.Shift.Height; } if (f.RightAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.RightAnchor.Id); f.RightAnchor.Shift = aai.Shift.Width; } if (f.BottomAnchor != null) { Page.AnchorActualInfo aai = pages[currentPageI].GetAnchorActualInfo(f.BottomAnchor.Id); f.BottomAnchor.Shift = aai.Shift.Height; } setFieldRow(row, f); extractFieldAndDrawSelectionBox(f); //owners2resizebleBox[f] = new ResizebleBox(f, f.Rectangle.GetSystemRectangleF(), Settings.Appearance.SelectionBoxBorderWidth); } break; case SettingModes.NULL: break; default: throw new Exception("Unknown option: " + settingMode); } } catch (Exception ex) { Message.Error2(ex); } }; Shown += delegate { Application.DoEvents();//make form be drawn completely setUIFromTemplate(templateManager.Template); }; FormClosed += delegate { if (scaledCurrentPageBitmap != null) { scaledCurrentPageBitmap.Dispose(); scaledCurrentPageBitmap = null; } if (pages != null) { pages.Dispose(); pages = null; } templateManager.LastTestFile = testFile.Text; }; this.EnumControls((Control c) => { if (c is SplitContainer s) { s.BackColor = Color.FromArgb(80, 70, 0); s.SplitterWidth = 2; s.Panel1.BackColor = SystemColors.Control; s.Panel2.BackColor = SystemColors.Control; } }, true); testFile.TextChanged += delegate { try { if (picture.Image != null) { picture.Image.Dispose(); picture.Image = null; } if (scaledCurrentPageBitmap != null) { scaledCurrentPageBitmap.Dispose(); scaledCurrentPageBitmap = null; } if (pages != null) { pages.Dispose(); pages = null; } if (string.IsNullOrWhiteSpace(testFile.Text)) { return; } testFile.SelectionStart = testFile.Text.Length; testFile.ScrollToCaret(); if (!File.Exists(testFile.Text)) { Win.LogMessage.Error("File '" + testFile.Text + "' does not exist!"); return; } pages = new PageCollection(testFile.Text); totalPageNumber = pages.PdfReader.NumberOfPages; lTotalPages.Text = " / " + totalPageNumber; showPage(1); } catch (Exception ex) { Win.LogMessage.Error(ex); } }; pictureScale.ValueChanged += delegate { if (!loadingTemplate) { setScaledImage(); } }; pageRotation.SelectedIndexChanged += delegate { reloadPageBitmaps(); //showPage(currentPageI); }; autoDeskew.CheckedChanged += delegate { reloadPageBitmaps(); //showPage(currentPageI); }; Load += delegate { }; save.Click += Save_Click; cancel.Click += delegate { Close(); }; Help.LinkClicked += Help_LinkClicked; Configure.LinkClicked += Configure_LinkClicked; About.LinkClicked += About_LinkClicked; bTestFile.Click += delegate(object sender, EventArgs e) { OpenFileDialog d = new OpenFileDialog(); if (!string.IsNullOrWhiteSpace(testFile.Text)) { d.InitialDirectory = PathRoutines.GetFileDir(testFile.Text); } else if (!string.IsNullOrWhiteSpace(templateManager.TestFileDefaultFolder)) { d.InitialDirectory = templateManager.TestFileDefaultFolder; } d.Filter = "PDF|*.pdf|" + "All files (*.*)|*.*"; if (d.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } testFile.Text = d.FileName; }; ShowPdfText.LinkClicked += ShowPdfText_LinkClicked; ShowOcrText.LinkClicked += ShowOcrText_LinkClicked; ShowAsJson.LinkClicked += showAsJson_LinkClicked; tCurrentPage.Leave += delegate { changeCurrentPage(); }; tCurrentPage.KeyDown += delegate(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { changeCurrentPage(); } }; }
object extractFieldAndDrawSelectionBox(Template.Field field) { try { if (pages == null) { return(null); } if (field.Rectangle == null) { return(null); } pages.ActiveTemplate = GetTemplateFromUI(false); if (field.LeftAnchor != null && !findAndDrawAnchor(field.LeftAnchor.Id)) { return(null); } if (field.TopAnchor != null && !findAndDrawAnchor(field.TopAnchor.Id)) { return(null); } if (field.RightAnchor != null && !findAndDrawAnchor(field.RightAnchor.Id)) { return(null); } if (field.BottomAnchor != null && !findAndDrawAnchor(field.BottomAnchor.Id)) { return(null); } Page.FieldActualInfo fai = pages[currentPageI].GetFieldActualInfo(field); if (!fai.Found) { return(null); } RectangleF r = (RectangleF)fai.ActualRectangle; owners2resizebleBox[field] = new ResizebleBox(field, r, Settings.Appearance.SelectionBoxBorderWidth); object v = fai.GetValue(field.DefaultValueType); switch (field.DefaultValueType) { case Template.Field.ValueTypes.PdfText: case Template.Field.ValueTypes.PdfTextLines: case Template.Field.ValueTypes.PdfCharBoxs: if (field.ColumnOfTable != null) { if (!fai.TableFieldActualInfo.Found) { return(null); } drawBoxes(Settings.Appearance.TableBoxColor, Settings.Appearance.TableBoxBorderWidth, new List <RectangleF> { (RectangleF)fai.TableFieldActualInfo.ActualRectangle }); if (ShowFieldTextLineSeparators.Checked) { RectangleF tableAR = (RectangleF)fai.TableFieldActualInfo.ActualRectangle; List <Pdf.Line> lines = Pdf.GetLines(Pdf.GetCharBoxsSurroundedByRectangle(pages[currentPageI].PdfCharBoxs, tableAR), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); List <RectangleF> lineBoxes = new List <RectangleF>(); for (int i = 1; i < lines.Count; i++) { if (lines[i].Bottom <tableAR.Top || lines[i].Top> tableAR.Bottom || lines[i].Bottom <r.Top || lines[i].Top> r.Bottom ) { continue; } lineBoxes.Add(new RectangleF { X = r.X, Y = lines[i].Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } else { if (ShowFieldTextLineSeparators.Checked) { List <Pdf.Line> lines = Pdf.GetLines(Pdf.GetCharBoxsSurroundedByRectangle(pages[currentPageI].PdfCharBoxs, r), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); List <RectangleF> lineBoxes = new List <RectangleF>(); for (int i = 1; i < lines.Count; i++) { lineBoxes.Add(new RectangleF { X = r.X, Y = lines[i].Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); if (field.DefaultValueType == Template.Field.ValueTypes.PdfText) { return(Page.NormalizeText((string)v)); } if (field.DefaultValueType == Template.Field.ValueTypes.PdfTextLines) { return(Page.NormalizeText(string.Join("\r\n", (List <string>)v))); } //if (field.DefaultValueType == Template.Field.ValueTypes.PdfTextCharBoxs) return(Page.NormalizeText(Serialization.Json.Serialize(v))); case Template.Field.ValueTypes.OcrText: case Template.Field.ValueTypes.OcrTextLines: case Template.Field.ValueTypes.OcrCharBoxs: if (field.ColumnOfTable != null) { if (!fai.TableFieldActualInfo.Found) { return(null); } drawBoxes(Settings.Appearance.TableBoxColor, Settings.Appearance.TableBoxBorderWidth, new List <RectangleF> { (RectangleF)fai.TableFieldActualInfo.ActualRectangle }); if (ShowFieldTextLineSeparators.Checked) { RectangleF tableAR = (RectangleF)fai.TableFieldActualInfo.ActualRectangle; //List<Ocr.Line> lines = Ocr.GetLines(Ocr.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateOcrCharBoxs, tableAR), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); //List<Ocr.Line> lines = Ocr.GetLines(Ocr.This.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateBitmap, tableAR, pages.ActiveTemplate.TesseractPageSegMode), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); List <Ocr.Line> lines = Ocr.GetLines((List <Ocr.CharBox>)fai.TableFieldActualInfo.GetValue(Template.Field.ValueTypes.OcrCharBoxs), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); List <RectangleF> lineBoxes = new List <RectangleF>(); for (int i = 1; i < lines.Count; i++) { if (lines[i].Bottom <tableAR.Top || lines[i].Top> tableAR.Bottom || lines[i].Bottom <r.Top || lines[i].Top> r.Bottom ) { continue; } lineBoxes.Add(new RectangleF { X = r.X, Y = lines[i].Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } else { if (ShowFieldTextLineSeparators.Checked) { //List<Ocr.Line> lines = Ocr.GetLines(Ocr.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateOcrCharBoxs, r), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); List <Ocr.Line> lines = Ocr.GetLines(Ocr.This.GetCharBoxsSurroundedByRectangle(pages[currentPageI].ActiveTemplateBitmap, r, pages.ActiveTemplate.TesseractPageSegMode), pages.ActiveTemplate.TextAutoInsertSpace).ToList(); List <RectangleF> lineBoxes = new List <RectangleF>(); for (int i = 1; i < lines.Count; i++) { lineBoxes.Add(new RectangleF { X = r.X, Y = lines[i].Top, Width = r.Width, Height = 0 }); } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.TextLineSeparatorWidth, lineBoxes); } } drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); if (field.DefaultValueType == Template.Field.ValueTypes.OcrText) { return(Page.NormalizeText((string)v)); } if (field.DefaultValueType == Template.Field.ValueTypes.OcrTextLines) { return(Page.NormalizeText(string.Join("\r\n", (List <string>)v))); } return(Page.NormalizeText(Serialization.Json.Serialize(v))); //drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List<RectangleF> { r }); //if (field.DefaultValueType == Template.Field.ValueTypes.OcrText) // return Page.NormalizeText((string)v); //if (field.DefaultValueType == Template.Field.ValueTypes.OcrTextLines) // return Page.NormalizeText(string.Join("\r\n", (List<string>)v)); ////if (field.DefaultValueType == Template.Field.ValueTypes.OcrTextCharBoxs) //return Page.NormalizeText(Serialization.Json.Serialize(v)); case Template.Field.ValueTypes.Image: drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); return(v); case Template.Field.ValueTypes.OcrTextLineImages: drawBoxes(Settings.Appearance.SelectionBoxColor, Settings.Appearance.SelectionBoxBorderWidth, new List <RectangleF> { r }); return(v); default: throw new Exception("Unknown option: " + field.DefaultValueType); } } catch (Exception ex) { //Win.LogMessage.Error("Rectangle", ex); Win.LogMessage.Error(ex); } return(null); }
List <Bitmap> getOcrTextLineImages() { if (ActualRectangle == null) { return(null); } RectangleF ar = (RectangleF)ActualRectangle; Template.Field.Ocr aof = ActualField as Template.Field.Ocr; List <Line <Ocr.CharBox> > ols; float left, width; if (ActualField.ColumnOfTable == null) { if (aof?.SingleFieldFromFieldImage ?? page.PageCollection.ActiveTemplate.SingleFieldFromFieldImage) { List <Ocr.CharBox> cs = Ocr.This.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateBitmap, ar, aof?.TesseractPageSegMode ?? page.PageCollection.ActiveTemplate.TesseractPageSegMode); if (cs == null) { return(null); } ols = GetLines(cs, null, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter); } else { ols = Ocr.GetLinesSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, ar, null, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter); } if (aof?.AdjustLineBorders ?? page.PageCollection.ActiveTemplate.AdjustLineBorders) { AdjustBorders(ols, ar); } else { PadLines(ols, ActualField.LinePaddingY ?? page.PageCollection.ActiveTemplate.LinePaddingY); } left = ar.Left; width = ar.Width; } else { if (!TableFieldActualInfo.Found) { return(null); } List <Ocr.CharBox> cbs = (List <Ocr.CharBox>)TableFieldActualInfo.GetValue(Template.Field.Types.OcrCharBoxs); if (aof?.ColumnCellFromCellImage ?? page.PageCollection.ActiveTemplate.ColumnCellFromCellImage) { ols = GetLines(cbs, null, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter); } else { ols = GetLines(cbs, null, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter); } if (aof?.AdjustLineBorders ?? page.PageCollection.ActiveTemplate.AdjustLineBorders) { AdjustBorders(ols, TableFieldActualInfo.ActualRectangle.Value); } else { PadLines(ols, ActualField.LinePaddingY ?? page.PageCollection.ActiveTemplate.LinePaddingY); } left = ar.X > TableFieldActualInfo.ActualRectangle.Value.X ? ar.X : TableFieldActualInfo.ActualRectangle.Value.X; width = (ar.Right < TableFieldActualInfo.ActualRectangle.Value.Right ? ar.Right : TableFieldActualInfo.ActualRectangle.Value.Right) - left; } List <Bitmap> ls = new List <Bitmap>(); foreach (Line <Ocr.CharBox> l in ols) { RectangleF r = new RectangleF(left, l.Top, width, l.Bottom - l.Top); using (Bitmap b = page.GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Pdf2ImageResolutionRatio, r.Y / Settings.Constants.Pdf2ImageResolutionRatio, r.Width / Settings.Constants.Pdf2ImageResolutionRatio, r.Height / Settings.Constants.Pdf2ImageResolutionRatio)) { ls.Add(b == null ? b : GetImageScaled2Pdf(b)); } } return(ls); }
object getValue(Template.Field field /*, int fieldDefinitionIndex*/, ValueTypes valueType = ValueTypes.Default) { RectangleF?r_ = GetFieldActualRectange(field); if (r_ == null) { return(null); } RectangleF r = (RectangleF)r_; switch (field.Type) { case Template.Field.Types.PdfText: Template.Field.PdfText pt = (Template.Field.PdfText)field; switch (valueType) { case ValueTypes.Default: List <string> ls; if (pt.ColumnOfTable == null) { ls = Pdf.GetTextLinesSurroundedByRectangle(PdfCharBoxs, r, pageCollection.ActiveTemplate.TextAutoInsertSpace); } else { ls = GetTextLinesAsTableColumn(pt, r); } return(string.Join("\r\n", ls)); case ValueTypes.TextLines: if (pt.ColumnOfTable == null) { ls = Pdf.GetTextLinesSurroundedByRectangle(PdfCharBoxs, r, pageCollection.ActiveTemplate.TextAutoInsertSpace); } else { ls = GetTextLinesAsTableColumn(pt, r); } return(ls); case ValueTypes.CharBoxs: return(Pdf.GetCharBoxsSurroundedByRectangle(PdfCharBoxs, r)); default: throw new Exception("Unknown option: " + valueType); } case Template.Field.Types.OcrText: Template.Field.OcrText ot = (Template.Field.OcrText)field; switch (valueType) { case ValueTypes.Default: return(Ocr.This.GetTextSurroundedByRectangle(ActiveTemplateBitmap, r)); case ValueTypes.TextLines: throw new Exception("To be implemented."); case ValueTypes.CharBoxs: return(Ocr.GetCharBoxsSurroundedByRectangle(ActiveTemplateOcrCharBoxs, r)); default: throw new Exception("Unknown option: " + valueType); } case Template.Field.Types.ImageData: switch (valueType) { case ValueTypes.Default: using (Bitmap rb = GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio)) { return(ImageData.GetScaled(rb, Settings.Constants.Image2PdfResolutionRatio)); } case ValueTypes.TextLines: case ValueTypes.CharBoxs: throw new Exception("Option " + valueType + " cannot be used this Field type."); default: throw new Exception("Unknown option: " + valueType); } default: throw new Exception("Unknown option: " + field.Type); } }
List <string> getOcrTextLines() { if (ActualRectangle == null) { return(null); } RectangleF ar = (RectangleF)ActualRectangle; Template.Field.Ocr aof = ActualField as Template.Field.Ocr; TextAutoInsertSpace textAutoInsertSpace = aof?.TextAutoInsertSpace != null ? aof?.TextAutoInsertSpace : page.PageCollection.ActiveTemplate.TextAutoInsertSpace; if (ActualField.ColumnOfTable == null) { if (aof?.SingleFieldFromFieldImage ?? page.PageCollection.ActiveTemplate.SingleFieldFromFieldImage) { List <Ocr.CharBox> cs = Ocr.This.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateBitmap, ar, aof?.TesseractPageSegMode ?? page.PageCollection.ActiveTemplate.TesseractPageSegMode); if (cs == null) { return(null); } return(GetTextLines(cs, textAutoInsertSpace, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter)); } else { return(Ocr.GetTextLinesSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, ar, textAutoInsertSpace, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter)); } } if (!TableFieldActualInfo.Found) { return(null); } List <Ocr.CharBox> cbs = (List <Ocr.CharBox>)TableFieldActualInfo.GetValue(Template.Field.Types.OcrCharBoxs); List <string> ls = new List <string>(); if (aof?.ColumnCellFromCellImage ?? page.PageCollection.ActiveTemplate.ColumnCellFromCellImage) { List <Line <Ocr.CharBox> > ols = GetLines(cbs, null, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter); if (aof?.AdjustLineBorders ?? page.PageCollection.ActiveTemplate.AdjustLineBorders) { AdjustBorders(ols, TableFieldActualInfo.ActualRectangle.Value); } else { PadLines(ols, ActualField.LinePaddingY ?? page.PageCollection.ActiveTemplate.LinePaddingY); } foreach (Line <Ocr.CharBox> l in ols) { float x = ar.X > TableFieldActualInfo.ActualRectangle.Value.X ? ar.X : TableFieldActualInfo.ActualRectangle.Value.X; RectangleF r = new RectangleF( x, l.Top, (ar.Right < TableFieldActualInfo.ActualRectangle.Value.Right ? ar.Right : TableFieldActualInfo.ActualRectangle.Value.Right) - x, l.Bottom - l.Top ); List <Ocr.CharBox> cs = Ocr.This.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateBitmap, r, aof?.TesseractPageSegMode ?? page.PageCollection.ActiveTemplate.TesseractPageSegMode); ls.Add(cs != null ? string.Join("", GetTextLines(cs, textAutoInsertSpace, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter)) : ""); } } else { foreach (Line <Ocr.CharBox> l in GetLines(cbs, textAutoInsertSpace, ActualField.CharFilter ?? page.PageCollection.ActiveTemplate.CharFilter)) { StringBuilder sb = new StringBuilder(); foreach (Ocr.CharBox cb in l.CharBoxs) { if (cb.R.Left >= ar.Left && cb.R.Right <= ar.Right && cb.R.Top >= ar.Top && cb.R.Bottom <= ar.Bottom) { sb.Append(cb.Char); } } ls.Add(sb.ToString()); } } return(ls); }
Dictionary <Template.Field.ValueTypes, object> valueTypes2cachedValue = new Dictionary <Template.Field.ValueTypes, object>();//!!!cache Table field values for internal reuse only!!! object getValue_(Template.Field.ValueTypes valueType) { if (ActualRectangle == null || TableFieldActualInfo?.Found == false) { return(null); } RectangleF r = (RectangleF)ActualRectangle; switch (valueType) { case Template.Field.ValueTypes.PdfText: List <string> ls; if (ActualField.ColumnOfTable == null) { ls = Pdf.GetTextLinesSurroundedByRectangle(page.PdfCharBoxs, r, page.PageCollection.ActiveTemplate.TextAutoInsertSpace); } else { ls = getPdfTextLinesAsTableColumn(); } return(string.Join("\r\n", ls)); case Template.Field.ValueTypes.PdfTextLines: if (ActualField.ColumnOfTable == null) { return(Pdf.GetTextLinesSurroundedByRectangle(page.PdfCharBoxs, r, page.PageCollection.ActiveTemplate.TextAutoInsertSpace)); } return(getPdfTextLinesAsTableColumn()); case Template.Field.ValueTypes.PdfCharBoxs: return(Pdf.GetCharBoxsSurroundedByRectangle(page.PdfCharBoxs, r)); case Template.Field.ValueTypes.OcrText: if (ActualField.ColumnOfTable == null) { return(Ocr.This.GetTextSurroundedByRectangle(page.ActiveTemplateBitmap, r)); } throw new Exception("This code has to be debugged!"); return(string.Join("\r\n", getOcrTextLinesAsTableColumn())); case Template.Field.ValueTypes.OcrTextLines: throw new Exception("This code has to be debugged!"); if (ActualField.ColumnOfTable == null) { return(Regex.Split(Ocr.This.GetTextSurroundedByRectangle(page.ActiveTemplateBitmap, r), "$", RegexOptions.Multiline)); } return(getOcrTextLinesAsTableColumn()); case Template.Field.ValueTypes.OcrCharBoxs: return(Ocr.GetCharBoxsSurroundedByRectangle(page.ActiveTemplateOcrCharBoxs, r)); case Template.Field.ValueTypes.Image: using (Bitmap b = page.GetRectangleFromActiveTemplateBitmap(r.X / Settings.Constants.Image2PdfResolutionRatio, r.Y / Settings.Constants.Image2PdfResolutionRatio, r.Width / Settings.Constants.Image2PdfResolutionRatio, r.Height / Settings.Constants.Image2PdfResolutionRatio)) { return(Page.GetScaledImage2Pdf(b)); } default: throw new Exception("Unknown option: " + valueType); } }