FormRecognizerClient Класс
FormRecognizerClient извлекает сведения из форм и изображений в структурированные данные. Это интерфейс, используемый для анализа с помощью предварительно созданных моделей (квитанций, визитных карточек, счетов, документов, удостоверений), распознавания содержимого и макета из форм и анализа пользовательских форм из обученных моделей. Он предоставляет различные методы на основе входных данных из URL-адреса и входных данных из потока.
Примечание
FormRecognizerClient следует использовать с версиями <API =v2.1.
Чтобы использовать API версий 2022-08-31 и более поздних версий, создайте экземпляр DocumentAnalysisClient.
- Наследование
-
azure.ai.formrecognizer._form_base_client.FormRecognizerClientBaseFormRecognizerClient
Конструктор
FormRecognizerClient(endpoint: str, credential: AzureKeyCredential | TokenCredential, **kwargs: Any)
Параметры
- endpoint
- str
Поддерживаемые конечные точки Cognitive Services (протокол и имя узла, например : https://westus2.api.cognitive.microsoft.com).
- credential
- AzureKeyCredential или TokenCredential
Учетные данные, необходимые клиенту для подключения к Azure. Это экземпляр AzureKeyCredential, если используется ключ API или учетные данные маркера из identity.
- api_version
- str или FormRecognizerApiVersion
Версия API службы, используемая для запросов. По умолчанию используется API версии 2.1. Установка более старой версии может привести к снижению совместимости функций. Чтобы использовать последнюю поддерживаемую версию и функции API, создайте экземпляр DocumentAnalysisClient.
Примеры
Создание FormRecognizerClient с конечной точкой и ключом API.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(endpoint, AzureKeyCredential(key))
Создание FormRecognizerClient с учетными данными маркера.
"""DefaultAzureCredential will use the values from these environment
variables: AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET
"""
from azure.ai.formrecognizer import FormRecognizerClient
from azure.identity import DefaultAzureCredential
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
credential = DefaultAzureCredential()
form_recognizer_client = FormRecognizerClient(endpoint, credential)
Методы
begin_recognize_business_cards |
Извлечение текста поля и семантических значений из заданного бизнес-карта. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp". Просмотрите поля, найденные в бизнес-карта здесь:https://aka.ms/formrecognizer/businesscardfields Новые возможности в версии 2.1: метод клиента begin_recognize_business_cards |
begin_recognize_business_cards_from_url |
Извлечение текста поля и семантических значений из заданного бизнес-карта. Входной документ должен быть расположением (URL-адресом) карта для анализа. Просмотрите поля, найденные в бизнес-карта здесь:https://aka.ms/formrecognizer/businesscardfields Новые возможности в версии 2.1: метод клиента begin_recognize_business_cards_from_url |
begin_recognize_content |
Извлечение текста и содержимого или сведений о макете из заданного документа. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp". Новые возможности версии 2.1. Страницы, язык и reading_order ключевое слово аргументы и поддержка содержимого image/bmp |
begin_recognize_content_from_url |
Извлекает текст и сведения о макете из заданного документа. Входной документ должен быть расположением (URL-адресом) анализируемого документа. Новые возможности версии 2.1. Страницы, язык и reading_order ключевое слово аргументы и поддержка содержимого image/bmp |
begin_recognize_custom_forms |
Анализ настраиваемой формы с помощью модели, обученной с метками или без нее. Анализируемая форма должна иметь тот же тип, что и формы, которые использовались для обучения модели. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp". |
begin_recognize_custom_forms_from_url |
Анализ настраиваемой формы с помощью модели, обученной с метками или без нее. Анализируемая форма должна иметь тот же тип, что и формы, которые использовались для обучения модели. Входной документ должен быть расположением (URL-адресом) анализируемого документа. |
begin_recognize_identity_documents |
Извлечение текста поля и семантических значений из заданного документа удостоверения. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp". Поля, найденные в документе удостоверения, см. здесь: https://aka.ms/formrecognizer/iddocumentfields Новые возможности в версии 2.1: метод клиента begin_recognize_identity_documents |
begin_recognize_identity_documents_from_url |
Извлечение текста поля и семантических значений из заданного документа удостоверения. Входной документ должен быть расположением (URL-адресом) документа удостоверения для анализа. Поля, найденные в документе удостоверения, см. здесь: https://aka.ms/formrecognizer/iddocumentfields Новые возможности в версии 2.1: метод клиента begin_recognize_identity_documents_from_url |
begin_recognize_invoices |
Извлечение текста поля и семантических значений из заданного счета. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp". Поля, найденные в счете, см. здесь: https://aka.ms/formrecognizer/invoicefields Новые возможности в версии 2.1: метод клиента begin_recognize_invoices |
begin_recognize_invoices_from_url |
Извлечение текста поля и семантических значений из заданного счета. Входной документ должен быть расположением (URL-адресом) анализируемого счета. Поля, найденные в карта счета, см. здесь:https://aka.ms/formrecognizer/invoicefields Новые возможности в версии 2.1: метод клиента begin_recognize_invoices_from_url |
begin_recognize_receipts |
Извлечение текста поля и семантических значений из указанного квитанции о продажах. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp". Поля, найденные в квитанции, см. здесь: https://aka.ms/formrecognizer/receiptfields Новые возможности в версии 2.1: языковой стандарт и страницы ключевое слово аргументы и поддержку содержимого image/bmp |
begin_recognize_receipts_from_url |
Извлечение текста поля и семантических значений из указанного квитанции о продажах. Входной документ должен быть расположением (URL-адресом) квитанции для анализа. Поля, найденные в квитанции, см. здесь: https://aka.ms/formrecognizer/receiptfields Новые возможности в версии 2.1: языковой стандарт и страницы ключевое слово аргументы и поддержку содержимого image/bmp |
close |
FormRecognizerClient Закройте сеанс. |
send_request |
Выполняет сетевой запрос, используя существующий конвейер клиента. URL-адрес запроса может быть относительно базового URL-адреса. Версия API службы, используемая для запроса, совпадает с версией API клиента, если не указано иное. Переопределение настроенной версии API клиента в относительном URL-адресе поддерживается в клиенте с API версии 2022-08-31 и более поздних версий. Переопределение в абсолютном URL-адресе, поддерживаемом на клиенте с любой версией API. Этот метод не вызывается, если ответ является ошибкой; Чтобы вызвать исключение, вызовите raise_for_status() для возвращенного объекта ответа. Дополнительные сведения об отправке пользовательских запросов с помощью этого метода см. в разделе https://aka.ms/azsdk/dpcodegen/python/send_request. |
begin_recognize_business_cards
Извлечение текста поля и семантических значений из заданного бизнес-карта. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp".
Просмотрите поля, найденные в бизнес-карта здесь:https://aka.ms/formrecognizer/businesscardfields
Новые возможности в версии 2.1: метод клиента begin_recognize_business_cards
begin_recognize_business_cards(business_card: bytes | IO[bytes], **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
Поток или байты файлов типа JPEG, PNG, PDF, TIFF или BMP.
- locale
- str
Языковой стандарт бизнес-карта. Поддерживаемые языковые стандарты: en-US, en-AU, en-CA, en-GB и en-IN.
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- content_type
- str или FormContentType
Тип содержимого текста, отправляемого в API. Тип содержимого обнаруживается автоматически, но его можно переопределить, передав этот ключевое слово аргумент. Дополнительные сведения см. в разделе FormContentType.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
Примеры
Распознавание визитных карточек из файла.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_forms, "rb") as f:
poller = form_recognizer_client.begin_recognize_business_cards(business_card=f, locale="en-US")
business_cards = poller.result()
for idx, business_card in enumerate(business_cards):
print("--------Recognizing business card #{}--------".format(idx+1))
contact_names = business_card.fields.get("ContactNames")
if contact_names:
for contact_name in contact_names.value:
print("Contact First Name: {} has confidence: {}".format(
contact_name.value["FirstName"].value, contact_name.value["FirstName"].confidence
))
print("Contact Last Name: {} has confidence: {}".format(
contact_name.value["LastName"].value, contact_name.value["LastName"].confidence
))
company_names = business_card.fields.get("CompanyNames")
if company_names:
for company_name in company_names.value:
print("Company Name: {} has confidence: {}".format(company_name.value, company_name.confidence))
departments = business_card.fields.get("Departments")
if departments:
for department in departments.value:
print("Department: {} has confidence: {}".format(department.value, department.confidence))
job_titles = business_card.fields.get("JobTitles")
if job_titles:
for job_title in job_titles.value:
print("Job Title: {} has confidence: {}".format(job_title.value, job_title.confidence))
emails = business_card.fields.get("Emails")
if emails:
for email in emails.value:
print("Email: {} has confidence: {}".format(email.value, email.confidence))
websites = business_card.fields.get("Websites")
if websites:
for website in websites.value:
print("Website: {} has confidence: {}".format(website.value, website.confidence))
addresses = business_card.fields.get("Addresses")
if addresses:
for address in addresses.value:
print("Address: {} has confidence: {}".format(address.value, address.confidence))
mobile_phones = business_card.fields.get("MobilePhones")
if mobile_phones:
for phone in mobile_phones.value:
print("Mobile phone number: {} has confidence: {}".format(phone.value, phone.confidence))
faxes = business_card.fields.get("Faxes")
if faxes:
for fax in faxes.value:
print("Fax number: {} has confidence: {}".format(fax.value, fax.confidence))
work_phones = business_card.fields.get("WorkPhones")
if work_phones:
for work_phone in work_phones.value:
print("Work phone number: {} has confidence: {}".format(work_phone.value, work_phone.confidence))
other_phones = business_card.fields.get("OtherPhones")
if other_phones:
for other_phone in other_phones.value:
print("Other phone number: {} has confidence: {}".format(other_phone.value, other_phone.confidence))
begin_recognize_business_cards_from_url
Извлечение текста поля и семантических значений из заданного бизнес-карта. Входной документ должен быть расположением (URL-адресом) карта для анализа.
Просмотрите поля, найденные в бизнес-карта здесь:https://aka.ms/formrecognizer/businesscardfields
Новые возможности в версии 2.1: метод клиента begin_recognize_business_cards_from_url
begin_recognize_business_cards_from_url(business_card_url: str, **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- business_card_url
- str
URL-адрес бизнес-карта для анализа. Входные данные должны быть допустимыми, закодированными URL-адресами одного из поддерживаемых форматов: JPEG, PNG, PDF, TIFF или BMP.
- locale
- str
Языковой стандарт бизнес-карта. Поддерживаемые языковые стандарты: en-US, en-AU, en-CA, en-GB и en-IN.
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
begin_recognize_content
Извлечение текста и содержимого или сведений о макете из заданного документа. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp".
Новые возможности версии 2.1. Страницы, язык и reading_order ключевое слово аргументы и поддержка содержимого image/bmp
begin_recognize_content(form: bytes | IO[bytes], **kwargs: Any) -> LROPoller[List[FormPage]]
Параметры
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- language
- str
Код языка BCP-47 текста в документе. Поддерживаемые коды языков см. здесь: https://docs.microsoft.com/azure/cognitive-services/form-recognizer/language-support. Содержимое поддерживает автоматическую идентификацию языка и многоязыковый документ, поэтому предоставляйте код языка только в том случае, если вы хотите принудительно обработать документированные документы как конкретный язык.
- reading_order
- str
Алгоритм порядка чтения для сортировки возвращаемых текстовых строк. Поддерживаются следующие заказы чтения: базовый (по умолчанию), естественный. Задайте "базовый" для сортировки линий слева направо и сверху вниз, хотя в некоторых случаях близкое расположение обрабатывается с более высоким приоритетом. Задайте "естественный", чтобы отсортировать линии, используя позиционные сведения, чтобы сохранить соседние линии вместе.
- content_type
- str или FormContentType
Тип содержимого текста, отправляемого в API. Тип содержимого обнаруживается автоматически, но его можно переопределить, передав этот ключевое слово аргумент. Дополнительные сведения см. в разделе FormContentType.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[FormPage].
Возвращаемый тип
Исключения
Примеры
Распознавание текста и содержимого и сведений о макете из формы.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(endpoint=endpoint, credential=AzureKeyCredential(key))
with open(path_to_sample_forms, "rb") as f:
poller = form_recognizer_client.begin_recognize_content(form=f)
form_pages = poller.result()
for idx, content in enumerate(form_pages):
print("----Recognizing content from page #{}----".format(idx+1))
print("Page has width: {} and height: {}, measured with unit: {}".format(
content.width,
content.height,
content.unit
))
for table_idx, table in enumerate(content.tables):
print("Table # {} has {} rows and {} columns".format(table_idx, table.row_count, table.column_count))
print("Table # {} location on page: {}".format(table_idx, format_bounding_box(table.bounding_box)))
for cell in table.cells:
print("...Cell[{}][{}] has text '{}' within bounding box '{}'".format(
cell.row_index,
cell.column_index,
cell.text,
format_bounding_box(cell.bounding_box)
))
for line_idx, line in enumerate(content.lines):
print("Line # {} has word count '{}' and text '{}' within bounding box '{}'".format(
line_idx,
len(line.words),
line.text,
format_bounding_box(line.bounding_box)
))
if line.appearance:
if line.appearance.style_name == "handwriting" and line.appearance.style_confidence > 0.8:
print("Text line '{}' is handwritten and might be a signature.".format(line.text))
for word in line.words:
print("...Word '{}' has a confidence of {}".format(word.text, word.confidence))
for selection_mark in content.selection_marks:
print("Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
selection_mark.state,
format_bounding_box(selection_mark.bounding_box),
selection_mark.confidence
))
print("----------------------------------------")
begin_recognize_content_from_url
Извлекает текст и сведения о макете из заданного документа. Входной документ должен быть расположением (URL-адресом) анализируемого документа.
Новые возможности версии 2.1. Страницы, язык и reading_order ключевое слово аргументы и поддержка содержимого image/bmp
begin_recognize_content_from_url(form_url: str, **kwargs: Any) -> LROPoller[List[FormPage]]
Параметры
- form_url
- str
URL-адрес формы для анализа. Входные данные должны быть допустимыми, закодированными URL-адресами одного из поддерживаемых форматов: JPEG, PNG, PDF, TIFF или BMP.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- language
- str
Код языка BCP-47 текста в документе. Поддерживаемые коды языков см. здесь: https://docs.microsoft.com/azure/cognitive-services/form-recognizer/language-support. Содержимое поддерживает автоматическую идентификацию языка и многоязыковый документ, поэтому предоставляйте код языка только в том случае, если вы хотите принудительно обработать документированные документы как конкретный язык.
- reading_order
- str
Алгоритм порядка чтения для сортировки возвращаемых текстовых строк. Поддерживаются следующие заказы чтения: базовый (по умолчанию), естественный. Задайте "базовый" для сортировки линий слева направо и сверху вниз, хотя в некоторых случаях близкое расположение обрабатывается с более высоким приоритетом. Задайте "естественный", чтобы отсортировать линии, используя позиционные сведения, чтобы сохранить соседние линии вместе.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[FormPage].
Возвращаемый тип
Исключения
begin_recognize_custom_forms
Анализ настраиваемой формы с помощью модели, обученной с метками или без нее. Анализируемая форма должна иметь тот же тип, что и формы, которые использовались для обучения модели. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp".
begin_recognize_custom_forms(model_id: str, form: bytes | IO[bytes], **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
- content_type
- str или FormContentType
Тип содержимого текста, отправляемого в API. Тип содержимого обнаруживается автоматически, но его можно переопределить, передав этот ключевое слово аргумент. Дополнительные сведения см. в разделе FormContentType.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
Примеры
Распознавание полей и значений из пользовательской формы.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
model_id = os.getenv("CUSTOM_TRAINED_MODEL_ID", custom_model_id)
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
# Make sure your form's type is included in the list of form types the custom model can recognize
with open(path_to_sample_forms, "rb") as f:
poller = form_recognizer_client.begin_recognize_custom_forms(
model_id=model_id, form=f, include_field_elements=True
)
forms = poller.result()
for idx, form in enumerate(forms):
print("--------Recognizing Form #{}--------".format(idx+1))
print("Form has type {}".format(form.form_type))
print("Form has form type confidence {}".format(form.form_type_confidence))
print("Form was analyzed with model with ID {}".format(form.model_id))
for name, field in form.fields.items():
# each field is of type FormField
# label_data is populated if you are using a model trained without labels,
# since the service needs to make predictions for labels if not explicitly given to it.
if field.label_data:
print("...Field '{}' has label '{}' with a confidence score of {}".format(
name,
field.label_data.text,
field.confidence
))
print("...Label '{}' has value '{}' with a confidence score of {}".format(
field.label_data.text if field.label_data else name, field.value, field.confidence
))
# iterate over tables, lines, and selection marks on each page
for page in form.pages:
for i, table in enumerate(page.tables):
print("\nTable {} on page {}".format(i+1, table.page_number))
for cell in table.cells:
print("...Cell[{}][{}] has text '{}' with confidence {}".format(
cell.row_index, cell.column_index, cell.text, cell.confidence
))
print("\nLines found on page {}".format(page.page_number))
for line in page.lines:
print("...Line '{}' is made up of the following words: ".format(line.text))
for word in line.words:
print("......Word '{}' has a confidence of {}".format(
word.text,
word.confidence
))
if page.selection_marks:
print("\nSelection marks found on page {}".format(page.page_number))
for selection_mark in page.selection_marks:
print("......Selection mark is '{}' and has a confidence of {}".format(
selection_mark.state,
selection_mark.confidence
))
print("-----------------------------------")
begin_recognize_custom_forms_from_url
Анализ настраиваемой формы с помощью модели, обученной с метками или без нее. Анализируемая форма должна иметь тот же тип, что и формы, которые использовались для обучения модели. Входной документ должен быть расположением (URL-адресом) анализируемого документа.
begin_recognize_custom_forms_from_url(model_id: str, form_url: str, **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- form_url
- str
URL-адрес формы для анализа. Входные данные должны быть допустимыми, закодированными URL-адресами одного из поддерживаемых форматов: JPEG, PNG, PDF, TIFF или BMP.
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
begin_recognize_identity_documents
Извлечение текста поля и семантических значений из заданного документа удостоверения. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp".
Поля, найденные в документе удостоверения, см. здесь: https://aka.ms/formrecognizer/iddocumentfields
Новые возможности в версии 2.1: метод клиента begin_recognize_identity_documents
begin_recognize_identity_documents(identity_document: bytes | IO[bytes], **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
Поток или байты файлов типа JPEG, PNG, PDF, TIFF или BMP.
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
- content_type
- str или FormContentType
Тип содержимого текста, отправляемого в API. Тип содержимого обнаруживается автоматически, но его можно переопределить, передав этот ключевое слово аргумент. Дополнительные сведения см. в разделе FormContentType.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
Примеры
Распознавание полей документа удостоверения.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_forms, "rb") as f:
poller = form_recognizer_client.begin_recognize_identity_documents(identity_document=f)
id_documents = poller.result()
for idx, id_document in enumerate(id_documents):
print("--------Recognizing ID document #{}--------".format(idx+1))
first_name = id_document.fields.get("FirstName")
if first_name:
print("First Name: {} has confidence: {}".format(first_name.value, first_name.confidence))
last_name = id_document.fields.get("LastName")
if last_name:
print("Last Name: {} has confidence: {}".format(last_name.value, last_name.confidence))
document_number = id_document.fields.get("DocumentNumber")
if document_number:
print("Document Number: {} has confidence: {}".format(document_number.value, document_number.confidence))
dob = id_document.fields.get("DateOfBirth")
if dob:
print("Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence))
doe = id_document.fields.get("DateOfExpiration")
if doe:
print("Date of Expiration: {} has confidence: {}".format(doe.value, doe.confidence))
sex = id_document.fields.get("Sex")
if sex:
print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
address = id_document.fields.get("Address")
if address:
print("Address: {} has confidence: {}".format(address.value, address.confidence))
country_region = id_document.fields.get("CountryRegion")
if country_region:
print("Country/Region: {} has confidence: {}".format(country_region.value, country_region.confidence))
region = id_document.fields.get("Region")
if region:
print("Region: {} has confidence: {}".format(region.value, region.confidence))
begin_recognize_identity_documents_from_url
Извлечение текста поля и семантических значений из заданного документа удостоверения. Входной документ должен быть расположением (URL-адресом) документа удостоверения для анализа.
Поля, найденные в документе удостоверения, см. здесь: https://aka.ms/formrecognizer/iddocumentfields
Новые возможности в версии 2.1: метод клиента begin_recognize_identity_documents_from_url
begin_recognize_identity_documents_from_url(identity_document_url: str, **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- identity_document_url
- str
URL-адрес документа удостоверения для анализа. Входные данные должны быть допустимыми, закодированными URL-адресами одного из поддерживаемых форматов: JPEG, PNG, PDF, TIFF или BMP.
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
begin_recognize_invoices
Извлечение текста поля и семантических значений из заданного счета. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp".
Поля, найденные в счете, см. здесь: https://aka.ms/formrecognizer/invoicefields
Новые возможности в версии 2.1: метод клиента begin_recognize_invoices
begin_recognize_invoices(invoice: bytes | IO[bytes], **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- locale
- str
Языковой стандарт счета. Поддерживаемые языковые стандарты: en-US
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- content_type
- str или FormContentType
Тип содержимого текста, отправляемого в API. Тип содержимого обнаруживается автоматически, но его можно переопределить, передав этот ключевое слово аргумент. Дополнительные сведения см. в разделе FormContentType.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
Примеры
Распознавание счетов из файла.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_forms, "rb") as f:
poller = form_recognizer_client.begin_recognize_invoices(invoice=f, locale="en-US")
invoices = poller.result()
for idx, invoice in enumerate(invoices):
print("--------Recognizing invoice #{}--------".format(idx+1))
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print("Vendor Name: {} has confidence: {}".format(vendor_name.value, vendor_name.confidence))
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print("Vendor Address: {} has confidence: {}".format(vendor_address.value, vendor_address.confidence))
vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
if vendor_address_recipient:
print("Vendor Address Recipient: {} has confidence: {}".format(vendor_address_recipient.value, vendor_address_recipient.confidence))
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print("Customer Name: {} has confidence: {}".format(customer_name.value, customer_name.confidence))
customer_id = invoice.fields.get("CustomerId")
if customer_id:
print("Customer Id: {} has confidence: {}".format(customer_id.value, customer_id.confidence))
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print("Customer Address: {} has confidence: {}".format(customer_address.value, customer_address.confidence))
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print("Customer Address Recipient: {} has confidence: {}".format(customer_address_recipient.value, customer_address_recipient.confidence))
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print("Invoice Id: {} has confidence: {}".format(invoice_id.value, invoice_id.confidence))
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print("Invoice Date: {} has confidence: {}".format(invoice_date.value, invoice_date.confidence))
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print("Invoice Total: {} has confidence: {}".format(invoice_total.value, invoice_total.confidence))
due_date = invoice.fields.get("DueDate")
if due_date:
print("Due Date: {} has confidence: {}".format(due_date.value, due_date.confidence))
purchase_order = invoice.fields.get("PurchaseOrder")
if purchase_order:
print("Purchase Order: {} has confidence: {}".format(purchase_order.value, purchase_order.confidence))
billing_address = invoice.fields.get("BillingAddress")
if billing_address:
print("Billing Address: {} has confidence: {}".format(billing_address.value, billing_address.confidence))
billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
if billing_address_recipient:
print("Billing Address Recipient: {} has confidence: {}".format(billing_address_recipient.value, billing_address_recipient.confidence))
shipping_address = invoice.fields.get("ShippingAddress")
if shipping_address:
print("Shipping Address: {} has confidence: {}".format(shipping_address.value, shipping_address.confidence))
shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
if shipping_address_recipient:
print("Shipping Address Recipient: {} has confidence: {}".format(shipping_address_recipient.value, shipping_address_recipient.confidence))
print("Invoice items:")
for idx, item in enumerate(invoice.fields.get("Items").value):
print("...Item #{}".format(idx+1))
item_description = item.value.get("Description")
if item_description:
print("......Description: {} has confidence: {}".format(item_description.value, item_description.confidence))
item_quantity = item.value.get("Quantity")
if item_quantity:
print("......Quantity: {} has confidence: {}".format(item_quantity.value, item_quantity.confidence))
unit = item.value.get("Unit")
if unit:
print("......Unit: {} has confidence: {}".format(unit.value, unit.confidence))
unit_price = item.value.get("UnitPrice")
if unit_price:
print("......Unit Price: {} has confidence: {}".format(unit_price.value, unit_price.confidence))
product_code = item.value.get("ProductCode")
if product_code:
print("......Product Code: {} has confidence: {}".format(product_code.value, product_code.confidence))
item_date = item.value.get("Date")
if item_date:
print("......Date: {} has confidence: {}".format(item_date.value, item_date.confidence))
tax = item.value.get("Tax")
if tax:
print("......Tax: {} has confidence: {}".format(tax.value, tax.confidence))
amount = item.value.get("Amount")
if amount:
print("......Amount: {} has confidence: {}".format(amount.value, amount.confidence))
subtotal = invoice.fields.get("SubTotal")
if subtotal:
print("Subtotal: {} has confidence: {}".format(subtotal.value, subtotal.confidence))
total_tax = invoice.fields.get("TotalTax")
if total_tax:
print("Total Tax: {} has confidence: {}".format(total_tax.value, total_tax.confidence))
previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
if previous_unpaid_balance:
print("Previous Unpaid Balance: {} has confidence: {}".format(previous_unpaid_balance.value, previous_unpaid_balance.confidence))
amount_due = invoice.fields.get("AmountDue")
if amount_due:
print("Amount Due: {} has confidence: {}".format(amount_due.value, amount_due.confidence))
service_start_date = invoice.fields.get("ServiceStartDate")
if service_start_date:
print("Service Start Date: {} has confidence: {}".format(service_start_date.value, service_start_date.confidence))
service_end_date = invoice.fields.get("ServiceEndDate")
if service_end_date:
print("Service End Date: {} has confidence: {}".format(service_end_date.value, service_end_date.confidence))
service_address = invoice.fields.get("ServiceAddress")
if service_address:
print("Service Address: {} has confidence: {}".format(service_address.value, service_address.confidence))
service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
if service_address_recipient:
print("Service Address Recipient: {} has confidence: {}".format(service_address_recipient.value, service_address_recipient.confidence))
remittance_address = invoice.fields.get("RemittanceAddress")
if remittance_address:
print("Remittance Address: {} has confidence: {}".format(remittance_address.value, remittance_address.confidence))
remittance_address_recipient = invoice.fields.get("RemittanceAddressRecipient")
if remittance_address_recipient:
print("Remittance Address Recipient: {} has confidence: {}".format(remittance_address_recipient.value, remittance_address_recipient.confidence))
begin_recognize_invoices_from_url
Извлечение текста поля и семантических значений из заданного счета. Входной документ должен быть расположением (URL-адресом) анализируемого счета.
Поля, найденные в карта счета, см. здесь:https://aka.ms/formrecognizer/invoicefields
Новые возможности в версии 2.1: метод клиента begin_recognize_invoices_from_url
begin_recognize_invoices_from_url(invoice_url: str, **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- invoice_url
- str
URL-адрес счета для анализа. Входные данные должны быть допустимыми, закодированными URL-адресами одного из поддерживаемых форматов: JPEG, PNG, PDF, TIFF или BMP.
- locale
- str
Языковой стандарт счета. Поддерживаемые языковые стандарты: en-US
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
begin_recognize_receipts
Извлечение текста поля и семантических значений из указанного квитанции о продажах. Входной документ должен иметь один из поддерживаемых типов контента : "application/pdf", "image/jpeg", "image/png", "image/tiff" или "image/bmp".
Поля, найденные в квитанции, см. здесь: https://aka.ms/formrecognizer/receiptfields
Новые возможности в версии 2.1: языковой стандарт и страницы ключевое слово аргументы и поддержку содержимого image/bmp
begin_recognize_receipts(receipt: bytes | IO[bytes], **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
- content_type
- str или FormContentType
Тип содержимого текста, отправляемого в API. Тип содержимого обнаруживается автоматически, но его можно переопределить, передав этот ключевое слово аргумент. Дополнительные сведения см. в разделе FormContentType.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
- locale
- str
Языковой стандарт квитанции. Поддерживаемые языковые стандарты: en-US, en-AU, en-CA, en-GB и en-IN.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
Примеры
Распознавание полей квитанций о продажах.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
with open(path_to_sample_forms, "rb") as f:
poller = form_recognizer_client.begin_recognize_receipts(receipt=f, locale="en-US")
receipts = poller.result()
for idx, receipt in enumerate(receipts):
print("--------Recognizing receipt #{}--------".format(idx+1))
receipt_type = receipt.fields.get("ReceiptType")
if receipt_type:
print("Receipt Type: {} has confidence: {}".format(receipt_type.value, receipt_type.confidence))
merchant_name = receipt.fields.get("MerchantName")
if merchant_name:
print("Merchant Name: {} has confidence: {}".format(merchant_name.value, merchant_name.confidence))
transaction_date = receipt.fields.get("TransactionDate")
if transaction_date:
print("Transaction Date: {} has confidence: {}".format(transaction_date.value, transaction_date.confidence))
if receipt.fields.get("Items"):
print("Receipt items:")
for idx, item in enumerate(receipt.fields.get("Items").value):
print("...Item #{}".format(idx+1))
item_name = item.value.get("Name")
if item_name:
print("......Item Name: {} has confidence: {}".format(item_name.value, item_name.confidence))
item_quantity = item.value.get("Quantity")
if item_quantity:
print("......Item Quantity: {} has confidence: {}".format(item_quantity.value, item_quantity.confidence))
item_price = item.value.get("Price")
if item_price:
print("......Individual Item Price: {} has confidence: {}".format(item_price.value, item_price.confidence))
item_total_price = item.value.get("TotalPrice")
if item_total_price:
print("......Total Item Price: {} has confidence: {}".format(item_total_price.value, item_total_price.confidence))
subtotal = receipt.fields.get("Subtotal")
if subtotal:
print("Subtotal: {} has confidence: {}".format(subtotal.value, subtotal.confidence))
tax = receipt.fields.get("Tax")
if tax:
print("Tax: {} has confidence: {}".format(tax.value, tax.confidence))
tip = receipt.fields.get("Tip")
if tip:
print("Tip: {} has confidence: {}".format(tip.value, tip.confidence))
total = receipt.fields.get("Total")
if total:
print("Total: {} has confidence: {}".format(total.value, total.confidence))
print("--------------------------------------")
begin_recognize_receipts_from_url
Извлечение текста поля и семантических значений из указанного квитанции о продажах. Входной документ должен быть расположением (URL-адресом) квитанции для анализа.
Поля, найденные в квитанции, см. здесь: https://aka.ms/formrecognizer/receiptfields
Новые возможности в версии 2.1: языковой стандарт и страницы ключевое слово аргументы и поддержку содержимого image/bmp
begin_recognize_receipts_from_url(receipt_url: str, **kwargs: Any) -> LROPoller[List[RecognizedForm]]
Параметры
- receipt_url
- str
URL-адрес квитанции для анализа. Входные данные должны быть допустимыми, закодированными URL-адресами одного из поддерживаемых форматов: JPEG, PNG, PDF, TIFF или BMP.
- include_field_elements
- bool
Указывает, следует ли включать все строки на страницу и элементы поля, такие как строки, слова и знаки выделения для каждого поля формы.
- continuation_token
- str
Маркер продолжения для перезапуска опроса из сохраненного состояния.
- locale
- str
Языковой стандарт квитанции. Поддерживаемые языковые стандарты: en-US, en-AU, en-CA, en-GB и en-IN.
Пользовательские номера страниц для многостраничных документов (PDF/TIFF). Введите номера страниц и (или) диапазоны страниц, которые вы хотите получить в результате. Для диапазона страниц используйте дефис, например pages=["1-3", "5-6"]. Разделите каждый номер страницы или диапазон с помощью запятой.
Возвращаемое значение
Экземпляр LROPoller. Вызовите метод result() для объекта опроса, чтобы вернуть список[RecognizedForm].
Возвращаемый тип
Исключения
Примеры
Распознавание полей квитанций о продажах по URL-адресу.
from azure.core.credentials import AzureKeyCredential
from azure.ai.formrecognizer import FormRecognizerClient
endpoint = os.environ["AZURE_FORM_RECOGNIZER_ENDPOINT"]
key = os.environ["AZURE_FORM_RECOGNIZER_KEY"]
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
url = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"
poller = form_recognizer_client.begin_recognize_receipts_from_url(receipt_url=url)
receipts = poller.result()
for idx, receipt in enumerate(receipts):
print("--------Recognizing receipt #{}--------".format(idx+1))
receipt_type = receipt.fields.get("ReceiptType")
if receipt_type:
print("Receipt Type: {} has confidence: {}".format(receipt_type.value, receipt_type.confidence))
merchant_name = receipt.fields.get("MerchantName")
if merchant_name:
print("Merchant Name: {} has confidence: {}".format(merchant_name.value, merchant_name.confidence))
transaction_date = receipt.fields.get("TransactionDate")
if transaction_date:
print("Transaction Date: {} has confidence: {}".format(transaction_date.value, transaction_date.confidence))
if receipt.fields.get("Items"):
print("Receipt items:")
for idx, item in enumerate(receipt.fields.get("Items").value):
print("...Item #{}".format(idx+1))
item_name = item.value.get("Name")
if item_name:
print("......Item Name: {} has confidence: {}".format(item_name.value, item_name.confidence))
item_quantity = item.value.get("Quantity")
if item_quantity:
print("......Item Quantity: {} has confidence: {}".format(item_quantity.value, item_quantity.confidence))
item_price = item.value.get("Price")
if item_price:
print("......Individual Item Price: {} has confidence: {}".format(item_price.value, item_price.confidence))
item_total_price = item.value.get("TotalPrice")
if item_total_price:
print("......Total Item Price: {} has confidence: {}".format(item_total_price.value, item_total_price.confidence))
subtotal = receipt.fields.get("Subtotal")
if subtotal:
print("Subtotal: {} has confidence: {}".format(subtotal.value, subtotal.confidence))
tax = receipt.fields.get("Tax")
if tax:
print("Tax: {} has confidence: {}".format(tax.value, tax.confidence))
tip = receipt.fields.get("Tip")
if tip:
print("Tip: {} has confidence: {}".format(tip.value, tip.confidence))
total = receipt.fields.get("Total")
if total:
print("Total: {} has confidence: {}".format(total.value, total.confidence))
print("--------------------------------------")
close
send_request
Выполняет сетевой запрос, используя существующий конвейер клиента.
URL-адрес запроса может быть относительно базового URL-адреса. Версия API службы, используемая для запроса, совпадает с версией API клиента, если не указано иное. Переопределение настроенной версии API клиента в относительном URL-адресе поддерживается в клиенте с API версии 2022-08-31 и более поздних версий. Переопределение в абсолютном URL-адресе, поддерживаемом на клиенте с любой версией API. Этот метод не вызывается, если ответ является ошибкой; Чтобы вызвать исключение, вызовите raise_for_status() для возвращенного объекта ответа. Дополнительные сведения об отправке пользовательских запросов с помощью этого метода см. в разделе https://aka.ms/azsdk/dpcodegen/python/send_request.
send_request(request: HttpRequest, *, stream: bool = False, **kwargs) -> HttpResponse
Параметры
- stream
- bool
Указывает, будут ли полезные данные ответа передаваться в потоковую передачу. Значение по умолчанию — False.
Возвращаемое значение
Ответ сетевого вызова. Не обрабатывает ошибки в ответе.
Возвращаемый тип
Исключения
Azure SDK for Python
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по