| title | Receipt OCR Java |
|---|---|
| category | 622b805aaec68102ea7fcbc2 |
| slug | java-receipt-ocr |
| parentDoc | 631a062c3718850f3519b793 |
The Java OCR SDK supports the Receipt API.
Using the sample below, we are going to illustrate how to extract the data that we want using the OCR SDK.

import com.mindee.MindeeClient;
import com.mindee.input.LocalInputSource;
import com.mindee.parsing.common.PredictResponse;
import com.mindee.product.receipt.ReceiptV5;
import java.io.File;
import java.io.IOException;
public class SimpleMindeeClient {
public static void main(String[] args) throws IOException {
String apiKey = "my-api-key";
String filePath = "/path/to/the/file.ext";
// Init a new client
MindeeClient mindeeClient = new MindeeClient(apiKey);
// Load a file from disk
LocalInputSource inputSource = new LocalInputSource(filePath);
// Parse the file
PredictResponse<ReceiptV5> response = mindeeClient.parse(
ReceiptV5.class,
inputSource
);
// Print a summary of the response
System.out.println(response.toString());
// Print a summary of the predictions
// System.out.println(response.getDocument().toString());
// Print the document-level predictions
// System.out.println(response.getDocument().getInference().getPrediction().toString());
// Print the page-level predictions
// response.getDocument().getInference().getPages().forEach(
// page -> System.out.println(page.toString())
// );
}
}You can also call this product asynchronously:
import com.mindee.MindeeClient;
import com.mindee.input.LocalInputSource;
import com.mindee.parsing.common.AsyncPredictResponse;
import com.mindee.product.receipt.ReceiptV5;
import java.io.File;
import java.io.IOException;
public class SimpleMindeeClient {
public static void main(String[] args) throws IOException, InterruptedException {
String apiKey = "my-api-key";
String filePath = "/path/to/the/file.ext";
// Init a new client
MindeeClient mindeeClient = new MindeeClient(apiKey);
// Load a file from disk
LocalInputSource inputSource = new LocalInputSource(new File(filePath));
// Parse the file asynchronously
AsyncPredictResponse<ReceiptV5> response = mindeeClient.enqueueAndParse(
ReceiptV5.class,
inputSource
);
// Print a summary of the response
System.out.println(response.toString());
// Print a summary of the predictions
// System.out.println(response.getDocumentObj().toString());
// Print the document-level predictions
// System.out.println(response.getDocumentObj().getInference().getPrediction().toString());
// Print the page-level predictions
// response.getDocumentObj().getInference().getPages().forEach(
// page -> System.out.println(page.toString())
// );
}
}Output (RST):
########
Document
########
:Mindee ID: d96fb043-8fb8-4adc-820c-387aae83376d
:Filename: default_sample.jpg
Inference
#########
:Product: mindee/expense_receipts v5.3
:Rotation applied: Yes
Prediction
==========
:Expense Locale: en-GB; en; GB; GBP;
:Purchase Category: food
:Purchase Subcategory: restaurant
:Document Type: EXPENSE RECEIPT
:Purchase Date: 2016-02-26
:Purchase Time: 15:20
:Total Amount: 10.20
:Total Net: 8.50
:Total Tax: 1.70
:Tip and Gratuity:
:Taxes:
+---------------+--------+----------+---------------+
| Base | Code | Rate (%) | Amount |
+===============+========+==========+===============+
| 8.50 | VAT | 20.00 | 1.70 |
+---------------+--------+----------+---------------+
:Supplier Name: Clachan
:Supplier Company Registrations: Type: VAT NUMBER, Value: 232153895
Type: VAT NUMBER, Value: 232153895
:Supplier Address: 34 Kingley Street W1B 50H
:Supplier Phone Number: 02074940834
:Receipt Number: 54/7500
:Line Items:
+--------------------------------------+----------+--------------+------------+
| Description | Quantity | Total Amount | Unit Price |
+======================================+==========+==============+============+
| Meantime Pale | 2.00 | 10.20 | |
+--------------------------------------+----------+--------------+------------+
Page Predictions
================
Page 0
------
:Expense Locale: en-GB; en; GB; GBP;
:Purchase Category: food
:Purchase Subcategory: restaurant
:Document Type: EXPENSE RECEIPT
:Purchase Date: 2016-02-26
:Purchase Time: 15:20
:Total Amount: 10.20
:Total Net: 8.50
:Total Tax: 1.70
:Tip and Gratuity:
:Taxes:
+---------------+--------+----------+---------------+
| Base | Code | Rate (%) | Amount |
+===============+========+==========+===============+
| 8.50 | VAT | 20.00 | 1.70 |
+---------------+--------+----------+---------------+
:Supplier Name: Clachan
:Supplier Company Registrations: Type: VAT NUMBER, Value: 232153895
Type: VAT NUMBER, Value: 232153895
:Supplier Address: 34 Kingley Street W1B 50H
:Supplier Phone Number: 02074940834
:Receipt Number: 54/7500
:Line Items:
+--------------------------------------+----------+--------------+------------+
| Description | Quantity | Total Amount | Unit Price |
+======================================+==========+==============+============+
| Meantime Pale | 2.00 | 10.20 | |
+--------------------------------------+----------+--------------+------------+These fields are generic and used in several products.
Each prediction object contains a set of fields that inherit from the generic BaseField class.
A typical BaseField object will have the following attributes:
- confidence (
Double): the confidence score of the field prediction. - boundingBox (
Polygon): contains exactly 4 relative vertices (points) coordinates of a right rectangle containing the field in the document. - polygon (
Polygon): contains the relative vertices coordinates (polygonextendsList<Point>) of a polygon containing the field in the image. - pageId (
Integer): the ID of the page, alwaysnullwhen at document-level.
Note: A
Pointsimply refers to a List ofDouble.
Aside from the previous attributes, all basic fields have access to a custom toString method that can be used to print their value as a string.
An amount field AmountField extends BaseField, but also implements:
- value (
Double): corresponds to the field value. Can benullif no value was extracted.
The classification field ClassificationField extends BaseField, but also implements:
- value (
strong): corresponds to the field value. - confidence (
double): the confidence score of the field prediction.
Note: a classification field's
value is always aString`.
Aside from the basic BaseField attributes, the company registration field CompanyRegistrationField also implements the following:
- type (
String): the type of company. - value (
String): corresponds to the field value. - toTableLine(): a method that formats the data to fit in a .rst display.
The text field StringField extends BaseField, but also implements:
- value (
String): corresponds to the field value. - rawValue (
String): corresponds to the raw value as it appears on the document.
The date field DateField extends BaseField, but also implements:
- value (
LocalDate): an accessible representation of the value as a Java object. Can benull.
The locale field LocaleField extends BaseField, but also implements:
- value (
LocalDate): an accessible representation of the value as a Java object. Can benull. - language (
String): ISO 639-1 language code (e.g.:enfor English). Can benull. - country (
String): ISO 3166-1 alpha-2 or ISO 3166-1 alpha-3 code for countries (e.g.:GRBorGBfor "Great Britain"). Can benull. - currency (
String): ISO 4217 code for currencies (e.g.:USDfor "US Dollars"). Can benull.
Aside from the basic BaseField attributes, the tax field TaxField also implements the following:
- rate (
Double): the tax rate applied to an item expressed as a percentage. Can benull. - code (
String): tax code (or equivalent, depending on the origin of the document). - base (
Double): base amount used for the tax. Can benull. - value (
Double): the value of the tax. Can benull.
Note: currently
TaxFieldis not used on its own, and is accessed through a parentTaxesobject, a list-like structure.
The Taxes field represents a List of TaxField objects. As it is the representation of several objects, it has access to a custom toString method that can render a TaxField object as a table line.
Fields which are specific to this product; they are not used in any other product.
List of all line items on the receipt.
A ReceiptV5LineItem implements the following attributes:
- description (
String): The item description. - quantity (
Double): The item quantity. - totalAmount (
Double): The item total amount. - unitPrice (
Double): The item unit price.
The following fields are extracted for Receipt V5:
category: The purchase category of the receipt.
- 'toll'
- 'food'
- 'parking'
- 'transport'
- 'accommodation'
- 'gasoline'
- 'telecom'
- 'miscellaneous'
System.out.println(result.getDocument().getInference().getPrediction().getCategory().value);date: The date the purchase was made.
System.out.println(result.getDocument().getInference().getPrediction().getDate().value);documentType: The type of receipt: EXPENSE RECEIPT or CREDIT CARD RECEIPT.
- 'EXPENSE RECEIPT'
- 'CREDIT CARD RECEIPT'
System.out.println(result.getDocument().getInference().getPrediction().getDocumentType().value);lineItems(List<ReceiptV5LineItem>): List of all line items on the receipt.
for (lineItemsElem : result.getDocument().getInference().getPrediction().getLineItems())
{
System.out.println(lineItemsElem.value);
}locale: The locale of the document.
System.out.println(result.getDocument().getInference().getPrediction().getLocale().value);receiptNumber: The receipt number or identifier.
System.out.println(result.getDocument().getInference().getPrediction().getReceiptNumber().value);subcategory: The purchase subcategory of the receipt for transport and food.
- 'plane'
- 'taxi'
- 'train'
- 'restaurant'
- 'shopping'
- null
System.out.println(result.getDocument().getInference().getPrediction().getSubcategory().value);supplierAddress: The address of the supplier or merchant.
System.out.println(result.getDocument().getInference().getPrediction().getSupplierAddress().value);supplierCompanyRegistrations: List of company registration numbers associated to the supplier.
for (supplierCompanyRegistrationsElem : result.getDocument().getInference().getPrediction().getSupplierCompanyRegistrations())
{
System.out.println(supplierCompanyRegistrationsElem.value);
}supplierName: The name of the supplier or merchant.
System.out.println(result.getDocument().getInference().getPrediction().getSupplierName().value);supplierPhoneNumber: The phone number of the supplier or merchant.
System.out.println(result.getDocument().getInference().getPrediction().getSupplierPhoneNumber().value);taxes: The list of taxes present on the receipt.
for (taxesElem : result.getDocument().getInference().getPrediction().getTaxes())
{
System.out.println(taxesElem.value);
}time: The time the purchase was made.
System.out.println(result.getDocument().getInference().getPrediction().getTime().value);tip: The total amount of tip and gratuity.
System.out.println(result.getDocument().getInference().getPrediction().getTip().value);totalAmount: The total amount paid: includes taxes, discounts, fees, tips, and gratuity.
System.out.println(result.getDocument().getInference().getPrediction().getTotalAmount().value);totalNet: The net amount paid: does not include taxes, fees, and discounts.
System.out.println(result.getDocument().getInference().getPrediction().getTotalNet().value);totalTax: The sum of all taxes.
System.out.println(result.getDocument().getInference().getPrediction().getTotalTax().value);