internal void Read(CRContext crc, DCR.BlkDataTable blkdt) {
     DataTable dt = crc.dtCR;
     int cx = dt.Columns.Count;
     DataRow dr = crc.drCR;
     if (dr == null) return;
     for (int x = 0; x < cx; x++) {
         String nam = dt.Columns[x].ColumnName;
         String dat = Convert.ToString(dr[x]);
         if (String.IsNullOrEmpty(nam)) continue;
         foreach (DCR.BlkRow blk in blkdt.Select("FieldName = '" + (nam.Replace("'", "''")) + "'")) {
             if (!blk.IfImport) break;
             DSRes.TResRow row = dsRes.TRes.AddTResRow(nam, dat, 0, 0, 0, 0);
             row.x = blk.x;
             row.y = blk.y;
             row.cx = blk.cx;
             row.cy = blk.cy;
             break;
         }
     }
 }
Esempio n. 2
0
        private CRRes TryCR(Bitmap picSrc, String fp, int z, CRContext crc, OCRWIPForm wipper, bool rotate4, String formSel) {
            String baseDir = Path.GetDirectoryName(fpxml);
            Program.appTrace.TraceEvent(TraceEventType.Information, 0, "認識対象=" + fp);

            if (formSel == null) formSel = "";
            bool fSelForm = formSel != "";

            for (int rot = 0; rot < (rotate4 ? 4 : 1); rot++) {
                wipper.HintRot(rot);
                Bitmap pic = PiUt.Rotate(picSrc, rot);
                foreach (KeyValuePair<string, OCRSettei> kvs in crc.dictSet) {
                    Program.appTrace.TraceEvent(TraceEventType.Information, 0, "フォーム=" + kvs.Key);

                    bool forceThis = false;
                    if (fSelForm) {
                        if (String.Compare(formSel, Path.GetFileNameWithoutExtension(kvs.Key), true) != 0)
                            continue;
                        forceThis = true;
                    }

                    wipper.HintTempl(Path.GetFileNameWithoutExtension(kvs.Key), false);

                    bool fail = false, any = false;
                    {
                        DataRow[] rows = kvs.Value.DCR.Blk.Select("IfTest");
                        for (int x = 0; x < rows.Length; x++) {
                            DCR.BlkRow row = (DCR.BlkRow)rows[x];
                            wipper.HintForm(x, rows.Length * 2);

                            Object res = RUt.Recognize2(pic, row);
                            if (res != null && UtKwt.PartMatch2(Convert.ToString(res), row.TestKeyword, row.SkipWs)) {
                                any = true;
                            }
                            else {
                                fail = true;
                            }
                        }
                    }

                    Program.appTrace.TraceEvent(TraceEventType.Information, 0, "fail=" + fail + ", " + "any=" + any);

                    if (fail) {
                        if (forceThis) {

                        }
                        else {
                            continue;
                        }
                    }
                    else {
                        if (!any) continue;
                    }

                    Program.appTrace.TraceEvent(TraceEventType.Information, 0, "通過");

                    bool needVerify = kvs.Value.DCR.Blk.Select("NeedVerify").Length != 0;

                    wipper.HintTempl(Path.GetFileNameWithoutExtension(kvs.Key), true);

                    if (kvs.Value.PWay == "S1" && z == 0) {
                        Program.appTrace.TraceEvent(TraceEventType.Information, 0, "種類=表紙付きモード");
                        if (fail) {
                            Program.appTrace.TraceEvent(TraceEventType.Information, 0, "検出:失敗");
                        }
                        else {
                            Program.appTrace.TraceEvent(TraceEventType.Information, 0, "検出:成功");
                            // 表紙付き(フォーム検出成功)
                            crc.StartTemplPage();
                            crc.AddTempl("TEMPLATE", Path.GetFileNameWithoutExtension(kvs.Key));
                            DataRow[] rows = kvs.Value.DCR.Blk.Select("IfImport");
                            for (int x = 0; x < rows.Length; x++) {
                                DCR.BlkRow row = (DCR.BlkRow)rows[x];
                                wipper.HintForm(rows.Length + x, 2 * rows.Length);

                                Object res = RUt.Recognize2(pic, row);
                                crc.AddTempl(row.FieldName, res ?? "");
                            }

                            crc.NewRecord();
                            crc.AddFrmTempl();
                            crc.SetValue("OCR", 1);
                            if (needVerify) {
                                using (ConfirmForm form = new ConfirmForm(kvs.Value, pic)) {
                                    form.Read(crc, kvs.Value.DCR.Blk);
                                    switch (form.ShowDialog()) {
                                        case DialogResult.OK:
                                            form.SaveTo(crc);
                                            break;
                                        case DialogResult.No:
                                            continue;
                                        default:
                                            throw new ApplicationException("中止しました。");
                                    }
                                }
                            }
                            crc.CommitRecord();

                            crc.TemplAvail = true;
                            return CRRes.SaveAll;
                        }
                    }
                    else if (kvs.Value.PWay == "S") {
                        Program.appTrace.TraceEvent(TraceEventType.Information, 0, "種類=区切り/代表ページ");
                        if (fail) {
                            Program.appTrace.TraceEvent(TraceEventType.Information, 0, "検出:失敗");
                        }
                        else {
                            Program.appTrace.TraceEvent(TraceEventType.Information, 0, "検出:成功");
                            // 区切り(フォーム検出成功)
                            crc.StartTemplPage();
                            crc.AddTempl("TEMPLATE", Path.GetFileNameWithoutExtension(kvs.Key));
                            DataRow[] rows = kvs.Value.DCR.Blk.Select("IfImport");
                            for (int x = 0; x < rows.Length; x++) {
                                DCR.BlkRow row = (DCR.BlkRow)rows[x];
                                wipper.HintForm(rows.Length + x, 2 * rows.Length);

                                Object res = RUt.Recognize2(pic, row);
                                crc.AddTempl(row.FieldName, res ?? "");
                            }
                            crc.TemplAvail = true;
                            return CRRes.Sepa;
                        }
                    }
                    else if (kvs.Value.PWay == "") {
                        Program.appTrace.TraceEvent(TraceEventType.Information, 0, "種類=通常フォーム認識");
                        // 通常(フォーム検出成功)
                        crc.ClearTempl();
                        crc.NewRecord();
                        crc.SetValue("OCR", 1);
                        crc.SetValue("FORM", Path.GetFileNameWithoutExtension(kvs.Key));
                        DataRow[] rows = kvs.Value.DCR.Blk.Select("IfImport");
                        for (int x = 0; x < rows.Length; x++) {
                            DCR.BlkRow row = (DCR.BlkRow)rows[x];
                            wipper.HintForm(rows.Length + x, 2 * rows.Length);

                            Object res = RUt.Recognize2(pic, row);
                            crc.SetValue(row.FieldName, res ?? "");
                        }
                        if (needVerify) {
                            using (ConfirmForm form = new ConfirmForm(kvs.Value, pic)) {
                                form.Read(crc, kvs.Value.DCR.Blk);
                                switch (form.ShowDialog()) {
                                    case DialogResult.OK:
                                        form.SaveTo(crc);
                                        break;
                                    case DialogResult.No:
                                        continue;
                                    default:
                                        throw new ApplicationException("中止しました。");
                                }
                            }
                        }
                        crc.CommitRecord();
                        crc.TemplAvail = false;
                        return CRRes.Avail;
                    }
                    Program.appTrace.TraceEvent(TraceEventType.Information, 0, "終了");
                }
            }
            Program.appTrace.TraceEvent(TraceEventType.Information, 0, "crc.TemplAvail=" + crc.TemplAvail);
            if (crc.TemplAvail) {
                // 区切り従属
                crc.NewRecord();
                crc.AddFrmTempl();
                crc.SetValue("OCR", 1);
                crc.CommitRecord();
                return CRRes.Avail;
            }
            return CRRes.Fail;
        }
Esempio n. 3
0
        private void bRun_Click(object sender, EventArgs e) {
            CRContext crc = new CRContext();
            if (!crc.ReadSet(Path.GetDirectoryName(fpxml))) {
                MessageBox.Show(this, "OCRPattern テンプレート ファイルが見付かりません。\n\n先に作成してください。\n\n中止します。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            String outDir = tbDirOut.Text;
            if (String.IsNullOrEmpty(outDir) || !Directory.Exists(outDir)) {
                MessageBox.Show(this, "保存できる出力フォルダを先に設定してください。\n\n中止します。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            String recycDir = cbUseRecyc.Checked ? tbRecycDir.Text : null;
            String formSel = cbOnlyThis.Checked ? tbSeledForm.Text : "";
            FPUt fput = new FPUt(outDir);
            FPUt fputRecyc = (recycDir != null) ? new FPUt(recycDir) : null;
            using (Move2Temp m2t = new Move2Temp())
            using (OCRWIPForm form = OCRWIPForm.Show1()) {
                form.panelWIP.Show();
                foreach (String fp in tbFiles.Lines) {
                    if (!File.Exists(fp)) continue;
                    form.lfn.Text = Path.GetFileName(fp);
                    form.ldir.Text = Path.GetDirectoryName(fp);
                    fput.Flush();
                    String fext = Path.GetExtension(fp);
                    bool isPDF = String.Compare(fext, ".pdf", true) == 0;

                    using (UtPICio pdf = isPDF ? new UtPDFio(fp) as UtPICio : new UtTIFio(fp)) {
                        int cz = pdf.NumPages;
                        for (int z = 0; z < cz; z++) {
                            if (cbDoNotSplit.Checked && z != 0) continue;
                            form.HintPage(1 + z, true);
                            using (Bitmap pic = pdf.Rasterize(z)) {
                                crc.dtCR.Columns.Clear();
                                crc.dtCR.Rows.Clear();
                                CRRes resc;
                                if (CanSave(resc = TryCR(pic, fp, z, crc, form, cbRotate4.Checked, formSel))) {
                                    // 認識:成功
                                    if (resc == CRRes.SaveAll) {
                                        fput.Prepare(fext, ".csv");
                                        File.Copy(fp, fput.fp1, true);
                                        SCUt.SaveCsv(fput.fp2, crc.dtCR, Encoding.Default);
                                        RunCmd(fp, fput.fp1, fput.fp2, m2t);
                                        crc.ClearTempl();
                                        break;
                                    }
                                    else {
                                        fput.Prepare(fext, ".csv");
                                        pdf.SavePageAs(fput.fp1, 1 + z);
                                        SCUt.SaveCsv(fput.fp2, crc.dtCR, Encoding.Default);
                                        RunCmd(fp, fput.fp1, fput.fp2, m2t);
                                    }
                                }
                                else if (fputRecyc != null) {
                                    // 認識:失敗、保存有り
                                    if (cbDoNotSplit.Checked) {
                                        fputRecyc.Prepare(fext, fext);
                                        File.Copy(fp, fputRecyc.fp1, true);
                                        pdf.Dispose();
                                        try {
                                            File.Delete(fp);
                                        }
                                        catch (Exception) { }
                                        break;
                                    }
                                    else {
                                        fputRecyc.Prepare(fext, fext);
                                        pdf.SavePageAs(fputRecyc.fp1, 1 + z);
                                    }
                                }
                            }
                        }
                    }

                }
            }

            Updatefl();
            MessageBox.Show(this, "完了しました。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
 internal void SaveTo(CRContext crc) {
     foreach (DSRes.TResRow row in dsRes.TRes) {
         crc.drCR[row.Nam] = row.Dat;
     }
 }