Files
ds_erp_ai/ocr.py
T
2024-08-07 17:50:40 +01:00

89 lines
2.8 KiB
Python

from flask_restx import Namespace, Resource, fields
from flask import request, jsonify, current_app as app, send_file
from ...services.ocr import OCRService
from ...utils.decorators.auth import protected_route
from .models.errors import error_404, error_500
from .models.response import response
import json
import os
import numpy as np
from werkzeug.datastructures import FileStorage
api = Namespace('OCR',
description='Description',
path='/v2/api/tools/ocr')
upload_parser = api.parser()
upload_parser.add_argument('file', location='files',
type=FileStorage, required=True)
# OCR Data Model
ocr_model = api.model('OCR', {
'format': fields.String(required=True),
'data': fields.String(required=False),
})
success_response = api.clone('OCR Model Response', response, {
'model': fields.Nested(ocr_model)
})
@api.route('')
@api.doc(security='apikey')
class OCRResource(Resource):
@api.doc('get_text')
@api.expect(upload_parser)
@protected_route
def post(self):
output_format = request.get_json().get('format')
if not output_format:
output_format = 'txt'
args = upload_parser.parse_args()
try:
if 'file' not in args:
raise ValueError("Invalid file")
file = args['file']
if file.filename == '':
raise ValueError("Invalid file")
if file:
# Save the uploaded file to the UPLOAD_FOLDER
filename = os.path.join(file.filename)
file.save(filename)
ocr_service = OCRService(image_directory='',
export_directory=os.path.join(app.config['UPLOAD_FOLDER']),
language='en')
output_format = 'text'
result = ocr_service.read_text(filename, output_format=output_format)
if output_format == 'text':
txt_file, message = result
if txt_file:
return send_file(os.path.join("..",'..','..', txt_file), mimetype='text/plain', as_attachment=True, download_name=txt_file)
else:
return jsonify(error=message)
elif output_format == 'json':
json_data, message = result
if json_data:
result_json = json.dumps(json_data, default=np_encoder)
return {'model': {
'format': output_format,
'data': result_json
}}
api.abort(code=500, message="Invalid Format", error=True)
except Exception as e:
api.abort(code=500, message="Something went wrong", error=True)
def np_encoder(object):
if isinstance(object, np.generic):
return object.item()