#region License Information (GPL v3) /* ShareX - A program that allows you to take screenshots and share any file type Copyright (c) 2007-2020 ShareX Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Optionally you can also view the license at . */ #endregion License Information (GPL v3) using Newtonsoft.Json; using ShareX.HelpersLib; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Threading.Tasks; namespace ShareX.UploadersLib.OtherServices { public enum OCRSpaceLanguages { [Description("Arabic")] ara, [Description("Bulgarian")] bul, [Description("Chinese (Simplified)")] chs, [Description("Chinese (Traditional)")] cht, [Description("Croatian")] hrv, [Description("Czech")] cze, [Description("Danish")] dan, [Description("Dutch")] dut, [Description("English")] eng, [Description("Finnish")] fin, [Description("French")] fre, [Description("German")] ger, [Description("Greek")] gre, [Description("Hungarian")] hun, [Description("Korean")] kor, [Description("Italian")] ita, [Description("Japanese")] jpn, [Description("Norwegian")] nor, [Description("Polish")] pol, [Description("Portuguese")] por, [Description("Russian")] rus, [Description("Slovenian")] slv, [Description("Spanish")] spa, [Description("Swedish")] swe, [Description("Turkish")] tur } public class OCRSpace : Uploader { private const string APIURLUSA = "https://apipro1.ocr.space/parse/image"; private const string APIURLEurope = "https://apipro2.ocr.space/parse/image"; private const string APIURLAsia = "https://apipro3.ocr.space/parse/image"; private const string APIURLFree = "https://api.ocr.space/parse/image"; public string APIKey { get; set; } public OCRSpaceLanguages Language { get; set; } = OCRSpaceLanguages.eng; public bool Overlay { get; set; } public OCRSpace(string apiKey, OCRSpaceLanguages language = OCRSpaceLanguages.eng, bool overlay = false) { APIKey = apiKey; Language = language; Overlay = overlay; } public OCRSpaceResponse DoOCR(Stream stream, string fileName) { Dictionary arguments = new Dictionary(); arguments.Add("apikey", APIKey); arguments.Add("language", Language.ToString()); arguments.Add("isOverlayRequired", Overlay.ToString()); UploadResult ur = SendRequestFile(APIURLUSA, stream, fileName, "file", arguments); if (!ur.IsSuccess) { ur = SendRequestFile(APIURLEurope, stream, fileName, "file", arguments); } if (ur.IsSuccess) { return JsonConvert.DeserializeObject(ur.Response); } return null; } public static string DoOCR(OCRSpaceLanguages language, Stream stream, string fileName) { string result = null; try { OCRSpace ocr = new OCRSpace(APIKeys.OCRSpaceAPIKey, language); OCRSpaceResponse response = ocr.DoOCR(stream, fileName); if (response != null && !response.IsErroredOnProcessing && response.ParsedResults.Count > 0) { result = response.ParsedResults[0].ParsedText; } } catch (Exception e) { DebugHelper.WriteException(e); } return result; } public static Task DoOCRAsync(OCRSpaceLanguages language, Stream stream, string fileName) { return Task.Run(() => DoOCR(language, stream, fileName)); } } public class OCRSpaceResponse { public List ParsedResults { get; set; } public int OCRExitCode { get; set; } public bool IsErroredOnProcessing { get; set; } public string ErrorMessage { get; set; } public string ErrorDetails { get; set; } public string ProcessingTimeInMilliseconds { get; set; } } public class OCRSpaceParsedResult { public OCRSpaceTextOverlay TextOverlay { get; set; } public int FileParseExitCode { get; set; } public string ParsedText { get; set; } public string ErrorMessage { get; set; } public string ErrorDetails { get; set; } } public class OCRSpaceTextOverlay { public List Lines { get; set; } public bool HasOverlay { get; set; } public string Message { get; set; } } public class OCRSpaceLine { public List Words { get; set; } public int MaxHeight { get; set; } public int MinTop { get; set; } } public class OCRSpaceWord { public string WordText { get; set; } public int Left { get; set; } public int Top { get; set; } public int Height { get; set; } public int Width { get; set; } } }