日期:2014-06-10  浏览次数:20478 次

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using MODI;//Microsoft Office Document Imaging
// 首先用office安装盘这个组件,默认安装office的时候是不会安装的,只要添加这个组件功能就好了安装说明:http://support.microsoft.com/kb/982760
//组件Microsoft Office Document Imaging 12.0 Type Library(office2007)
//或者Microsoft Office Document Imaging 11.0 Type Library(office2003)
//中文简体OCR引擎 http://www.microsoft.com/downloads/thankyou.aspx?familyId=dd172063-9517-41d8-82af-29c38f7437b6&displayLang=zh-hk 

namespace ToText
{   
    /// <summary>
    /// Optical Character Recognition光学字符识别
    /// 20140507 Geovin Du
    /// 涂聚文
    /// </summary>
    public static class OCRGetstring
    {
        /// <summary>
        /// 语言类型
        /// </summary>
        /// <returns></returns>
        public static DataTable getLanguageList()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID",typeof(int));
            dt.Columns.Add("LanguageName", typeof(string));
            dt.Columns.Add("LanguageLCID", typeof(string));
            //dt.Rows.Add(1, "", 1);
            dt.Rows.Add(1,"简体中文", "2052");
            dt.Rows.Add(2,"繁体中文", "1028");
            dt.Rows.Add(3,"英语", "9");
            dt.Rows.Add(4,"捷克语", "5");
            dt.Rows.Add(5,"丹麦语", "6");
            dt.Rows.Add(6,"德语", "7");
            dt.Rows.Add(7,"希腊语", "8");
            dt.Rows.Add(8,"西班牙语", "10");
            dt.Rows.Add(9,"芬兰语", "11");
            dt.Rows.Add(10,"法语", "12");
            dt.Rows.Add(11, "匈牙利语", "14");
            dt.Rows.Add(12, "意大利语", "16");
            dt.Rows.Add(13, "日语", "17");
            dt.Rows.Add(14, "韩语", "18");
            dt.Rows.Add(15, "荷兰语", "19");
            dt.Rows.Add(16, "挪威语", "20");
            dt.Rows.Add(17, "波兰语", "21");
            dt.Rows.Add(18, "葡萄牙语", "22");
            dt.Rows.Add(19, "俄语", "25");
            dt.Rows.Add(20,"瑞典语", "29");
            dt.Rows.Add(21,"土耳其语", "31");
            return dt;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sValue"></param>
        /// <returns></returns>
        private static MODI.MiLANGUAGES GetLanuageType(string sValue)
        {
            switch (sValue)
            {
                case "2052":
                    return MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED;
                case "5":
                    return MODI.MiLANGUAGES.miLANG_CZECH;
                case "6":
                    return MODI.MiLANGUAGES.miLANG_DANISH;
                case "7":
                    return MODI.MiLANGUAGES.miLANG_GERMAN;
                case "8":
                    return MODI.MiLANGUAGES.miLANG_GREEK;
                case "9":
                    return MODI.MiLANGUAGES.miLANG_ENGLISH;
                case "10":
                    return MODI.MiLANGUAGES.miLANG_SPANISH;
                case "11":
                    return MODI.MiLANGUAGES.miLANG_FINNISH;
                case "12":
                    return MODI.MiLANGUAGES.miLANG_FRENCH;
                case "14":
                    return MODI.MiLANGUAGES.miLANG_HUNGARIAN;
                case "16":
                    return MODI.MiLANGUAGES.miLANG_ITALIAN;
                case "17":
                    return MODI.MiLANGUAGES.miLANG_JAPANESE;
                case "18":
                    return MODI.MiLANGUAGES.miLANG_KOREAN;
                case "19":
                    return MODI.MiLANGUAGES.miLANG_DUTCH;
                case "20":
                    return MODI.MiLANGUAGES.miLANG_NORWEGIAN;
                case "21":
                    return MODI.MiLANGUAGES.miLANG_POLISH;
                case "22":
                    return MODI.MiLANGUAGES.miLANG_PORTUGUESE;
                case "25":
                    return MODI.MiLANGUAGES.miLANG_RUSSIAN;
                case "29":
                    return MODI.MiLANGUAGES.miLANG_SWEDISH;
                case "31":
                    return MODI.MiLANGUAGES.miLANG_TURKISH;
                case "1028":
                    return MODI.MiLANGUAGES.miLANG_CHINESE_TRADITIONAL;
                default:
                    return MODI.MiLANGUAGES.miLANG_ENGLISH;
            }
        }


        /// <summary>
        ///  Images轉換文字
        /// </summary>
        /// <param name="image">Image</param>
        /// <param name="language">语言类型</param>
        /// <returns></returns>
        public static string ExtractText(this System.Drawing.Image image,string language)
        {
            var tmpFile = Path.GetTempFileName();
            StringBuilder sb = new StringBuilder();
            //string text;
            try
            {
                var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
                var gfxResize = Graphics.FromImage(bmp);
                gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
                bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
                var doc = new MODI.Document();
                doc.Create(tmpFile + ".bmp");
                // doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
                doc.OCR(GetLanuageType(language), true, true);  // 识别文字类型
                var img = (MODI.Image)doc.Images[0];
                var layout = img.Layout;
                sb.Append(layout.Text);
                //text = sb.ToString();// layout.Text;
            }
            finally
            {
                File.Delete(tmpFile);
                File.Delete(tmpFile + ".bmp");
            }

            return sb.ToString();// text;
        }
        /// <summary>
        /// 来源图片文件轉換文字
        /// </summary>
        /// <param name="fileToOCR">file文件</param>
        /// <param name="language">语言类型</param>
        /// <returns></returns>
        public static string getFileToOCR(string fileToOCR, string language)
        {
            StringBuilder sb = new StringBuilder();
            if (File.Exists(fileToOCR))
            {

                MODI.Document md = new MODI.Document();
                md.Create(fileToOCR);
                md.OCR(GetLanuageType(language), true, true);
                MODI.Image img;
                MODI.Layout layout;
                for (int i = 0; i < md.Images.Count; i++)
                {
                    img = (MODI.Image)md.Images[i];
                    layout = img.Layout;
                    sb.Append(layout.Text);
                }

                md.Close(false);
                
            }
            else
            {
                sb.Append("");
            }
             return sb.ToString();
        }
    }
}