From f7119d58ed64851a13bce87039cb929f31635168 Mon Sep 17 00:00:00 2001 From: Hiromu OCHIAI Date: Mon, 12 Feb 2018 23:53:08 -0800 Subject: [PATCH 1/4] Refactor: change confusing "c" to "client" --- client.go | 94 +++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/client.go b/client.go index af9d3fe..f1f1895 100644 --- a/client.go +++ b/client.go @@ -69,50 +69,50 @@ func NewClient() *Client { } // Close frees allocated API. This MUST be called for ANY client constructed by "NewClient" function. -func (c *Client) Close() (err error) { +func (client *Client) Close() (err error) { // defer func() { // if e := recover(); e != nil { // err = fmt.Errorf("%v", e) // } // }() - C.Free(c.api) + C.Free(client.api) return err } // SetImage sets path to image file to be processed OCR. -func (c *Client) SetImage(imagepath string) *Client { - c.ImagePath = imagepath - return c +func (client *Client) SetImage(imagepath string) *Client { + client.ImagePath = imagepath + return client } // SetLanguage sets languages to use. English as default. -func (c *Client) SetLanguage(langs ...string) *Client { - c.Languages = langs - return c +func (client *Client) SetLanguage(langs ...string) *Client { + client.Languages = langs + return client } // SetWhitelist sets whitelist chars. // See official documentation for whitelist here https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality#dictionaries-word-lists-and-patterns -func (c *Client) SetWhitelist(whitelist string) *Client { - return c.SetVariable("tessedit_char_whitelist", whitelist) +func (client *Client) SetWhitelist(whitelist string) *Client { + return client.SetVariable("tessedit_char_whitelist", whitelist) } // SetVariable sets parameters, representing tesseract::TessBaseAPI->SetVariable. // See official documentation here https://zdenop.github.io/tesseract-doc/classtesseract_1_1_tess_base_a_p_i.html#a2e09259c558c6d8e0f7e523cbaf5adf5 -func (c *Client) SetVariable(key, value string) *Client { - c.Variables[key] = value - return c +func (client *Client) SetVariable(key, value string) *Client { + client.Variables[key] = value + return client } // SetPageSegMode sets "Page Segmentation Mode" (PSM) to detect layout of characters. // See official documentation for PSM here https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality#page-segmentation-method -func (c *Client) SetPageSegMode(mode PageSegMode) *Client { - c.PageSegMode = &mode - return c +func (client *Client) SetPageSegMode(mode PageSegMode) *Client { + client.PageSegMode = &mode + return client } // SetConfigFile sets the file path to config file. -func (c *Client) SetConfigFile(fpath string) error { +func (client *Client) SetConfigFile(fpath string) error { info, err := os.Stat(fpath) if err != nil { return err @@ -120,36 +120,36 @@ func (c *Client) SetConfigFile(fpath string) error { if info.IsDir() { return fmt.Errorf("the specified config file path seems to be a directory") } - c.ConfigFilePath = fpath + client.ConfigFilePath = fpath return nil } // It's due to the caller to free this char pointer. -func (c *Client) charLangs() *C.char { +func (client *Client) charLangs() *C.char { var langs *C.char - if len(c.Languages) != 0 { - langs = C.CString(strings.Join(c.Languages, "+")) + if len(client.Languages) != 0 { + langs = C.CString(strings.Join(client.Languages, "+")) } return langs } // It's due to the caller to free this char pointer. -func (c *Client) charConfig() *C.char { +func (client *Client) charConfig() *C.char { var config *C.char - if _, err := os.Stat(c.ConfigFilePath); err == nil { - config = C.CString(c.ConfigFilePath) + if _, err := os.Stat(client.ConfigFilePath); err == nil { + config = C.CString(client.ConfigFilePath) } return config } // Initialize tesseract::TessBaseAPI // TODO: add tessdata prefix -func (c *Client) init() error { - langs := c.charLangs() +func (client *Client) init() error { + langs := client.charLangs() defer C.free(unsafe.Pointer(langs)) - config := c.charConfig() + config := client.charConfig() defer C.free(unsafe.Pointer(config)) - res := C.Init(c.api, nil, langs, config) + res := C.Init(client.api, nil, langs, config) if res != 0 { // TODO: capture and vacuum stderr from Cgo return fmt.Errorf("failed to initialize TessBaseAPI with code %d", res) @@ -159,45 +159,45 @@ func (c *Client) init() error { // Prepare tesseract::TessBaseAPI options, // must be called after `init`. -func (c *Client) prepare() error { +func (client *Client) prepare() error { // Set Image by giving path - imagepath := C.CString(c.ImagePath) + imagepath := C.CString(client.ImagePath) defer C.free(unsafe.Pointer(imagepath)) - C.SetImage(c.api, imagepath) + C.SetImage(client.api, imagepath) - for key, value := range c.Variables { - if ok := c.bind(key, value); !ok { + for key, value := range client.Variables { + if ok := client.bind(key, value); !ok { return fmt.Errorf("failed to set variable with key(%s):value(%s)", key, value) } } - if c.PageSegMode != nil { - mode := C.int(*c.PageSegMode) - C.SetPageSegMode(c.api, mode) + if client.PageSegMode != nil { + mode := C.int(*client.PageSegMode) + C.SetPageSegMode(client.api, mode) } return nil } // Binds variable to API object. // Must be called from inside `prepare`. -func (c *Client) bind(key, value string) bool { +func (client *Client) bind(key, value string) bool { k, v := C.CString(key), C.CString(value) defer C.free(unsafe.Pointer(k)) defer C.free(unsafe.Pointer(v)) - res := C.SetVariable(c.api, k, v) + res := C.SetVariable(client.api, k, v) return bool(res) } // Text finally initialize tesseract::TessBaseAPI, execute OCR and extract text detected as string. -func (c *Client) Text() (out string, err error) { - if err = c.init(); err != nil { +func (client *Client) Text() (out string, err error) { + if err = client.init(); err != nil { return } - if err = c.prepare(); err != nil { + if err = client.prepare(); err != nil { return } - out = C.GoString(C.UTF8Text(c.api)) - if c.Trim { + out = C.GoString(C.UTF8Text(client.api)) + if client.Trim { out = strings.Trim(out, "\n") } return out, err @@ -205,13 +205,13 @@ func (c *Client) Text() (out string, err error) { // HTML finally initialize tesseract::TessBaseAPI, execute OCR and returns hOCR text. // See https://en.wikipedia.org/wiki/HOCR for more information of hOCR. -func (c *Client) HTML() (out string, err error) { - if err = c.init(); err != nil { +func (client *Client) HTML() (out string, err error) { + if err = client.init(); err != nil { return } - if err = c.prepare(); err != nil { + if err = client.prepare(); err != nil { return } - out = C.GoString(C.HOCRText(c.api)) + out = C.GoString(C.HOCRText(client.api)) return } From 800ea10c36ca1ecd0b3d725d93c0769d66c12ab7 Mon Sep 17 00:00:00 2001 From: Hiromu OCHIAI Date: Mon, 12 Feb 2018 23:59:43 -0800 Subject: [PATCH 2/4] Good bye v1! --- README.md | 4 +- v1/gosseract/.samples/option/digest000.txt | 1 - v1/gosseract/.samples/option/digest001.txt | 1 - v1/gosseract/.samples/png/sample000.png | Bin 7550 -> 0 bytes v1/gosseract/.samples/png/sample001.png | Bin 5158 -> 0 bytes v1/gosseract/.samples/png/sample002.png | Bin 6132 -> 0 bytes v1/gosseract/.samples/png/sample003.png | Bin 3582 -> 0 bytes v1/gosseract/LICENSE | 21 ---- v1/gosseract/README.md | 67 ---------- v1/gosseract/all_test.go | 92 -------------- v1/gosseract/benchmark_test.go | 16 --- v1/gosseract/client.go | 117 ------------------ v1/gosseract/example_test.go | 25 ---- v1/gosseract/goss.go | 15 --- v1/gosseract/runtime_test/all_test.sh | 15 --- .../tess4.00.00dev_x_go1.9.Dockerfile | 19 --- v1/gosseract/tesseract.go | 84 ------------- v1/gosseract/tesseract/tess.cpp | 60 --------- v1/gosseract/tesseract/tess.h | 9 -- v1/gosseract/tesseract/test/all_test.go | 13 -- v1/gosseract/tesseract/test/dummy.go | 3 - v1/gosseract/tesseract/test/hoge.png | Bin 11992 -> 0 bytes v1/gosseract/tesseract/test/sample.png | Bin 8710 -> 0 bytes v1/gosseract/tesseract/wrapper.go | 22 ---- v1/gosseract/tesseract0302.go | 60 --------- v1/gosseract/tesseract0303.go | 61 --------- v1/gosseract/tesseract0304.go | 61 --------- v1/gosseract/tesseract0305.go | 61 --------- 28 files changed, 1 insertion(+), 826 deletions(-) delete mode 100644 v1/gosseract/.samples/option/digest000.txt delete mode 100644 v1/gosseract/.samples/option/digest001.txt delete mode 100644 v1/gosseract/.samples/png/sample000.png delete mode 100644 v1/gosseract/.samples/png/sample001.png delete mode 100644 v1/gosseract/.samples/png/sample002.png delete mode 100644 v1/gosseract/.samples/png/sample003.png delete mode 100644 v1/gosseract/LICENSE delete mode 100644 v1/gosseract/README.md delete mode 100644 v1/gosseract/all_test.go delete mode 100644 v1/gosseract/benchmark_test.go delete mode 100644 v1/gosseract/client.go delete mode 100644 v1/gosseract/example_test.go delete mode 100644 v1/gosseract/goss.go delete mode 100755 v1/gosseract/runtime_test/all_test.sh delete mode 100644 v1/gosseract/runtime_test/tess4.00.00dev_x_go1.9.Dockerfile delete mode 100644 v1/gosseract/tesseract.go delete mode 100644 v1/gosseract/tesseract/tess.cpp delete mode 100644 v1/gosseract/tesseract/tess.h delete mode 100644 v1/gosseract/tesseract/test/all_test.go delete mode 100644 v1/gosseract/tesseract/test/dummy.go delete mode 100644 v1/gosseract/tesseract/test/hoge.png delete mode 100644 v1/gosseract/tesseract/test/sample.png delete mode 100644 v1/gosseract/tesseract/wrapper.go delete mode 100644 v1/gosseract/tesseract0302.go delete mode 100644 v1/gosseract/tesseract0303.go delete mode 100644 v1/gosseract/tesseract0304.go delete mode 100644 v1/gosseract/tesseract0305.go diff --git a/README.md b/README.md index 1327d13..cb05883 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -> :tada: v2 is released! It contains breaking change. If you still want to use v1, please replace `github.com/otiai10/gosseract` with `github.com/otiai10/gosseract/v1/gosseract` and it is exactly the same thing as v1 implementation_ - -# Gosseract-OCR +# gosseract OCR [![Build Status](https://travis-ci.org/otiai10/gosseract.svg?branch=master)](https://travis-ci.org/otiai10/gosseract) [![codecov](https://codecov.io/gh/otiai10/gosseract/branch/master/graph/badge.svg)](https://codecov.io/gh/otiai10/gosseract) [![Go Report Card](https://goreportcard.com/badge/github.com/otiai10/gosseract)](https://goreportcard.com/report/github.com/otiai10/gosseract) diff --git a/v1/gosseract/.samples/option/digest000.txt b/v1/gosseract/.samples/option/digest000.txt deleted file mode 100644 index e07aed5..0000000 --- a/v1/gosseract/.samples/option/digest000.txt +++ /dev/null @@ -1 +0,0 @@ -tessedit_char_whitelist :0123456789 diff --git a/v1/gosseract/.samples/option/digest001.txt b/v1/gosseract/.samples/option/digest001.txt deleted file mode 100644 index 22af8d8..0000000 --- a/v1/gosseract/.samples/option/digest001.txt +++ /dev/null @@ -1 +0,0 @@ -tessedit_char_whitelist 403 diff --git a/v1/gosseract/.samples/png/sample000.png b/v1/gosseract/.samples/png/sample000.png deleted file mode 100644 index 4374af1bd1a6edba2cc7355d0c0af77af054d411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7550 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 Ue2u`GdjJ3c07*qoM6N<$f`gWn>Hq)$ diff --git a/v1/gosseract/.samples/png/sample001.png b/v1/gosseract/.samples/png/sample001.png deleted file mode 100644 index cd7cf8bb158aff8fb07e59f03ebf1d36f0543bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5158 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 diff --git a/v1/gosseract/LICENSE b/v1/gosseract/LICENSE deleted file mode 100644 index 79a64e9..0000000 --- a/v1/gosseract/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 otiai10 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/v1/gosseract/README.md b/v1/gosseract/README.md deleted file mode 100644 index d07f5ff..0000000 --- a/v1/gosseract/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Gosseract-OCR [![Build Status](https://travis-ci.org/otiai10/gosseract.svg?branch=master)](https://travis-ci.org/otiai10/gosseract) [![GoDoc](https://godoc.org/github.com/otiai10/gosseract?status.png)](https://godoc.org/github.com/otiai10/gosseract) - -[Tesseract-OCR](https://github.com/tesseract-ocr/tesseract) command for Golang - -# Quick Start - -If you have `docker` on your machine, just hit this and try with GUI - -```sh -docker run -it --rm -e PORT=8080 -p 8080:8080 otiai10/ocrserver -``` - -# Code Example - -```go -package main - -import ( - "fmt" - "github.com/otiai10/gosseract" -) - -func main() { - // This is the simplest way :) - out := gosseract.Must(gosseract.Params{ - Src: "your/img/file.png", - Languages: "eng+heb", - }) - fmt.Println(out) - - // Using client - client, _ := gosseract.NewClient() - out, _ = client.Src("your/img/file.png").Out() - fmt.Println(out) -} -``` - -# Server Application - -Here it is a ready-made solution. - -[![ocrserver](https://github.com/otiai10/ocrserver/raw/master/app/assets/favicon.png)](https://github.com/otiai10/ocrserver) -[ocrserver](https://github.com/otiai10/ocrserver): the minimum OCR server with using gosseract. - -# Installation - -1. install [tesseract-ocr](https://github.com/tesseract-ocr/tesseract) -2. install [go](http://golang.org/doc/install) -3. install [gosseract](https://godoc.org/github.com/otiai10/gosseract) - - `go get github.com/otiai10/gosseract` -4. install [mint for testing](https://godoc.org/github.com/otiai10/mint) - - `go get github.com/otiai10/mint` -5. run the tests first↓ - -# Test - -```sh -go test ./... -``` - -# Dependencies - -- [tesseract-ocr](https://github.com/tesseract-ocr/tesseract)#3.02~ -- [mint](https://github.com/otiai10/mint) to simplize tests - -# Known Issues -- https://github.com/otiai10/gosseract/issues?state=open diff --git a/v1/gosseract/all_test.go b/v1/gosseract/all_test.go deleted file mode 100644 index 234c185..0000000 --- a/v1/gosseract/all_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package gosseract - -import ( - "bytes" - "image" - "image/png" - "io/ioutil" - "os" - "strings" - "testing" - - . "github.com/otiai10/mint" -) - -func Test_Must(t *testing.T) { - Expect(t, Must(Params{ - Src: "./.samples/png/sample000.png", - Languages: "eng", - })).ToBe("01:37:58\n\n") -} - -func removeWhitespace(s string) string { - return strings.TrimSpace(strings.Replace(s, " ", "", -1)) -} - -// tesseract ./.samples/png/sample000.png out -l eng ./.samples/option/digest001.txt -func Test_Must_WithDigest(t *testing.T) { - params := Params{ - Src: "./.samples/png/sample001.png", - Languages: "eng", - } - Expect(t, Must(params)).ToBe("03:41:26\n\n") - - // add optional digest - // params["digest"] = "./.samples/option/digest001.txt" - params.Whitelist = "24" - Expect(t, removeWhitespace(Must(params))).ToBe("42") -} - -func Test_NewClient(t *testing.T) { - client, e := NewClient() - Expect(t, e).ToBe(nil) - Expect(t, client).TypeOf("*gosseract.Client") -} - -func TestClient_Must(t *testing.T) { - client, _ := NewClient() - params := map[string]string{} - _, e := client.Must(params) - Expect(t, e).Not().ToBe(nil) -} - -func TestClient_Src(t *testing.T) { - client, _ := NewClient() - out, e := client.Src("./.samples/png/sample000.png").Out() - Expect(t, e).ToBe(nil) - Expect(t, out).ToBe("01:37:58\n\n") -} - -func TestClient_Image(t *testing.T) { - client, _ := NewClient() - img := fixImage("./.samples/png/sample000.png") - out, e := client.Image(img).Out() - Expect(t, e).ToBe(nil) - Expect(t, out).ToBe("01:37:58\n\n") -} - -func TestClient_Digest(t *testing.T) { - client, _ := NewClient() - img := fixImage("./.samples/png/sample001.png") - out, e := client.Image(img).Out() - Expect(t, e).ToBe(nil) - Expect(t, out).ToBe("03:41:26\n\n") - - // ./.samples/option/digest001.txt: tessedit_char_whitelist 403 - out, e = client.Digest("./.samples/option/digest001.txt").Image(img).Out() - Expect(t, e).ToBe(nil) - Expect(t, removeWhitespace(out)).ToBe("034") -} - -func fixImage(fpath string) image.Image { - f, _ := os.Open(fpath) - buf, _ := ioutil.ReadFile(f.Name()) - img, _ := png.Decode(bytes.NewReader(buf)) - return img -} - -func TestClient_Out(t *testing.T) { - client, _ := NewClient() - _, e := client.Out() - Expect(t, e.Error()).ToBe("Source is not set") -} diff --git a/v1/gosseract/benchmark_test.go b/v1/gosseract/benchmark_test.go deleted file mode 100644 index 5e58303..0000000 --- a/v1/gosseract/benchmark_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package gosseract_test - -import ( - "testing" - - "github.com/otiai10/gosseract/v1/gosseract" -) - -func BenchmarkMust(b *testing.B) { - for i := 0; i < b.N; i++ { - gosseract.Must(gosseract.Params{ - Src: "./.samples/png/sample000.png", - Languages: "eng", - }) - } -} diff --git a/v1/gosseract/client.go b/v1/gosseract/client.go deleted file mode 100644 index 161b6ce..0000000 --- a/v1/gosseract/client.go +++ /dev/null @@ -1,117 +0,0 @@ -package gosseract - -import "fmt" -import "image" -import "os" -import "image/png" - -// Client is an client to use gosseract functions -type Client struct { - tesseract tesseractCmd - source path - digest path - // If the generated PNG source file needs to be deleted - needsdelete bool - Error error -} -type path struct { - value string -} - -func (p *path) Ready() bool { - return (p.value != "") -} -func (p *path) Get() string { - return p.value -} - -// NewClient provide reference to new Client -func NewClient() (c *Client, e error) { - tess, e := getTesseractCmd() - if e != nil { - return - } - c = &Client{tesseract: tess} - return -} - -// Src accepts path to target source file -func (c *Client) Src(srcPath string) *Client { - c.source = path{srcPath} - return c -} - -// Digest accepts path to target digest file -func (c *Client) Digest(digestPath string) *Client { - c.digest = path{digestPath} - return c -} - -// Image accepts image object of target -func (c *Client) Image(img image.Image) *Client { - imageFilePath, e := generateTmpFile() - if e != nil { - c.Error = e - return c - } - f, e := os.Create(imageFilePath) - // TODO: DRY - if e != nil { - c.Error = e - return c - } - defer f.Close() - png.Encode(f, img) - c.needsdelete = true - c.source = path{f.Name()} - return c -} - -// Out executes tesseract and gives results -func (c *Client) Out() (out string, e error) { - if e = c.ready(); e != nil { - return - } - // TODO: validation to call execute - out, e = c.execute() - if c.needsdelete { - os.Remove(c.source.value) - c.needsdelete = false - } - return -} - -// Must executes tesseract directly by parameter map -func (c *Client) Must(params map[string]string) (out string, e error) { - if e = c.accept(params); e != nil { - return - } - return c.Out() -} -func (c *Client) accept(params map[string]string) (e error) { - var ok bool - var src string - if src, ok = params["src"]; !ok { - return fmt.Errorf("missing parameter `src`") - } - c.source = path{src} - if digest, ok := params["digest"]; ok { - c.digest = path{digest} - } - return -} -func (c *Client) ready() (e error) { - if !c.source.Ready() { - return fmt.Errorf("Source is not set") - } - return -} -func (c *Client) execute() (res string, e error) { - args := []string{ - c.source.Get(), - } - if c.digest.Ready() { - args = append(args, c.digest.Get()) - } - return c.tesseract.Execute(args) -} diff --git a/v1/gosseract/example_test.go b/v1/gosseract/example_test.go deleted file mode 100644 index bd9facc..0000000 --- a/v1/gosseract/example_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package gosseract_test - -import "github.com/otiai10/gosseract/v1/gosseract" - -import "fmt" -import "image" - -func ExampleMust() { - // TODO: it panics! error handling in *Client.accept - out := gosseract.Must(gosseract.Params{Src: "./.samples/png/sample002.png", Languages: "eng+heb"}) - fmt.Println(out) -} - -func ExampleClient_Src() { - client, _ := gosseract.NewClient() - out, _ := client.Src("./samples/png/samples000.png").Out() - fmt.Println(out) -} - -func ExampleClient_Image() { - client, _ := gosseract.NewClient() - var img image.Image // any your image instance - out, _ := client.Image(img).Out() - fmt.Println(out) -} diff --git a/v1/gosseract/goss.go b/v1/gosseract/goss.go deleted file mode 100644 index 0e53203..0000000 --- a/v1/gosseract/goss.go +++ /dev/null @@ -1,15 +0,0 @@ -package gosseract - -import "github.com/otiai10/gosseract/v1/gosseract/tesseract" - -// Params is parameters for gosseract.Must. -type Params struct { - Src string // source image file path - Whitelist string // tessedit_char_whitelist - Languages string -} - -// Must execute tesseract-OCR directly by parameter map -func Must(params Params) (out string) { - return tesseract.Simple(params.Src, params.Whitelist, params.Languages) -} diff --git a/v1/gosseract/runtime_test/all_test.sh b/v1/gosseract/runtime_test/all_test.sh deleted file mode 100755 index 6fd7c46..0000000 --- a/v1/gosseract/runtime_test/all_test.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -runtimes=`ls ./runtime_test/*.Dockerfile` - -for runtime in $runtimes; do - testcase=`basename ${runtime} | sed -e s/\.Dockerfile$//` - echo "=== ${testcase} ===" - docker build . -f ${runtime} -t gosseract/test:${testcase} 1>/dev/null - if docker run -i -t --rm gosseract/test:${testcase}; then - echo "--- ${testcase}: Pass ---" - else - echo "--- ${testcase}: Failed ---" - exit 1 - fi -done diff --git a/v1/gosseract/runtime_test/tess4.00.00dev_x_go1.9.Dockerfile b/v1/gosseract/runtime_test/tess4.00.00dev_x_go1.9.Dockerfile deleted file mode 100644 index 00a17a2..0000000 --- a/v1/gosseract/runtime_test/tess4.00.00dev_x_go1.9.Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM otiai10/tesseract:4.00.00dev - -RUN apt-get update && apt-get install -y git - -RUN wget https://storage.googleapis.com/golang/go1.9.1.linux-amd64.tar.gz \ - && tar -xzf go1.9.1.linux-amd64.tar.gz -RUN mv /go /.go -ENV GOROOT=/.go - -RUN mkdir /go -ENV GOPATH=/go - -ENV PATH=${PATH}:${GOROOT}/bin:${GOPATH}/bin - -RUN go get github.com/otiai10/mint -RUN go get github.com/otiai10/gosseract -WORKDIR ${GOPATH}/src/github.com/otiai10/gosseract - -CMD go test -run Must diff --git a/v1/gosseract/tesseract.go b/v1/gosseract/tesseract.go deleted file mode 100644 index 1b87f78..0000000 --- a/v1/gosseract/tesseract.go +++ /dev/null @@ -1,84 +0,0 @@ -package gosseract - -import "fmt" -import "os/exec" -import "bytes" -import "regexp" -import "io/ioutil" - -type tesseractCmd interface { - Version() string - Execute(args []string) (string, error) -} - -// TESSERACT specifies bin name for tesseract. -const TESSERACT = "tesseract" -const tmpFILEPREFIX = "gosseract" -const outFILEEXTENSION = ".txt" - -func getTesseractCmd() (tess tesseractCmd, e error) { - commandPath, e := lookPath() - if e != nil { - return - } - v, e := version() - if e != nil { - return - } - if regexp.MustCompile("^3.02").Match([]byte(v)) { - tess = tesseract0302{version: v, commandPath: commandPath} - return - } - if regexp.MustCompile("^3.03").Match([]byte(v)) { - tess = tesseract0303{version: v, commandPath: commandPath} - return - } - if regexp.MustCompile("^3.04").Match([]byte(v)) { - tess = tesseract0304{version: v, commandPath: commandPath} - return - } - if regexp.MustCompile("^3.05").Match([]byte(v)) { - tess = tesseract0305{version: v, commandPath: commandPath} - return - } - e = fmt.Errorf("No tesseract version is found, supporting 3.02~, 3.03~, 3.04~ and 3.05~") - return -} -func lookPath() (commandPath string, e error) { - return exec.LookPath(TESSERACT) -} -func version() (v string, e error) { - v, e = execTesseractCommandWithStderr("--version") - if e != nil { - return - } - exp := regexp.MustCompile("^tesseract ([0-9\\.]+)") - matches := exp.FindStringSubmatch(v) - if len(matches) < 2 { - e = fmt.Errorf("tesseract version not found: response is `%s`", v) - return - } - v = matches[1] - return -} -func execTesseractCommandWithStderr(opt string) (res string, e error) { - cmd := exec.Command(TESSERACT, opt) - var stdout bytes.Buffer - cmd.Stdout = &stdout - var stderr bytes.Buffer - cmd.Stderr = &stderr - if e = cmd.Run(); e != nil { - return - } - res = stdout.String() + stderr.String() - return -} -func generateTmpFile() (fname string, e error) { - myTmpDir := "" // TODO: enable to choose optionally - f, e := ioutil.TempFile(myTmpDir, tmpFILEPREFIX) - if e != nil { - return - } - fname = f.Name() - return -} diff --git a/v1/gosseract/tesseract/tess.cpp b/v1/gosseract/tesseract/tess.cpp deleted file mode 100644 index 7a5b1c1..0000000 --- a/v1/gosseract/tesseract/tess.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#if __FreeBSD__ >= 10 -#include "/usr/local/include/tesseract/baseapi.h" -#include "/usr/local/include/leptonica/allheaders.h" -#else -#include -#include -#endif - -extern "C" { - class TessClient { - private: - tesseract::TessBaseAPI *api; - Pix *image; - public: - TessClient() - { - api = new tesseract::TessBaseAPI(); - } - TessClient(char *imgPath) - { - image = pixRead(imgPath); - } - void setImage(char* imgPath) - { - image = pixRead(imgPath); - } - char* Exec() - { - api->SetImage(image); - char *outText = api->GetUTF8Text(); - pixDestroy(&image); - api->End(); - return outText; - } - }; - - char* simple(char* filepath, char* whitelist ,char* languages) { - char *out; - tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); - // Initialize tesseract-ocr with English, without specifying tessdata path - if (api->Init(NULL, languages)) { - fprintf(stderr, "Could not initialize tesseract.\n"); - exit(1); - } - - Pix *image = pixRead(filepath); - api->SetImage(image); - - if (strlen(whitelist) != 0) { - api->SetVariable("tessedit_char_whitelist", whitelist); - } - - out = api->GetUTF8Text(); - api->End(); - pixDestroy(&image); - - return out; - } - -}/* extern "C" */ diff --git a/v1/gosseract/tesseract/tess.h b/v1/gosseract/tesseract/tess.h deleted file mode 100644 index 7c76557..0000000 --- a/v1/gosseract/tesseract/tess.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -char* simple(char* filepath, char* whitelist, char* languages); - -#ifdef __cplusplus -} -#endif/* extern "C" */ diff --git a/v1/gosseract/tesseract/test/all_test.go b/v1/gosseract/tesseract/test/all_test.go deleted file mode 100644 index dd09a61..0000000 --- a/v1/gosseract/tesseract/test/all_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package tesseract_test - -import ( - "testing" - - "github.com/otiai10/gosseract/v1/gosseract/tesseract" - . "github.com/otiai10/mint" -) - -func TestDo(t *testing.T) { - Expect(t, tesseract.Simple("hoge.png", "", "eng")).ToBe("otiai10 / gosseract\n\n") - Expect(t, tesseract.Simple("sample.png", "", "eng")).ToBe("2,464 total\n\n") -} diff --git a/v1/gosseract/tesseract/test/dummy.go b/v1/gosseract/tesseract/test/dummy.go deleted file mode 100644 index 17b8ad1..0000000 --- a/v1/gosseract/tesseract/test/dummy.go +++ /dev/null @@ -1,3 +0,0 @@ -package tesseract - -// https://github.com/golang/go/issues/8279 diff --git a/v1/gosseract/tesseract/test/hoge.png b/v1/gosseract/tesseract/test/hoge.png deleted file mode 100644 index bebcfe31daa73a7bb02e8ee6eceb280f0d610638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11992 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 diff --git a/v1/gosseract/tesseract/test/sample.png b/v1/gosseract/tesseract/test/sample.png deleted file mode 100644 index 99904f2d8a62c64608011ed626ec97281583f2a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8710 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 10 -#cgo LDFLAGS: -L/usr/local/lib -llept -ltesseract -#else -#cgo LDFLAGS: -llept -ltesseract -#endif - -#include "tess.h" -*/ -import "C" - -// Simple executes tesseract only with source image file path. -func Simple(imgPath string, whitelist string, languages string) string { - p := C.CString(imgPath) - w := C.CString(whitelist) - l := C.CString(languages) - - s := C.simple(p, w, l) - return C.GoString(s) -} diff --git a/v1/gosseract/tesseract0302.go b/v1/gosseract/tesseract0302.go deleted file mode 100644 index c1a746f..0000000 --- a/v1/gosseract/tesseract0302.go +++ /dev/null @@ -1,60 +0,0 @@ -package gosseract - -import "fmt" -import "os" -import "os/exec" -import "bytes" -import "io/ioutil" - -type tesseract0302 struct { - version string - resultFilePath string - commandPath string -} - -func (t tesseract0302) Version() string { - return t.version -} -func (t tesseract0302) Execute(params []string) (res string, e error) { - - // command args - var args []string - // Register source file - args = append(args, params[0]) - // generate result file path - t.resultFilePath, e = generateTmpFile() - if e != nil { - return - } - // Register result file - args = append(args, t.resultFilePath) - // Register digest file - if len(params) > 1 { - args = append(args, params[1]) - } - - // prepare command - cmd := exec.Command(TESSERACT, args...) - // execute - var stderr bytes.Buffer - cmd.Stderr = &stderr - if e = cmd.Run(); e != nil { - e = fmt.Errorf(stderr.String()) - return - } - // read result - res, e = t.readResult() - os.Remove(t.resultFilePath) - return -} -func (t tesseract0302) readResult() (res string, e error) { - fpath := t.resultFilePath + outFILEEXTENSION - file, e := os.OpenFile(fpath, 1, 1) - if e != nil { - return - } - buffer, _ := ioutil.ReadFile(file.Name()) - res = string(buffer) - os.Remove(file.Name()) - return -} diff --git a/v1/gosseract/tesseract0303.go b/v1/gosseract/tesseract0303.go deleted file mode 100644 index e95a747..0000000 --- a/v1/gosseract/tesseract0303.go +++ /dev/null @@ -1,61 +0,0 @@ -package gosseract - -import "fmt" -import "os" -import "os/exec" -import "bytes" -import "io/ioutil" - -type tesseract0303 struct { - version string - resultFilePath string - commandPath string -} - -func (t tesseract0303) Version() string { - return t.version -} - -func (t tesseract0303) Execute(params []string) (res string, e error) { - // command args - var args []string - // Register source file - args = append(args, params[0]) - // generate result file path - t.resultFilePath, e = generateTmpFile() - if e != nil { - return - } - // Register result file - args = append(args, t.resultFilePath) - // Register digest file - if len(params) > 1 { - args = append(args, params[1]) - } - - // prepare command - cmd := exec.Command(TESSERACT, args...) - // execute - var stderr bytes.Buffer - cmd.Stderr = &stderr - if e = cmd.Run(); e != nil { - e = fmt.Errorf(stderr.String()) - return - } - // read result - res, e = t.readResult() - os.Remove(t.resultFilePath) - return -} - -func (t tesseract0303) readResult() (res string, e error) { - fpath := t.resultFilePath + outFILEEXTENSION - file, e := os.OpenFile(fpath, 1, 1) - if e != nil { - return - } - buffer, _ := ioutil.ReadFile(file.Name()) - res = string(buffer) - os.Remove(file.Name()) - return -} diff --git a/v1/gosseract/tesseract0304.go b/v1/gosseract/tesseract0304.go deleted file mode 100644 index 4c53f64..0000000 --- a/v1/gosseract/tesseract0304.go +++ /dev/null @@ -1,61 +0,0 @@ -package gosseract - -import "fmt" -import "os" -import "os/exec" -import "bytes" -import "io/ioutil" - -type tesseract0304 struct { - version string - resultFilePath string - commandPath string -} - -func (t tesseract0304) Version() string { - return t.version -} - -func (t tesseract0304) Execute(params []string) (res string, e error) { - // command args - var args []string - // Register source file - args = append(args, params[0]) - // generate result file path - t.resultFilePath, e = generateTmpFile() - if e != nil { - return - } - // Register result file - args = append(args, t.resultFilePath) - // Register digest file - if len(params) > 1 { - args = append(args, params[1]) - } - - // prepare command - cmd := exec.Command(TESSERACT, args...) - // execute - var stderr bytes.Buffer - cmd.Stderr = &stderr - if e = cmd.Run(); e != nil { - e = fmt.Errorf(stderr.String()) - return - } - // read result - res, e = t.readResult() - os.Remove(t.resultFilePath) - return -} - -func (t tesseract0304) readResult() (res string, e error) { - fpath := t.resultFilePath + outFILEEXTENSION - file, e := os.OpenFile(fpath, 1, 1) - if e != nil { - return - } - buffer, _ := ioutil.ReadFile(file.Name()) - res = string(buffer) - os.Remove(file.Name()) - return -} diff --git a/v1/gosseract/tesseract0305.go b/v1/gosseract/tesseract0305.go deleted file mode 100644 index e741339..0000000 --- a/v1/gosseract/tesseract0305.go +++ /dev/null @@ -1,61 +0,0 @@ -package gosseract - -import "fmt" -import "os" -import "os/exec" -import "bytes" -import "io/ioutil" - -type tesseract0305 struct { - version string - resultFilePath string - commandPath string -} - -func (t tesseract0305) Version() string { - return t.version -} - -func (t tesseract0305) Execute(params []string) (res string, e error) { - // command args - var args []string - // Register source file - args = append(args, params[0]) - // generate result file path - t.resultFilePath, e = generateTmpFile() - if e != nil { - return - } - // Register result file - args = append(args, t.resultFilePath) - // Register digest file - if len(params) > 1 { - args = append(args, params[1]) - } - - // prepare command - cmd := exec.Command(TESSERACT, args...) - // execute - var stderr bytes.Buffer - cmd.Stderr = &stderr - if e = cmd.Run(); e != nil { - e = fmt.Errorf(stderr.String()) - return - } - // read result - res, e = t.readResult() - os.Remove(t.resultFilePath) - return -} - -func (t tesseract0305) readResult() (res string, e error) { - fpath := t.resultFilePath + outFILEEXTENSION - file, e := os.OpenFile(fpath, 1, 1) - if e != nil { - return - } - buffer, _ := ioutil.ReadFile(file.Name()) - res = string(buffer) - os.Remove(file.Name()) - return -} From 5f9d63cf73a8c1384938c89750e582a335649cd1 Mon Sep 17 00:00:00 2001 From: Hiromu OCHIAI Date: Tue, 13 Feb 2018 00:10:14 -0800 Subject: [PATCH 3/4] Add test cases --- all_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/all_test.go b/all_test.go index 04217be..f235d44 100644 --- a/all_test.go +++ b/all_test.go @@ -94,12 +94,18 @@ func TestClient_HTML(t *testing.T) { Expect(t, texts).ToBe([]string{"otiai10", "/", "gosseract"}) When(t, "only invalid languages are given", func(t *testing.T) { + client := NewClient() + defer client.Close() client.SetLanguage("foo") + client.SetImage("./test/data/001-gosseract.png") _, err := client.HTML() Expect(t, err).Not().ToBe(nil) }) When(t, "undefined key-value is tried to be set", func(t *testing.T) { + client := NewClient() + defer client.Close() client.SetVariable("foobar", "hoge") + client.SetImage("./test/data/001-gosseract.png") _, err := client.HTML() Expect(t, err).Not().ToBe(nil) }) From 3dc0985141831e3a220d8b6cc22e5a12f7392920 Mon Sep 17 00:00:00 2001 From: Hiromu OCHIAI Date: Tue, 13 Feb 2018 00:11:31 -0800 Subject: [PATCH 4/4] Fix method name for HOCR Related #109 --- all_test.go | 6 +++--- client.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/all_test.go b/all_test.go index f235d44..5a99026 100644 --- a/all_test.go +++ b/all_test.go @@ -79,7 +79,7 @@ func TestClient_HTML(t *testing.T) { defer client.Close() client.SetImage("./test/data/001-gosseract.png") client.SetWhitelist("otiai10/gosseract") - out, err := client.HTML() + out, err := client.HOCRText() Expect(t, err).ToBe(nil) tokenizer := html.NewTokenizer(strings.NewReader(out)) @@ -98,7 +98,7 @@ func TestClient_HTML(t *testing.T) { defer client.Close() client.SetLanguage("foo") client.SetImage("./test/data/001-gosseract.png") - _, err := client.HTML() + _, err := client.HOCRText() Expect(t, err).Not().ToBe(nil) }) When(t, "undefined key-value is tried to be set", func(t *testing.T) { @@ -106,7 +106,7 @@ func TestClient_HTML(t *testing.T) { defer client.Close() client.SetVariable("foobar", "hoge") client.SetImage("./test/data/001-gosseract.png") - _, err := client.HTML() + _, err := client.HOCRText() Expect(t, err).Not().ToBe(nil) }) } diff --git a/client.go b/client.go index f1f1895..79d67d2 100644 --- a/client.go +++ b/client.go @@ -205,7 +205,7 @@ func (client *Client) Text() (out string, err error) { // HTML finally initialize tesseract::TessBaseAPI, execute OCR and returns hOCR text. // See https://en.wikipedia.org/wiki/HOCR for more information of hOCR. -func (client *Client) HTML() (out string, err error) { +func (client *Client) HOCRText() (out string, err error) { if err = client.init(); err != nil { return }