Почему необработанные данные не принимают формат POSTMAN?

Это мой блок кода, в котором я создал API с помощью Flask и протестировал его на POSTMAN. utils.py

utils.py

import os
import base64
from urllib.parse import urlparse
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient

def get_client():
    endpoint = "endpoint"
    api_key = "apikey"
    client = DocumentIntelligenceClient(endpoint=endpoint,credential=AzureKeyCredential(api_key))
    return client

def is_file_or_url(input_string):
    if os.path.isfile(input_string):
        return 'file'
    elif urlparse(input_string).scheme in ['http', 'https']:
        return 'url'
    else:
        return 'unknown'

def load_file_as_base64(file_obj):
    # Read the contents of the file object
    data = file_obj.read()
    # Encode the data as base64
    base64_bytes = base64.b64encode(data)
    base64_string = base64_bytes.decode('utf-8')
    return base64_string

app.py

import os
from flask import Flask, request, jsonify
from pathlib import Path
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
from utils import get_client, load_file_as_base64

app = Flask(__name__)

@app.route('/extract_invoice', methods=['POST'])
def extract_invoice():
    # Get the file from the request
    file = request.files['file']

    # Create the 'temp' directory if it doesn't exist
    temp_dir = 'temp'
    if not os.path.exists(temp_dir):
        os.makedirs(temp_dir)

    # Save the file to disk
    file_path = os.path.join(temp_dir, file.filename)
    file.save(file_path)
    model_id = 'prebuilt-invoice'
    doc_source = Path(file_path)

    document_ai_client = get_client()

    with open(doc_source, 'rb') as file_obj:
        file_base64 = load_file_as_base64(file_obj)

    poller = document_ai_client.begin_analyze_document(
        model_id,
        {"base64Source": file_base64},
        locale = "en-US",
    )

    result = poller.result()

    # Clean up the temporary file
    os.remove(file_path)

    # Extract the invoice details
    invoice_details = []
    for document in result.documents:
        document_fields = document['fields']
        fields = document_fields.keys()

        invoice_detail = {}
        for field in fields:
            if field == 'Items':
                items_list = []
                items = document_fields[field]

                for item in items['valueArray']:
                    item_fields = item['valueObject']
                    item_dict = {}
                    for item_field in item_fields.keys():
                        value = item_fields[item_field].get('content', '')
                        item_dict[item_field] = value
                    items_list.append(item_dict)
                invoice_detail[field] = items_list
            else:
                value = document_fields[field].get('content', '')
                invoice_detail[field] = value

        invoice_details.append(invoice_detail)

    return jsonify(invoice_details)

if __name__ == '__main__':
    app.run(debug=True)

Я пробовал все варианты решения проблемы, но файл/его содержимое не принимается и выдается ошибка: «Неправильный формат, введите правильный формат для импорта». Кроме того, я также столкнулся со следующей проблемой: «Ошибка типа: невозможно использовать строковый шаблон для байтового объекта».

Эту ошибку я всегда получаю только для этого конкретного изображения.

Как воспроизвести, что данные неприемлемы?

Bench Vue 25.04.2024 13:35

на самом деле я создал API с функцией анализа документов для извлечения данных из файлов различных режимов (pdf, изображений и т. д.). когда я работал с этим в POSTMAN API. он дал мне несколько ошибок и внес некоторые изменения, которые дают мне новую ошибку «TypeError: невозможно использовать строковый шаблон для байтового объекта».

JaS 25.04.2024 14:29

Ваш вопрос включал только входные данные и результат ошибки, чего недостаточно для решения вашей проблемы. Предоставьте минимальный воспроизводимый пример кода вашего сервера API, чтобы помочь нам найти решение.

Bench Vue 25.04.2024 14:34

Похоже, я неправильно решаю проблему и из-за ограничения не могу ввести код. добавлю сразу.

JaS 25.04.2024 19:35

Я обновил два кода для выравнивания отступа, можете ли вы это подтвердить, теперь вам нужно показать, как вызвать конечную точку /extract_invoice с входными данными (тело x-www-form-urlencoded) и ошибкой.

Bench Vue 26.04.2024 14:28

спасибо за обновление кода. У меня есть входные данные (тело необработанных данных), и это все еще ошибка.

JaS 27.04.2024 18:00

Опять же, вам нужно показать URL-адрес, ключ/значение в кодировке x-www-form, ошибку при закрытии экрана Postman.

Bench Vue 27.04.2024 18:04

но в качестве входных данных у меня будут файлы PDF или изображения. Эти документы затем преобразуются в соответствующие строки bas64 с помощью функции load_file_as_base64.

JaS 27.04.2024 18:08

Ваш код Python — это снимок экрана почтальона сервера, это клиент, ваш снимок экрана — это просто ключевое значение, которое является именем файла PDF или изображения. Не содержимое изображения или PDF. Я буду указывать, о чем говорю.

Bench Vue 27.04.2024 18:12
i.sstatic.net/KJ26P.png это пример ключа/значения данных формы.
Bench Vue 27.04.2024 18:16

прямо сейчас запустил тот же код с телом в качестве данных RAW. он способен генерировать результаты для изображений и файлов PDF. Я не проверял это на других типах файлов. но я думаю, что это нужно что-то сделать с типом файла. Я запустил код на изображении, которое было нормального качества, и получил эту ошибку: 'KeyError KeyError: 'valueObject''. так что, похоже, ошибка не в коде, а в типе используемого файла. спасибо, Маннн

JaS 27.04.2024 21:43

какие данные необходимо добавить в тело необработанных данных? как мне добавить туда же данные?

JaS 28.04.2024 16:32

Можете ли вы зафиксировать данные формы почтальона и ошибку снимка экрана?

Bench Vue 28.04.2024 16:57

у меня есть соответствующее изображение и изображение ошибки, которые я также получаю. Я столкнулся с проблемой только для этого конкретного изображения.

JaS 29.04.2024 14:17

Спасибо, что именно ищу, хочу это увидеть. Я пробую, но это может занять время.

Bench Vue 29.04.2024 14:29

Я ответил на ваш вопрос, продемонстрировав, что текст можно извлечь из изображения и что при вызове его через Postman нет проблем, даже если он не может напрямую ответить на ваш конкретный вопрос.

Bench Vue 30.04.2024 02:12
Новые приложения с использованием ChatGPT
Новые приложения с использованием ChatGPT
Я собираюсь вернуться к теме, которую уже освещал ранее, - чатгпт.
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
2
16
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял, что ваша ошибка: Статус HTTP 500

Это означает, что document_ai_client.begin_analyze_document() имеет дефект при обработке.

это не проблема base64 декодирования или кодирования.

Я создал макет сервера декодирования изображений и извлек текст (ключ/значение)

Это не прямой адрес проблемы вашего сервера, но я хочу показать, что у вашего сервера есть проблема.

Обзор

Шаг 1. Конда demo_env окружающая среда

Скачайте и установите Anaconda3

Запуск командной строки Анаконды

Создайте demo_env и установите Python.

conda create --name demo_env python=3.8

Переключение demo_env среды

conda activate demo_env
pip install flask easyocr

Шаг 2 utility.py и app.py

Дерево файлов

utility.py

import easyocr
import re

def extract_invoice_details(image_path):
    reader = easyocr.Reader(['en'])
    result = reader.readtext(image_path)
    full_text = '\n'.join([detection[1] for detection in result])

    patterns = {
        'Amount': r'Amount\s*;\s*\$(\d+),(\d+)',
        'Application': r'Application:\s*(.*)',
        'AID': r'AID\s*:\s*(\w+)',
        'MiD': r'MiD:\s*(\d+)',
        'TID': r'TID:\s*(\d+)',
        'Date/Time': r'Date/T\s*ime;\s*(\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2})'
    }

    extracted_items = {}
    for key, pattern in patterns.items():
        match = re.search(pattern, full_text)
        if match:
            if key == 'Amount':
                extracted_items[key] = f"${match.group(1)}.{match.group(2)}"
            elif key == 'Date/Time':
                extracted_items[key] = match.group(1).replace(' ', '; ')
            else:
                extracted_items[key] = match.group(1)
    return extracted_items

app.py

import os
from flask import Flask, request, jsonify
from utility import extract_invoice_details

app = Flask(__name__)

@app.route('/extract_invoice', methods=['POST'])
def extract_invoice():
    # Get the file from the request
    file = request.files['file']

    # Create the 'temp' directory if it doesn't exist
    temp_dir = 'temp'
    if not os.path.exists(temp_dir):
        os.makedirs(temp_dir)

    # Save the file to disk
    file_path = os.path.join(temp_dir, file.filename)
    file.save(file_path)

    # Use the utility function to process the image
    invoice_details = extract_invoice_details(file_path)

    # Clean up the temporary file
    os.remove(file_path)

    return jsonify(invoice_details)

if __name__ == '__main__':
    app.run(debug=True)

subway.jpg

Ваше изображение для сохранения локально.

demo.py

import easyocr
reader = easyocr.Reader(['en'])  # 'en' is for English, you can add other languages as needed
result = reader.readtext('subway.jpg')
for detection in result:
    print(detection[1])  # Prints out extracted text

Шаг 3. Извлеките текст из subway.jpg

python demo.py

demo_v2.py

from utility import extract_invoice_details

def main():
    # Specify the path to the image file
    image_path = 'subway.jpg'
    
    # Call the function from utility.py to extract invoice details
    invoice_details = extract_invoice_details(image_path)
    
    # Print the extracted details
    print("Extracted Invoice Details:")
    for key, value in invoice_details.items():
        print(f"{key}: {value}")

if __name__ == '__main__':
    main()

Этот код извлекает только шесть ключей/значений.

Извлечение определенных данных с помощью регулярных выражений. Используя предопределенные регулярные выражения, сценарий ищет в агрегированном тексте определенные фрагменты информации, такие как сумма, приложение, AID, MiD, TID и дата/время. Перед возвратом некоторые из этих фрагментов форматируются для обеспечения единообразия и ясности.

Amount ; $12,36
Application: VISA CREDIT
AID : AO000000031010
MiD: 420429002208556
TID: 75467009
Date/T ime; 06/09/2021 12:54:29

И отрегулируйте две клавиши

Amount ; $12,36 ->  Amount: $12.36
Date/T ime; 06/09/2021 12:54:29  -> Date/Time: 06/09/2021; 12:54:29
python demo_v2.py

Шаг 4. Запустите Flask-сервер

python app.py

Шаг 5. Вызов API от Postman с помощью subway.jpg

URL-адрес

POST http://localhost:5000/extract_invoice

Тело Выберите данные формы

Ключ — file, значение — subway.jpg.

Нажмите кнопку Send

Тело ответа

{
    "AID": "AO000000031010",
    "Amount": "$12.36",
    "Application": "VISA CREDIT",
    "Date/Time": "06/09/2021; 12:54:29",
    "MiD": "420429002208556",
    "TID": "75467009"
}

Краткое содержание

Я считаю, что проблема связана с внутренней конфигурацией вашего сервера, а не с кодировкой base64 или Postman.

Нет проблем, надеюсь, это поможет решить вашу проблему. Можете ли вы принять и проголосовать за мой ответ?

Bench Vue 30.04.2024 16:03

Другие вопросы по теме

Кнопка отправить в почтальоне
Не удалось выполнить аутентификацию в почтальоне для перечисления таблиц в учетной записи хранения Azure
Использование REST API Azure AD Graph для сброса пароля пользователя (от имени)
Стандартные способы генерации токена-носителя для авторизации. — При отправке запроса на получение API списка хранилища BLOB-объектов Azure в почтальоне
РесурсНотФаунд || Указанный ресурс не существует. — При отправке запроса GET в Rest API «Список контейнеров» в Postman
Получение конкретного запроса на основе входных данных из файла данных
Не удалось загрузить DLL при импорте _rust: не удалось найти указанную процедуру
Проблема с вызовом putListingsItems Amazon SP-API: ошибка InvalidInput
Я не могу подключиться к экспресс-серверу Socket.io через почтальона
Извлеките токен доступа из запроса на публикацию и используйте его в другом запросе на публикацию в Postman