// // main.swift // OCRImage // // Created by Jacky Jack on 04/03/2021. // import Foundation import ArgumentParser import Vision import AppKit class TextPiece { var text:String?; var topLeft:CGPoint; var topRight:CGPoint; var bottomLeft:CGPoint; var bottomRIght:CGPoint; init() { self.text = "Empty"; self.topLeft = CGPoint(x:0,y:0); self.topRight = CGPoint(x:0,y:0); self.bottomLeft = CGPoint(x:0,y:0); self.bottomRIght = CGPoint(x:0,y:0); } init(_ t: String, _ tl:CGPoint, _ tr:CGPoint, _ bl:CGPoint, _ br: CGPoint ) { self.text = t; self.topLeft = tl; self.topRight = tr; self.bottomLeft = bl; self.bottomRIght = br; } func set(_ t: String, _ tl:CGPoint, _ tr:CGPoint, _ bl:CGPoint, _ br: CGPoint) { self.text = t; self.topLeft = tl; self.topRight = tr; self.bottomLeft = bl; self.bottomRIght = br; } } class TextOCR { var pieces:[TextPiece] = [] init() { } func recognizeImageUrl(_ url:URL, _ error: Error?) { var pieces:[TextPiece] = [] var err:NSError? //guard let cgImage = //let requestHandler = VNImageRequestHandler(url: url) var textRequest = VNRecognizeTextRequest(completionHandler: recognizeTextHandler(request:error:)) //let request = VNRecognizeTextRequest(completionHandler: recognizeTextHandler); var handler = VNImageRequestHandler(url: url) do { try handler.perform([textRequest]) } catch { print("Cannot perfom request error:\(error)") } } func handleTextRequest(_ request: VNRequest, error: Error?) { } func recognizeTextHandler(request: VNRequest, error: Error?) { print("Start recognize handler") guard let observations = request.results as? [VNRecognizedTextObservation] else { return } let recognizedStrings = observations.compactMap { observation in // Return the string of the top VNRecognizedText instance. return observation.topCandidates(1).first?.string } print("\(recognizedStrings)") } } print("Start program") let stderr = FileHandle.standardError if #available(macOS 10.15,*) {} else { //Output to stderr if os version is not supported stderr.write("Version of MacOS should be >=10.15".data(using: .utf8)!) exit(0) } struct OCROptions : ParsableArguments { @Option(help:"Input file for OCR") var inputFile:String? @Flag(name: .shortAndLong, help:"Show extra debugion info") var debug=false @Flag(name:.shortAndLong, help:"Show current version") var version=false } let options = OCROptions.parseOrExit() //Print version version and quit if options.version { print("Version: 0.0.2") exit(0) } //exit if input-file isnot set //if nil == options.inputFile { // print("Set --input-file command argument to image") // exit(0) //} guard let inputFile = options.inputFile else { print("ERROR: Set --input-file command argument to image") exit(0) } print("OCR Input file: \(inputFile)") //Try to open file from URL var fm = FileManager.default.homeDirectoryForCurrentUser //let fm = FileManager.default print(fm) let path:String = inputFile fm.appendPathComponent(path) let ocrImageUrl = fm.absoluteURL print(fm) //load image let image = NSImage(contentsOf: ocrImageUrl) if (image == nil) { stderr.write("Cannot load image properly \(ocrImageUrl)".data(using: .utf8)!) exit(0) } //Start text recognition request var ocr = TextOCR() var err:NSError? ocr.recognizeImageUrl(ocrImageUrl, err) print("End programm")