mindee 3.1.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +26 -0
- data/README.md +57 -7
- data/bin/mindee.rb +160 -83
- data/docs/bank_account_details_v2.md +137 -0
- data/docs/bank_check_v1.md +179 -0
- data/docs/barcode_reader_v1.md +104 -0
- data/docs/carte_grise_v1.md +454 -0
- data/docs/carte_vitale_v1.md +123 -0
- data/docs/code_samples/barcode_reader_v1.txt +19 -0
- data/docs/code_samples/carte_grise_v1.txt +19 -0
- data/docs/code_samples/cropper_v1.txt +16 -0
- data/docs/code_samples/idcard_fr_v2.txt +19 -0
- data/docs/code_samples/invoice_splitter_v1_async.txt +6 -54
- data/docs/code_samples/multi_receipts_detector_v1.txt +19 -0
- data/docs/code_samples/us_w9_v1.txt +16 -0
- data/docs/cropper_v1.md +97 -0
- data/docs/custom_v1.md +109 -0
- data/docs/expense_receipts_v5.md +306 -0
- data/docs/financial_document_v1.md +384 -0
- data/docs/{ruby-getting-started.md → getting_started.md} +22 -6
- data/docs/idcard_fr_v2.md +253 -0
- data/docs/invoice_splitter_v1.md +85 -0
- data/docs/invoices_v4.md +338 -0
- data/docs/license_plates_v1.md +91 -0
- data/docs/multi_receipts_detector_v1.md +105 -0
- data/docs/passport_v1.md +186 -0
- data/docs/proof_of_address_v1.md +207 -0
- data/docs/us_driver_license_v1.md +268 -0
- data/docs/us_w9_v1.md +207 -0
- data/lib/mindee/client.rb +95 -16
- data/lib/mindee/geometry/quadrilateral.rb +5 -0
- data/lib/mindee/http/.rubocop.yml +8 -0
- data/lib/mindee/http/endpoint.rb +19 -7
- data/lib/mindee/http/error.rb +104 -0
- data/lib/mindee/http.rb +1 -0
- data/lib/mindee/input/sources.rb +83 -14
- data/lib/mindee/parsing/common/api_response.rb +12 -1
- data/lib/mindee/parsing/common/document.rb +4 -1
- data/lib/mindee/parsing/common/inference.rb +2 -2
- data/lib/mindee/parsing/common/ocr/ocr.rb +1 -0
- data/lib/mindee/parsing/common.rb +0 -1
- data/lib/mindee/parsing/custom/list_field.rb +7 -5
- data/lib/mindee/parsing/standard/base_field.rb +1 -1
- data/lib/mindee/parsing/standard/company_registration_field.rb +1 -1
- data/lib/mindee/parsing/standard/locale_field.rb +1 -1
- data/lib/mindee/parsing/standard/payment_details_field.rb +1 -1
- data/lib/mindee/parsing/standard/position_field.rb +10 -3
- data/lib/mindee/parsing/standard/{text_field.rb → string_field.rb} +1 -1
- data/lib/mindee/parsing/standard.rb +1 -1
- data/lib/mindee/pdf/pdf_processing.rb +2 -1
- data/lib/mindee/product/barcode_reader/barcode_reader_v1.rb +37 -0
- data/lib/mindee/product/barcode_reader/barcode_reader_v1_document.rb +44 -0
- data/lib/mindee/product/barcode_reader/barcode_reader_v1_page.rb +32 -0
- data/lib/mindee/product/cropper/cropper_v1.rb +37 -0
- data/lib/mindee/product/cropper/cropper_v1_document.rb +13 -0
- data/lib/mindee/product/cropper/cropper_v1_page.rb +49 -0
- data/lib/mindee/product/custom/custom_v1.rb +1 -0
- data/lib/mindee/product/eu/license_plate/license_plate_v1.rb +1 -0
- data/lib/mindee/product/eu/license_plate/license_plate_v1_document.rb +2 -2
- data/lib/mindee/product/financial_document/financial_document_v1.rb +1 -0
- data/lib/mindee/product/financial_document/financial_document_v1_document.rb +26 -26
- data/lib/mindee/product/fr/bank_account_details/bank_account_details_v1.rb +1 -0
- data/lib/mindee/product/fr/bank_account_details/bank_account_details_v1_document.rb +6 -6
- data/lib/mindee/product/fr/bank_account_details/bank_account_details_v2.rb +1 -0
- data/lib/mindee/product/fr/bank_account_details/bank_account_details_v2_document.rb +6 -6
- data/lib/mindee/product/fr/carte_grise/carte_grise_v1.rb +39 -0
- data/lib/mindee/product/fr/carte_grise/carte_grise_v1_document.rb +235 -0
- data/lib/mindee/product/fr/carte_grise/carte_grise_v1_page.rb +34 -0
- data/lib/mindee/product/fr/carte_vitale/carte_vitale_v1.rb +1 -0
- data/lib/mindee/product/fr/carte_vitale/carte_vitale_v1_document.rb +6 -6
- data/lib/mindee/product/fr/id_card/id_card_v1.rb +1 -0
- data/lib/mindee/product/fr/id_card/id_card_v1_document.rb +16 -16
- data/lib/mindee/product/fr/id_card/id_card_v2.rb +39 -0
- data/lib/mindee/product/fr/id_card/id_card_v2_document.rb +107 -0
- data/lib/mindee/product/fr/id_card/id_card_v2_page.rb +53 -0
- data/lib/mindee/product/invoice/invoice_v4.rb +2 -2
- data/lib/mindee/product/invoice/invoice_v4_document.rb +115 -155
- data/lib/mindee/product/invoice/invoice_v4_line_item.rb +54 -30
- data/lib/mindee/product/invoice_splitter/invoice_splitter_v1.rb +1 -0
- data/lib/mindee/product/invoice_splitter/invoice_splitter_v1_document.rb +5 -3
- data/lib/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.rb +37 -0
- data/lib/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.rb +35 -0
- data/lib/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_page.rb +32 -0
- data/lib/mindee/product/passport/passport_v1.rb +1 -0
- data/lib/mindee/product/passport/passport_v1_document.rb +16 -16
- data/lib/mindee/product/proof_of_address/proof_of_address_v1.rb +1 -0
- data/lib/mindee/product/proof_of_address/proof_of_address_v1_document.rb +14 -14
- data/lib/mindee/product/receipt/receipt_v4_document.rb +6 -6
- data/lib/mindee/product/receipt/receipt_v5.rb +1 -0
- data/lib/mindee/product/receipt/receipt_v5_document.rb +12 -12
- data/lib/mindee/product/us/bank_check/bank_check_v1.rb +1 -0
- data/lib/mindee/product/us/bank_check/bank_check_v1_document.rb +8 -8
- data/lib/mindee/product/us/driver_license/driver_license_v1.rb +1 -0
- data/lib/mindee/product/us/driver_license/driver_license_v1_document.rb +28 -28
- data/lib/mindee/product/us/w9/w9_v1.rb +39 -0
- data/lib/mindee/product/us/w9/w9_v1_document.rb +15 -0
- data/lib/mindee/product/us/w9/w9_v1_page.rb +102 -0
- data/lib/mindee/product.rb +6 -0
- data/lib/mindee/version.rb +5 -1
- data/lib/mindee.rb +45 -1
- metadata +48 -9
- data/docs/ruby-api-builder.md +0 -123
- data/docs/ruby-invoice-ocr.md +0 -271
- data/docs/ruby-passport-ocr.md +0 -165
- data/docs/ruby-receipt-ocr.md +0 -196
- data/lib/mindee/parsing/common/error.rb +0 -24
|
@@ -6,61 +6,13 @@ mindee_client = Mindee::Client.new(api_key: 'my-api-key')
|
|
|
6
6
|
# Load a file from disk
|
|
7
7
|
input_source = mindee_client.source_from_path('/path/to/the/file.ext')
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
doc_class = Mindee::Product::InvoiceSplitter::InvoiceSplitterV1
|
|
11
|
-
|
|
12
|
-
# Limit the amount of API calls to retrieve your document
|
|
13
|
-
MAX_RETRIES = 10
|
|
14
|
-
|
|
15
|
-
# How many seconds to wait in-between tries
|
|
16
|
-
INTERVAL_SECS = 6
|
|
17
|
-
|
|
18
|
-
# Counter to keep track of how many times we try to retrieve the document
|
|
19
|
-
times_tried = 1
|
|
20
|
-
|
|
21
|
-
queue_result = mindee_client.enqueue(
|
|
9
|
+
result = mindee_client.enqueue_and_parse(
|
|
22
10
|
input_source,
|
|
23
|
-
|
|
11
|
+
Mindee::Product::InvoiceSplitter::InvoiceSplitterV1
|
|
24
12
|
)
|
|
25
13
|
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# Recursive function that tries to retrieve the completed document.
|
|
30
|
-
# If the document is not "complete", try again
|
|
31
|
-
def get_doc_from_async_queue(
|
|
32
|
-
queue_id,
|
|
33
|
-
mindee_client,
|
|
34
|
-
doc_class,
|
|
35
|
-
times_tried=0,
|
|
36
|
-
interval_secs=INTERVAL_SECS,
|
|
37
|
-
max_retries=MAX_RETRIES
|
|
38
|
-
)
|
|
39
|
-
# Have we exceeded our retry count?
|
|
40
|
-
if times_tried >= max_retries
|
|
41
|
-
raise "Maximum retries reached #{times_tried}"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# Wait for a few seconds before fetching
|
|
45
|
-
sleep interval_secs
|
|
46
|
-
|
|
47
|
-
# Fetch and parse the result, using the same type
|
|
48
|
-
parsed_result = mindee_client.parse_queued(queue_id, doc_class)
|
|
49
|
-
|
|
50
|
-
# Check whether the result is ready
|
|
51
|
-
if parsed_result.job.status == Mindee::Parsing::Common::JobStatus::COMPLETED
|
|
52
|
-
# Print a brief summary of the parsed data
|
|
53
|
-
puts parsed_result.document
|
|
54
|
-
return
|
|
55
|
-
# Otherwise, try again...
|
|
56
|
-
else
|
|
57
|
-
get_doc_from_async_queue(
|
|
58
|
-
queue_id, mindee_client,
|
|
59
|
-
doc_class,
|
|
60
|
-
times_tried+1
|
|
61
|
-
)
|
|
62
|
-
end
|
|
63
|
-
end
|
|
14
|
+
# Print a full summary of the parsed data in RST format
|
|
15
|
+
puts result.document
|
|
64
16
|
|
|
65
|
-
#
|
|
66
|
-
|
|
17
|
+
# Print the document-level parsed data
|
|
18
|
+
# puts result.document.inference.prediction
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'mindee'
|
|
2
|
+
|
|
3
|
+
# Init a new client
|
|
4
|
+
mindee_client = Mindee::Client.new(api_key: 'my-api-key')
|
|
5
|
+
|
|
6
|
+
# Load a file from disk
|
|
7
|
+
input_source = mindee_client.source_from_path('/path/to/the/file.ext')
|
|
8
|
+
|
|
9
|
+
# Parse the file
|
|
10
|
+
result = mindee_client.parse(
|
|
11
|
+
input_source,
|
|
12
|
+
Mindee::Product::MultiReceiptsDetector::MultiReceiptsDetectorV1
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# Print a full summary of the parsed data in RST format
|
|
16
|
+
puts result.document
|
|
17
|
+
|
|
18
|
+
# Print the document-level parsed data
|
|
19
|
+
# puts result.document.inference.prediction
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'mindee'
|
|
2
|
+
|
|
3
|
+
# Init a new client
|
|
4
|
+
mindee_client = Mindee::Client.new(api_key: 'my-api-key')
|
|
5
|
+
|
|
6
|
+
# Load a file from disk
|
|
7
|
+
input_source = mindee_client.source_from_path('/path/to/the/file.ext')
|
|
8
|
+
|
|
9
|
+
# Parse the file
|
|
10
|
+
result = mindee_client.parse(
|
|
11
|
+
input_source,
|
|
12
|
+
Mindee::Product::US::W9::W9V1
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# Print a full summary of the parsed data in RST format
|
|
16
|
+
puts result.document
|
data/docs/cropper_v1.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cropper OCR Ruby
|
|
3
|
+
---
|
|
4
|
+
The Ruby OCR SDK supports the [Cropper API](https://platform.mindee.com/mindee/cropper).
|
|
5
|
+
|
|
6
|
+
Using the [sample below](https://github.com/mindee/client-lib-test-data/blob/main/products/cropper/default_sample.jpg), we are going to illustrate how to extract the data that we want using the OCR SDK.
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
# Quick-Start
|
|
10
|
+
```rb
|
|
11
|
+
require 'mindee'
|
|
12
|
+
|
|
13
|
+
# Init a new client
|
|
14
|
+
mindee_client = Mindee::Client.new(api_key: 'my-api-key')
|
|
15
|
+
|
|
16
|
+
# Load a file from disk
|
|
17
|
+
input_source = mindee_client.source_from_path('/path/to/the/file.ext')
|
|
18
|
+
|
|
19
|
+
# Parse the file
|
|
20
|
+
result = mindee_client.parse(
|
|
21
|
+
input_source,
|
|
22
|
+
Mindee::Product::Cropper::CropperV1
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Print a full summary of the parsed data in RST format
|
|
26
|
+
puts result.document
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Output (RST):**
|
|
30
|
+
```rst
|
|
31
|
+
########
|
|
32
|
+
Document
|
|
33
|
+
########
|
|
34
|
+
:Mindee ID: 149ce775-8302-4798-8649-7eda9fb84a1a
|
|
35
|
+
:Filename: default_sample.jpg
|
|
36
|
+
|
|
37
|
+
Inference
|
|
38
|
+
#########
|
|
39
|
+
:Product: mindee/cropper v1.0
|
|
40
|
+
:Rotation applied: No
|
|
41
|
+
|
|
42
|
+
Prediction
|
|
43
|
+
==========
|
|
44
|
+
|
|
45
|
+
Page Predictions
|
|
46
|
+
================
|
|
47
|
+
|
|
48
|
+
Page 0
|
|
49
|
+
------
|
|
50
|
+
:Document Cropper: Polygon with 26 points.
|
|
51
|
+
Polygon with 25 points.
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
# Field Types
|
|
55
|
+
## Standard Fields
|
|
56
|
+
These fields are generic and used in several products.
|
|
57
|
+
|
|
58
|
+
### Basic Field
|
|
59
|
+
Each prediction object contains a set of fields that inherit from the generic `Field` class.
|
|
60
|
+
A typical `Field` object will have the following attributes:
|
|
61
|
+
|
|
62
|
+
* **value** (`String`, `Float`, `Integer`, `Boolean`): corresponds to the field value. Can be `nil` if no value was extracted.
|
|
63
|
+
* **confidence** (Float, nil): the confidence score of the field prediction.
|
|
64
|
+
* **bounding_box** (`Mindee::Geometry::Quadrilateral`, `nil`): contains exactly 4 relative vertices (points) coordinates of a right rectangle containing the field in the document.
|
|
65
|
+
* **polygon** (`Mindee::Geometry::Polygon`, `nil`): contains the relative vertices coordinates (`Point`) of a polygon containing the field in the image.
|
|
66
|
+
* **page_id** (`Integer`, `nil`): the ID of the page, is `nil` when at document-level.
|
|
67
|
+
* **reconstructed** (`Boolean`): indicates whether or not an object was reconstructed (not extracted as the API gave it).
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
Aside from the previous attributes, all basic fields have access to a `to_s` method that can be used to print their value as a string.
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
### Position Field
|
|
74
|
+
The position field `PositionField` does not implement all the basic `Field` attributes, only **bounding_box**, **polygon** and **page_id**. On top of these, it has access to:
|
|
75
|
+
|
|
76
|
+
* **rectangle** (`Mindee::Geometry::Quadrilateral`): a Polygon with four points that may be oriented (even beyond canvas).
|
|
77
|
+
* **quadrangle** (`Mindee::Geometry::Quadrilateral`): a free polygon made up of four points.
|
|
78
|
+
|
|
79
|
+
## Page-Level Fields
|
|
80
|
+
Some fields are constrained to the page level, and so will not be retrievable to through the document.
|
|
81
|
+
|
|
82
|
+
# Attributes
|
|
83
|
+
The following fields are extracted for Cropper V1:
|
|
84
|
+
|
|
85
|
+
## Document Cropper
|
|
86
|
+
[📄](#page-level-fields "This field is only present on individual pages.")**cropping** (Array<[PositionField](#position-field)>): List of documents found in the image.
|
|
87
|
+
|
|
88
|
+
```rb
|
|
89
|
+
for page in result.document.inference.pages do
|
|
90
|
+
for cropping_elem in page.prediction.cropping do
|
|
91
|
+
puts cropping_elem.polygon
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
# Questions?
|
|
97
|
+
[Join our Slack](https://join.slack.com/t/mindee-community/shared_invite/zt-1jv6nawjq-FDgFcF2T5CmMmRpl9LLptw)
|
data/docs/custom_v1.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Custom API Ruby
|
|
3
|
+
---
|
|
4
|
+
The Ruby OCR SDK supports [custom-built APIs](https://developers.mindee.com/docs/build-your-first-document-parsing-api).
|
|
5
|
+
If your document isn't covered by one of Mindee's Off-the-Shelf APIs, you can create your own API using the[API Builder](https://platform.mindee.com/api-builder).
|
|
6
|
+
|
|
7
|
+
# Quick-Start
|
|
8
|
+
|
|
9
|
+
```rb
|
|
10
|
+
require 'mindee'
|
|
11
|
+
|
|
12
|
+
# Init a new client
|
|
13
|
+
mindee_client = Mindee::Client.new(api_key: 'my-api-key')
|
|
14
|
+
|
|
15
|
+
# Load a file from disk
|
|
16
|
+
input_source = mindee_client.source_from_path('/path/to/the/file.ext')
|
|
17
|
+
|
|
18
|
+
# Initialize a custom endpoint for this product
|
|
19
|
+
custom_endpoint = mindee_client.create_endpoint(
|
|
20
|
+
account_name: 'my-account',
|
|
21
|
+
endpoint_name: 'my-endpoint'
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Parse the file
|
|
25
|
+
result = mindee_client.parse(
|
|
26
|
+
input_source,
|
|
27
|
+
Mindee::Product::Custom::CustomV1,
|
|
28
|
+
endpoint: custom_endpoint
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# Print a full summary of the parsed data in RST format
|
|
32
|
+
puts result.document
|
|
33
|
+
|
|
34
|
+
# Print the document-level parsed data
|
|
35
|
+
# puts result.document.inference.prediction
|
|
36
|
+
|
|
37
|
+
# Looping over all prediction values
|
|
38
|
+
result.document.inference.prediction.fields.each do |field_name, field_data|
|
|
39
|
+
puts field_name
|
|
40
|
+
puts field_data.values
|
|
41
|
+
puts field_data.to_s
|
|
42
|
+
end
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
# Custom Endpoints
|
|
46
|
+
|
|
47
|
+
You may have noticed in the previous step that in order to access a custom build, you will need to provide an account and an endpoint name at the very least.
|
|
48
|
+
|
|
49
|
+
Although it is optional, the version number should match the latest version of your build in most use-cases.
|
|
50
|
+
If it is not set, it will default to "1".
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# Field Types
|
|
54
|
+
|
|
55
|
+
## Custom Fields
|
|
56
|
+
|
|
57
|
+
### List Field
|
|
58
|
+
|
|
59
|
+
A `ListField` is a special type of custom list that implements the following:
|
|
60
|
+
|
|
61
|
+
* **confidence** (`Float`): the confidence score of the field prediction.
|
|
62
|
+
* **reconstructed** (`Boolean`): indicates whether or not an object was reconstructed (not extracted as the API gave it).
|
|
63
|
+
* **values** (`Array<`[ListFieldItem](#list-field-item)`>`): list of value fields
|
|
64
|
+
|
|
65
|
+
Since the inner contents can vary, the value isn't accessed through a property, but rather through the following functions:
|
|
66
|
+
* **contents_list()** (`[Array, Hash, String, nil]`): returns a list of values for each element.
|
|
67
|
+
* **contents_str(separator:' ')** (`String`): returns a list of concatenated values, with an optional **separator** `String` between them.
|
|
68
|
+
* **to_s()**: returns a string representation of all values, with an empty space between each of them.
|
|
69
|
+
|
|
70
|
+
#### List Field Item
|
|
71
|
+
|
|
72
|
+
Values of `ListField`s are stored in a `ListFieldItem` structure, which is implemented as follows:
|
|
73
|
+
* **content** (`String`): extracted content of the prediction
|
|
74
|
+
* **confidence** (`Float`): the confidence score of the prediction
|
|
75
|
+
* **bounding_box** (`Quadrilateral`): 4 relative vertices corrdinates of a rectangle containing the word in the document.
|
|
76
|
+
* **polygon** (`Polygon`): vertices of a polygon containing the word.
|
|
77
|
+
* **page_id** (`Integer`): the ID of the page, is `nil` when at document-level.
|
|
78
|
+
|
|
79
|
+
### Classification Field
|
|
80
|
+
|
|
81
|
+
A `ClassificationField` is a special type of custom classification that implements the following:
|
|
82
|
+
|
|
83
|
+
* **value** (`String`): the value of the classification. Corresponds to one of the values specified during training.
|
|
84
|
+
* **confidence** (`Float`): the confidence score of the field prediction.
|
|
85
|
+
* **to_s()**: returns a string representation of all values, with an empty space between each of them.
|
|
86
|
+
|
|
87
|
+
# Attributes
|
|
88
|
+
|
|
89
|
+
Custom builds always have access to at least two attributes:
|
|
90
|
+
|
|
91
|
+
## Fields
|
|
92
|
+
|
|
93
|
+
**fields** ({`String`=> [ListField](#list-field)}):
|
|
94
|
+
|
|
95
|
+
```rb
|
|
96
|
+
puts result.document.inference.prediction.fields[:my_field].value
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Classifications
|
|
100
|
+
|
|
101
|
+
**classifications** ({`String` => [ClassificationField](#classification-field)}): The purchase category among predefined classes.
|
|
102
|
+
|
|
103
|
+
```js
|
|
104
|
+
console.log(result.document.inference.prediction.classifications["my-classification"].to_s);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
# Questions?
|
|
108
|
+
|
|
109
|
+
[Join our Slack](https://join.slack.com/t/mindee-community/shared_invite/zt-1jv6nawjq-FDgFcF2T5CmMmRpl9LLptw)
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Receipt OCR Ruby
|
|
3
|
+
---
|
|
4
|
+
The Ruby OCR SDK supports the [Receipt API](https://platform.mindee.com/mindee/expense_receipts).
|
|
5
|
+
|
|
6
|
+
Using the [sample below](https://github.com/mindee/client-lib-test-data/blob/main/products/expense_receipts/default_sample.jpg), we are going to illustrate how to extract the data that we want using the OCR SDK.
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
# Quick-Start
|
|
10
|
+
```rb
|
|
11
|
+
require 'mindee'
|
|
12
|
+
|
|
13
|
+
# Init a new client
|
|
14
|
+
mindee_client = Mindee::Client.new(api_key: 'my-api-key')
|
|
15
|
+
|
|
16
|
+
# Load a file from disk
|
|
17
|
+
input_source = mindee_client.source_from_path('/path/to/the/file.ext')
|
|
18
|
+
|
|
19
|
+
# Parse the file
|
|
20
|
+
result = mindee_client.parse(
|
|
21
|
+
input_source,
|
|
22
|
+
Mindee::Product::Receipt::ReceiptV5
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Print a full summary of the parsed data in RST format
|
|
26
|
+
puts result.document
|
|
27
|
+
|
|
28
|
+
# Print the document-level parsed data
|
|
29
|
+
# puts result.document.inference.prediction
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Output (RST):**
|
|
33
|
+
```rst
|
|
34
|
+
########
|
|
35
|
+
Document
|
|
36
|
+
########
|
|
37
|
+
:Mindee ID: ce41e37a-65d8-4de1-b34b-1c92ab04b1ae
|
|
38
|
+
:Filename: default_sample.jpg
|
|
39
|
+
|
|
40
|
+
Inference
|
|
41
|
+
#########
|
|
42
|
+
:Product: mindee/expense_receipts v5.0
|
|
43
|
+
:Rotation applied: Yes
|
|
44
|
+
|
|
45
|
+
Prediction
|
|
46
|
+
==========
|
|
47
|
+
:Expense Locale: en-GB; en; GB; GBP;
|
|
48
|
+
:Purchase Category: food
|
|
49
|
+
:Purchase Subcategory: restaurant
|
|
50
|
+
:Document Type: EXPENSE RECEIPT
|
|
51
|
+
:Purchase Date: 2016-02-26
|
|
52
|
+
:Purchase Time: 15:20
|
|
53
|
+
:Total Amount: 10.20
|
|
54
|
+
:Total Net: 8.50
|
|
55
|
+
:Total Tax: 1.70
|
|
56
|
+
:Tip and Gratuity:
|
|
57
|
+
:Taxes:
|
|
58
|
+
+---------------+--------+----------+---------------+
|
|
59
|
+
| Base | Code | Rate (%) | Amount |
|
|
60
|
+
+===============+========+==========+===============+
|
|
61
|
+
| 8.50 | VAT | 20.00 | 1.70 |
|
|
62
|
+
+---------------+--------+----------+---------------+
|
|
63
|
+
:Supplier Name: CLACHAN
|
|
64
|
+
:Supplier Company Registrations: 232153895
|
|
65
|
+
232153895
|
|
66
|
+
:Supplier Address: 34 kingley street w1b 5qh
|
|
67
|
+
:Supplier Phone Number: 02074940834
|
|
68
|
+
:Line Items:
|
|
69
|
+
+--------------------------------------+----------+--------------+------------+
|
|
70
|
+
| Description | Quantity | Total Amount | Unit Price |
|
|
71
|
+
+======================================+==========+==============+============+
|
|
72
|
+
| Meantime Pale | 2.00 | 10.20 | |
|
|
73
|
+
+--------------------------------------+----------+--------------+------------+
|
|
74
|
+
|
|
75
|
+
Page Predictions
|
|
76
|
+
================
|
|
77
|
+
|
|
78
|
+
Page 0
|
|
79
|
+
------
|
|
80
|
+
:Expense Locale: en-GB; en; GB; GBP;
|
|
81
|
+
:Purchase Category: food
|
|
82
|
+
:Purchase Subcategory: restaurant
|
|
83
|
+
:Document Type: EXPENSE RECEIPT
|
|
84
|
+
:Purchase Date: 2016-02-26
|
|
85
|
+
:Purchase Time: 15:20
|
|
86
|
+
:Total Amount: 10.20
|
|
87
|
+
:Total Net: 8.50
|
|
88
|
+
:Total Tax: 1.70
|
|
89
|
+
:Tip and Gratuity:
|
|
90
|
+
:Taxes:
|
|
91
|
+
+---------------+--------+----------+---------------+
|
|
92
|
+
| Base | Code | Rate (%) | Amount |
|
|
93
|
+
+===============+========+==========+===============+
|
|
94
|
+
| 8.50 | VAT | 20.00 | 1.70 |
|
|
95
|
+
+---------------+--------+----------+---------------+
|
|
96
|
+
:Supplier Name: CLACHAN
|
|
97
|
+
:Supplier Company Registrations: 232153895
|
|
98
|
+
232153895
|
|
99
|
+
:Supplier Address: 34 kingley street w1b 5qh
|
|
100
|
+
:Supplier Phone Number: 02074940834
|
|
101
|
+
:Line Items:
|
|
102
|
+
+--------------------------------------+----------+--------------+------------+
|
|
103
|
+
| Description | Quantity | Total Amount | Unit Price |
|
|
104
|
+
+======================================+==========+==============+============+
|
|
105
|
+
| Meantime Pale | 2.00 | 10.20 | |
|
|
106
|
+
+--------------------------------------+----------+--------------+------------+
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
# Field Types
|
|
110
|
+
## Standard Fields
|
|
111
|
+
These fields are generic and used in several products.
|
|
112
|
+
|
|
113
|
+
### Basic Field
|
|
114
|
+
Each prediction object contains a set of fields that inherit from the generic `Field` class.
|
|
115
|
+
A typical `Field` object will have the following attributes:
|
|
116
|
+
|
|
117
|
+
* **value** (`String`, `Float`, `Integer`, `Boolean`): corresponds to the field value. Can be `nil` if no value was extracted.
|
|
118
|
+
* **confidence** (Float, nil): the confidence score of the field prediction.
|
|
119
|
+
* **bounding_box** (`Mindee::Geometry::Quadrilateral`, `nil`): contains exactly 4 relative vertices (points) coordinates of a right rectangle containing the field in the document.
|
|
120
|
+
* **polygon** (`Mindee::Geometry::Polygon`, `nil`): contains the relative vertices coordinates (`Point`) of a polygon containing the field in the image.
|
|
121
|
+
* **page_id** (`Integer`, `nil`): the ID of the page, is `nil` when at document-level.
|
|
122
|
+
* **reconstructed** (`Boolean`): indicates whether or not an object was reconstructed (not extracted as the API gave it).
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
Aside from the previous attributes, all basic fields have access to a `to_s` method that can be used to print their value as a string.
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
### Amount Field
|
|
129
|
+
The amount field `AmountField` only has one constraint: its **value** is a `Float` (or `nil`).
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
### Classification Field
|
|
133
|
+
The classification field `ClassificationField` does not implement all the basic `Field` attributes. It only implements **value**, **confidence** and **page_id**.
|
|
134
|
+
|
|
135
|
+
> Note: a classification field's `value is always a `String`.
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
### Company Registration Field
|
|
139
|
+
Aside from the basic `Field` attributes, the company registration field `CompanyRegistrationField` also implements the following:
|
|
140
|
+
|
|
141
|
+
* **type** (`String`): the type of company.
|
|
142
|
+
|
|
143
|
+
### Date Field
|
|
144
|
+
Aside from the basic `Field` attributes, the date field `DateField` also implements the following:
|
|
145
|
+
|
|
146
|
+
* **date_object** (`Date`): an accessible representation of the value as a JavaScript object.
|
|
147
|
+
|
|
148
|
+
### Locale Field
|
|
149
|
+
The locale field `LocaleField` only implements the **value**, **confidence** and **page_id** base `Field` attributes, but it comes with its own:
|
|
150
|
+
|
|
151
|
+
* **language** (`String`): ISO 639-1 language code (e.g.: `en` for English). Can be `nil`.
|
|
152
|
+
* **country** (`String`): ISO 3166-1 alpha-2 or ISO 3166-1 alpha-3 code for countries (e.g.: `GRB` or `GB` for "Great Britain"). Can be `nil`.
|
|
153
|
+
* **currency** (`String`): ISO 4217 code for currencies (e.g.: `USD` for "US Dollars"). Can be `nil`.
|
|
154
|
+
|
|
155
|
+
### String Field
|
|
156
|
+
The text field `StringField` only has one constraint: it's **value** is a `String` (or `nil`).
|
|
157
|
+
|
|
158
|
+
### Taxes Field
|
|
159
|
+
#### Tax
|
|
160
|
+
Aside from the basic `Field` attributes, the tax field `TaxField` also implements the following:
|
|
161
|
+
|
|
162
|
+
* **rate** (`Float`): the tax rate applied to an item can be expressed as a percentage. Can be `nil`.
|
|
163
|
+
* **code** (`String`): tax code (or equivalent, depending on the origin of the document). Can be `nil`.
|
|
164
|
+
* **base** (`Float`): base amount used for the tax. Can be `nil`.
|
|
165
|
+
|
|
166
|
+
> Note: currently `TaxField` is not used on its own, and is accessed through a parent `Taxes` object, an array-like structure.
|
|
167
|
+
|
|
168
|
+
#### Taxes (Array)
|
|
169
|
+
The `Taxes` field represents an array-like collection of `TaxField` objects. As it is the representation of several objects, it has access to a custom `to_s` method that can render a `TaxField` object as a table line.
|
|
170
|
+
|
|
171
|
+
## Specific Fields
|
|
172
|
+
Fields which are specific to this product; they are not used in any other product.
|
|
173
|
+
|
|
174
|
+
### Line Items Field
|
|
175
|
+
List of line item details.
|
|
176
|
+
|
|
177
|
+
A `ReceiptV5LineItem` implements the following attributes:
|
|
178
|
+
|
|
179
|
+
* `description` (String): The item description.
|
|
180
|
+
* `quantity` (Float): The item quantity.
|
|
181
|
+
* `total_amount` (Float): The item total amount.
|
|
182
|
+
* `unit_price` (Float): The item unit price.
|
|
183
|
+
|
|
184
|
+
# Attributes
|
|
185
|
+
The following fields are extracted for Receipt V5:
|
|
186
|
+
|
|
187
|
+
## Purchase Category
|
|
188
|
+
**category** ([ClassificationField](#classification-field)): The purchase category among predefined classes.
|
|
189
|
+
|
|
190
|
+
```rb
|
|
191
|
+
puts result.document.inference.prediction.category.value
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Purchase Date
|
|
195
|
+
**date** ([DateField](#date-field)): The date the purchase was made.
|
|
196
|
+
|
|
197
|
+
```rb
|
|
198
|
+
puts result.document.inference.prediction.date.value
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Document Type
|
|
202
|
+
**document_type** ([ClassificationField](#classification-field)): One of: 'CREDIT CARD RECEIPT', 'EXPENSE RECEIPT'.
|
|
203
|
+
|
|
204
|
+
```rb
|
|
205
|
+
puts result.document.inference.prediction.document_type.value
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Line Items
|
|
209
|
+
**line_items** (Array<[ReceiptV5LineItem](#line-items-field)>): List of line item details.
|
|
210
|
+
|
|
211
|
+
```rb
|
|
212
|
+
for line_items_elem in result.document.inference.prediction.line_items do
|
|
213
|
+
puts line_items_elem.value
|
|
214
|
+
end
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Expense Locale
|
|
218
|
+
**locale** ([LocaleField](#locale-field)): The locale detected on the document.
|
|
219
|
+
|
|
220
|
+
```rb
|
|
221
|
+
puts result.document.inference.prediction.locale.value
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Purchase Subcategory
|
|
225
|
+
**subcategory** ([ClassificationField](#classification-field)): The purchase subcategory among predefined classes for transport and food.
|
|
226
|
+
|
|
227
|
+
```rb
|
|
228
|
+
puts result.document.inference.prediction.subcategory.value
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Supplier Address
|
|
232
|
+
**supplier_address** ([StringField](#string-field)): The address of the supplier or merchant.
|
|
233
|
+
|
|
234
|
+
```rb
|
|
235
|
+
puts result.document.inference.prediction.supplier_address.value
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Supplier Company Registrations
|
|
239
|
+
**supplier_company_registrations** (Array<[CompanyRegistrationField](#company-registration-field)>): List of company registrations associated to the supplier.
|
|
240
|
+
|
|
241
|
+
```rb
|
|
242
|
+
for supplier_company_registrations_elem in result.document.inference.prediction.supplier_company_registrations do
|
|
243
|
+
puts supplier_company_registrations_elem.value
|
|
244
|
+
end
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Supplier Name
|
|
248
|
+
**supplier_name** ([StringField](#string-field)): The name of the supplier or merchant.
|
|
249
|
+
|
|
250
|
+
```rb
|
|
251
|
+
puts result.document.inference.prediction.supplier_name.value
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Supplier Phone Number
|
|
255
|
+
**supplier_phone_number** ([StringField](#string-field)): The phone number of the supplier or merchant.
|
|
256
|
+
|
|
257
|
+
```rb
|
|
258
|
+
puts result.document.inference.prediction.supplier_phone_number.value
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Taxes
|
|
262
|
+
**taxes** (Array<[TaxField](#taxes-field)>): List of tax lines information.
|
|
263
|
+
|
|
264
|
+
```rb
|
|
265
|
+
for taxes_elem in result.document.inference.prediction.taxes do
|
|
266
|
+
puts taxes_elem.to_s
|
|
267
|
+
end
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Purchase Time
|
|
271
|
+
**time** ([StringField](#string-field)): The time the purchase was made.
|
|
272
|
+
|
|
273
|
+
```rb
|
|
274
|
+
puts result.document.inference.prediction.time.value
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Tip and Gratuity
|
|
278
|
+
**tip** ([AmountField](#amount-field)): The total amount of tip and gratuity.
|
|
279
|
+
|
|
280
|
+
```rb
|
|
281
|
+
puts result.document.inference.prediction.tip.value
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Total Amount
|
|
285
|
+
**total_amount** ([AmountField](#amount-field)): The total amount paid: includes taxes, discounts, fees, tips, and gratuity.
|
|
286
|
+
|
|
287
|
+
```rb
|
|
288
|
+
puts result.document.inference.prediction.total_amount.value
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Total Net
|
|
292
|
+
**total_net** ([AmountField](#amount-field)): The net amount paid: does not include taxes, fees, and discounts.
|
|
293
|
+
|
|
294
|
+
```rb
|
|
295
|
+
puts result.document.inference.prediction.total_net.value
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Total Tax
|
|
299
|
+
**total_tax** ([AmountField](#amount-field)): The total amount of taxes.
|
|
300
|
+
|
|
301
|
+
```rb
|
|
302
|
+
puts result.document.inference.prediction.total_tax.value
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
# Questions?
|
|
306
|
+
[Join our Slack](https://join.slack.com/t/mindee-community/shared_invite/zt-1jv6nawjq-FDgFcF2T5CmMmRpl9LLptw)
|