Выпуски общедоступной предварительной версии Document Intelligence предоставляют ранний доступ к функциям, которые находятся в активной разработке. Функции, подходы и процессы могут изменяться до общедоступной доступности на основе отзывов пользователей.
Общедоступная предварительная версия клиентских библиотек Аналитики документов по умолчанию использует REST API версии 2024-07-31-preview.
Общедоступная предварительная версия 2024-07-31-preview в настоящее время доступна только в следующих регионах Azure. Обратите внимание, что пользовательская модель создания (извлечение полей документов) в AI Studio доступна только в регионе "Северная часть США":
Восточная часть США
Западная часть США2
Западная Европа
Северная часть США
Это содержимое относится к: версии 4.0 (предварительная версия) | Предыдущие версии: v3.1 (GA)
Возможности надстройки доступны во всех моделях, кроме модели визитной карточки.
Возможности
Аналитика документов поддерживает более сложные и модульные возможности анализа. Используйте функции надстройки, чтобы расширить результаты, чтобы включить дополнительные функции, извлеченные из документов. Некоторые функции надстройки требуют дополнительных затрат. Эти необязательные функции можно включить и отключить в зависимости от сценария извлечения документов. Чтобы включить функцию, добавьте связанное имя функции в features свойство строки запроса. Вы можете включить несколько функций надстройки по запросу, предоставив разделенный запятыми список функций. Следующие возможности надстройки доступны для 2023-07-31 (GA) и более поздних выпусков.
Не все возможности надстройки поддерживаются всеми моделями. Дополнительные сведения см. в статьеоб извлечении данных модели.
Возможности надстройки в настоящее время не поддерживаются для типов файлов Microsoft Office.
Аналитика документов поддерживает дополнительные функции, которые можно включить и отключить в зависимости от сценария извлечения документов. Для и более поздних выпусков доступны 2023-10-31-previewследующие возможности надстройки:
Реализация полей запроса в API предварительной версии 2023-10-30 отличается от последнего предварительного выпуска. Новая реализация является менее дорогой и хорошо работает с структурированными документами.
✱ Надстройка — поля запросов отличаются от других функций надстройки. Подробные сведения см. в разделе Цены.
Поддерживаемые типы файлов
PDF
Изображения: JPEG/JPG, , BMP, TIFFPNGHEIF
✱ Файлы Microsoft Office в настоящее время не поддерживаются.
Извлечение высокого разрешения
Задача распознавания небольшого текста из документов большого размера, таких как инженерные рисунки, является проблемой. Часто текст смешан с другими графическими элементами и имеет различные шрифты, размеры и ориентации. Кроме того, текст можно разбить на отдельные части или подключиться к другим символам. Аналитика документов теперь поддерживает извлечение содержимого из этих типов документов с ocr.highResolution возможностью. Вы получаете улучшенное качество извлечения содержимого из документов A1/A2/A3, включив эту возможность надстройки.
# Analyze a document at a URL:
formUrl = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/add-on-highres.png?raw=true"
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout",
AnalyzeDocumentRequest(url_source=formUrl),
features=[DocumentAnalysisFeature.OCR_HIGH_RESOLUTION], # Specify which add-on capabilities to enable.
)
result: AnalyzeResult = poller.result()
# [START analyze_with_highres]
if result.styles and any([style.is_handwritten for style in result.styles]):
print("Document contains handwritten content")
else:
print("Document does not contain handwritten content")
for page in result.pages:
print(f"----Analyzing layout from page #{page.page_number}----")
print(f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}")
if page.lines:
for line_idx, line in enumerate(page.lines):
words = get_words(page, line)
print(
f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
f"within bounding polygon '{line.polygon}'"
)
for word in words:
print(f"......Word '{word.content}' has a confidence of {word.confidence}")
if page.selection_marks:
for selection_mark in page.selection_marks:
print(
f"Selection mark is '{selection_mark.state}' within bounding polygon "
f"'{selection_mark.polygon}' and has a confidence of {selection_mark.confidence}"
)
if result.tables:
for table_idx, table in enumerate(result.tables):
print(f"Table # {table_idx} has {table.row_count} rows and " f"{table.column_count} columns")
if table.bounding_regions:
for region in table.bounding_regions:
print(f"Table # {table_idx} location on page: {region.page_number} is {region.polygon}")
for cell in table.cells:
print(f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'")
if cell.bounding_regions:
for region in cell.bounding_regions:
print(f"...content on page {region.page_number} is within bounding polygon '{region.polygon}'")
# Analyze a document at a URL:
url = "(https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/add-on-highres.png?raw=true"
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", document_url=url, features=[AnalysisFeature.OCR_HIGH_RESOLUTION] # Specify which add-on capabilities to enable.
)
result = poller.result()
# [START analyze_with_highres]
if any([style.is_handwritten for style in result.styles]):
print("Document contains handwritten content")
else:
print("Document does not contain handwritten content")
for page in result.pages:
print(f"----Analyzing layout from page #{page.page_number}----")
print(
f"Page has width: {page.width} and height: {page.height}, measured with unit: {page.unit}"
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
f"...Line # {line_idx} has word count {len(words)} and text '{line.content}' "
f"within bounding polygon '{format_polygon(line.polygon)}'"
)
for word in words:
print(
f"......Word '{word.content}' has a confidence of {word.confidence}"
)
for selection_mark in page.selection_marks:
print(
f"Selection mark is '{selection_mark.state}' within bounding polygon "
f"'{format_polygon(selection_mark.polygon)}' and has a confidence of {selection_mark.confidence}"
)
for table_idx, table in enumerate(result.tables):
print(
f"Table # {table_idx} has {table.row_count} rows and "
f"{table.column_count} columns"
)
for region in table.bounding_regions:
print(
f"Table # {table_idx} location on page: {region.page_number} is {format_polygon(region.polygon)}"
)
for cell in table.cells:
print(
f"...Cell[{cell.row_index}][{cell.column_index}] has text '{cell.content}'"
)
for region in cell.bounding_regions:
print(
f"...content on page {region.page_number} is within bounding polygon '{format_polygon(region.polygon)}'"
)
Возможность ocr.formula извлекает все определенные формулы, такие как математические уравнения, в коллекции как formulas объект верхнего уровня в разделе content. Внутри contentобнаруженные формулы представлены как :formula:. Каждая запись в этой коллекции представляет формулу, которая включает тип формулы как inline или display, а также его представление LaTeX, как value и его polygon координаты. Изначально формулы отображаются в конце каждой страницы.
# Analyze a document at a URL:
formUrl = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/layout-formulas.png?raw=true"
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout",
AnalyzeDocumentRequest(url_source=formUrl),
features=[DocumentAnalysisFeature.FORMULAS], # Specify which add-on capabilities to enable
)
result: AnalyzeResult = poller.result()
# [START analyze_formulas]
for page in result.pages:
print(f"----Formulas detected from page #{page.page_number}----")
if page.formulas:
inline_formulas = [f for f in page.formulas if f.kind == "inline"]
display_formulas = [f for f in page.formulas if f.kind == "display"]
# To learn the detailed concept of "polygon" in the following content, visit: https://aka.ms/bounding-region
print(f"Detected {len(inline_formulas)} inline formulas.")
for formula_idx, formula in enumerate(inline_formulas):
print(f"- Inline #{formula_idx}: {formula.value}")
print(f" Confidence: {formula.confidence}")
print(f" Bounding regions: {formula.polygon}")
print(f"\nDetected {len(display_formulas)} display formulas.")
for formula_idx, formula in enumerate(display_formulas):
print(f"- Display #{formula_idx}: {formula.value}")
print(f" Confidence: {formula.confidence}")
print(f" Bounding regions: {formula.polygon}")
# Analyze a document at a URL:
url = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/layout-formulas.png?raw=true"
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", document_url=url, features=[AnalysisFeature.FORMULAS] # Specify which add-on capabilities to enable
)
result = poller.result()
# [START analyze_formulas]
for page in result.pages:
print(f"----Formulas detected from page #{page.page_number}----")
inline_formulas = [f for f in page.formulas if f.kind == "inline"]
display_formulas = [f for f in page.formulas if f.kind == "display"]
print(f"Detected {len(inline_formulas)} inline formulas.")
for formula_idx, formula in enumerate(inline_formulas):
print(f"- Inline #{formula_idx}: {formula.value}")
print(f" Confidence: {formula.confidence}")
print(f" Bounding regions: {format_polygon(formula.polygon)}")
print(f"\nDetected {len(display_formulas)} display formulas.")
for formula_idx, formula in enumerate(display_formulas):
print(f"- Display #{formula_idx}: {formula.value}")
print(f" Confidence: {formula.confidence}")
print(f" Bounding regions: {format_polygon(formula.polygon)}")
"content": ":formula:",
"pages": [
{
"pageNumber": 1,
"formulas": [
{
"kind": "inline",
"value": "\\frac { \\partial a } { \\partial b }",
"polygon": [...],
"span": {...},
"confidence": 0.99
},
{
"kind": "display",
"value": "y = a \\times b + a \\times c",
"polygon": [...],
"span": {...},
"confidence": 0.99
}
]
}
]
Извлечение свойств шрифта
Функция ocr.font извлекает все свойства шрифта текста, извлеченного в коллекции, styles как объект верхнего уровня в разделе content. Каждый объект стиля задает одно свойство шрифта, диапазон текста, к нему применяется и соответствующая оценка достоверности. Существующее свойство стиля расширяется с большим количеством свойств шрифта, таких как similarFontFamily шрифт текста, fontStyle для стилей, таких как курсив и обычный, полужирный или обычныйcolor, fontWeight для цвета текста и backgroundColor цвета ограничивающего текста поля.
# Analyze a document at a URL:
formUrl = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/receipt/receipt-with-tips.png?raw=true"
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout",
AnalyzeDocumentRequest(url_source=formUrl),
features=[DocumentAnalysisFeature.STYLE_FONT] # Specify which add-on capabilities to enable.
)
result: AnalyzeResult = poller.result()
# [START analyze_fonts]
# DocumentStyle has the following font related attributes:
similar_font_families = defaultdict(list) # e.g., 'Arial, sans-serif
font_styles = defaultdict(list) # e.g, 'italic'
font_weights = defaultdict(list) # e.g., 'bold'
font_colors = defaultdict(list) # in '#rrggbb' hexadecimal format
font_background_colors = defaultdict(list) # in '#rrggbb' hexadecimal format
if result.styles and any([style.is_handwritten for style in result.styles]):
print("Document contains handwritten content")
else:
print("Document does not contain handwritten content")
return
print("\n----Fonts styles detected in the document----")
# Iterate over the styles and group them by their font attributes.
for style in result.styles:
if style.similar_font_family:
similar_font_families[style.similar_font_family].append(style)
if style.font_style:
font_styles[style.font_style].append(style)
if style.font_weight:
font_weights[style.font_weight].append(style)
if style.color:
font_colors[style.color].append(style)
if style.background_color:
font_background_colors[style.background_color].append(style)
print(f"Detected {len(similar_font_families)} font families:")
for font_family, styles in similar_font_families.items():
print(f"- Font family: '{font_family}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_styles)} font styles:")
for font_style, styles in font_styles.items():
print(f"- Font style: '{font_style}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_weights)} font weights:")
for font_weight, styles in font_weights.items():
print(f"- Font weight: '{font_weight}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_colors)} font colors:")
for font_color, styles in font_colors.items():
print(f"- Font color: '{font_color}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_background_colors)} font background colors:")
for font_background_color, styles in font_background_colors.items():
print(f"- Font background color: '{font_background_color}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
# Analyze a document at a URL:
url = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/receipt/receipt-with-tips.png?raw=true"
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", document_url=url, features=[AnalysisFeature.STYLE_FONT] # Specify which add-on capabilities to enable.
)
result = poller.result()
# [START analyze_fonts]
# DocumentStyle has the following font related attributes:
similar_font_families = defaultdict(list) # e.g., 'Arial, sans-serif
font_styles = defaultdict(list) # e.g, 'italic'
font_weights = defaultdict(list) # e.g., 'bold'
font_colors = defaultdict(list) # in '#rrggbb' hexadecimal format
font_background_colors = defaultdict(list) # in '#rrggbb' hexadecimal format
if any([style.is_handwritten for style in result.styles]):
print("Document contains handwritten content")
else:
print("Document does not contain handwritten content")
print("\n----Fonts styles detected in the document----")
# Iterate over the styles and group them by their font attributes.
for style in result.styles:
if style.similar_font_family:
similar_font_families[style.similar_font_family].append(style)
if style.font_style:
font_styles[style.font_style].append(style)
if style.font_weight:
font_weights[style.font_weight].append(style)
if style.color:
font_colors[style.color].append(style)
if style.background_color:
font_background_colors[style.background_color].append(style)
print(f"Detected {len(similar_font_families)} font families:")
for font_family, styles in similar_font_families.items():
print(f"- Font family: '{font_family}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_styles)} font styles:")
for font_style, styles in font_styles.items():
print(f"- Font style: '{font_style}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_weights)} font weights:")
for font_weight, styles in font_weights.items():
print(f"- Font weight: '{font_weight}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_colors)} font colors:")
for font_color, styles in font_colors.items():
print(f"- Font color: '{font_color}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
print(f"\nDetected {len(font_background_colors)} font background colors:")
for font_background_color, styles in font_background_colors.items():
print(f"- Font background color: '{font_background_color}'")
print(f" Text: '{get_styled_text(styles, result.content)}'")
Функция ocr.barcode извлекает все определенные штрихкоды в barcodes коллекции как объект верхнего уровня в разделе content. Внутри , обнаруженные contentштрихкоды представлены как :barcode:. Каждая запись в этой коллекции представляет штрихкод и включает тип штрихкода как kind и внедренное содержимое штрихкода, как value и его polygon координаты. Изначально штрихкоды отображаются в конце каждой страницы. Жестко confidence закодирован для 1.
# Analyze a document at a URL:
url = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/add-on-barcodes.jpg?raw=true"
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", document_url=url, features=[AnalysisFeature.BARCODES] # Specify which add-on capabilities to enable.
)
result = poller.result()
# [START analyze_barcodes]
# Iterate over extracted barcodes on each page.
for page in result.pages:
print(f"----Barcodes detected from page #{page.page_number}----")
print(f"Detected {len(page.barcodes)} barcodes:")
for barcode_idx, barcode in enumerate(page.barcodes):
print(f"- Barcode #{barcode_idx}: {barcode.value}")
print(f" Kind: {barcode.kind}")
print(f" Confidence: {barcode.confidence}")
print(f" Bounding regions: {format_polygon(barcode.polygon)}")
languages Добавление функции в analyzeResult запрос прогнозирует обнаруженный первичный язык для каждой текстовой строки вместе с confidence коллекцией в languages разделе analyzeResult.
# Analyze a document at a URL:
formUrl = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/add-on-fonts_and_languages.png?raw=true"
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout",
AnalyzeDocumentRequest(url_source=formUrl),
features=[DocumentAnalysisFeature.LANGUAGES] # Specify which add-on capabilities to enable.
)
result: AnalyzeResult = poller.result()
# [START analyze_languages]
print("----Languages detected in the document----")
if result.languages:
print(f"Detected {len(result.languages)} languages:")
for lang_idx, lang in enumerate(result.languages):
print(f"- Language #{lang_idx}: locale '{lang.locale}'")
print(f" Confidence: {lang.confidence}")
print(
f" Text: '{','.join([result.content[span.offset : span.offset + span.length] for span in lang.spans])}'"
)
# Analyze a document at a URL:
url = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/add-on/add-on-fonts_and_languages.png?raw=true"
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", document_url=url, features=[AnalysisFeature.LANGUAGES] # Specify which add-on capabilities to enable.
)
result = poller.result()
# [START analyze_languages]
print("----Languages detected in the document----")
print(f"Detected {len(result.languages)} languages:")
for lang_idx, lang in enumerate(result.languages):
print(f"- Language #{lang_idx}: locale '{lang.locale}'")
print(f" Confidence: {lang.confidence}")
print(f" Text: '{','.join([result.content[span.offset : span.offset + span.length] for span in lang.spans])}'")
Возможность PDF с возможностью поиска позволяет преобразовать аналоговый PDF-файл( например, сканированный PDF-файл в PDF-файл с внедренным текстом). Внедренный текст позволяет выполнять поиск глубокого текста в извлеченных содержимом PDF путем перекладывания обнаруженных текстовых сущностей на вершину файлов изображений.
Внимание
В настоящее время возможность поиска PDF поддерживается только моделью prebuilt-readчтения OCR. При использовании этой функции укажите modelId значение as prebuilt-read, так как другие типы моделей возвращают ошибку для этой предварительной версии.
Доступный для поиска PDF-файл входит в модель 2024-07-31-preview prebuilt-read без затрат на использование общего использования PDF.
Использование PDF с возможностью поиска
Чтобы использовать pdf-файл, доступный POST для поиска, выполните запрос с помощью Analyze операции и укажите выходной формат следующим образом pdf:
POST /documentModels/prebuilt-read:analyze?output=pdf
{...}
202
Analyze После завершения операции выполните GET запрос на получение Analyze результатов операции.
После успешного завершения PDF-файл можно получить и скачать как application/pdf. Эта операция позволяет напрямую загружать внедренную текстовую форму PDF вместо JSON в кодировке Base64.
// Monitor the operation until completion.
GET /documentModels/prebuilt-read/analyzeResults/{resultId}
200
{...}
// Upon successful completion, retrieve the PDF as application/pdf.
GET /documentModels/prebuilt-read/analyzeResults/{resultId}/pdf
200 OK
Content-Type: application/pdf
Пары "Ключ-значение"
В более ранних версиях prebuilt-document API модель извлекла пары "ключ-значение" из форм и документов. При добавлении функции к предварительно созданному макету модель макета keyValuePairs теперь выдает те же результаты.
Пары "ключ-значение" — это отдельные фрагменты внутри документа, которые определяют метку или ключ и связанный с ними ответ или значение. В структурированной форме эти пары могут быть меткой и значением, которое пользователь указал для данного поля. В неструктурированном документе они могут быть датой подписания договора на основании текста в абзаце. Модель искусственного интеллекта предназначена для извлечения идентифицируемых ключей и значений на основе широкого спектра типов документов, форматов и структур.
Ключи также могут существовать в изоляции, когда модель обнаруживает, что ключ существует, но с ним не связано ни одно значение, или при обработке необязательных полей. Например, поле промежуточного имени можно оставить пустым в форме в некоторых экземплярах. Пары "ключ-значение" всегда представляют собой фрагменты текста, содержащиеся в документе. Для документов, в которых одно и то же значение описано разными способами, например клиент или пользователь, связанный ключ является клиентом или пользователем (в зависимости от контекста).
Поля запросов — это возможность расширения схемы, извлеченной из любой предварительно созданной модели, или определения определенного имени ключа при переменной имени ключа. Чтобы использовать поля запроса, задайте функции queryFields и укажите список имен полей с разделием запятыми в свойстве queryFields .
Аналитика документов теперь поддерживает извлечение полей запросов. При извлечении поля запроса можно добавлять поля в процесс извлечения с помощью запроса без необходимости в добавленном обучении.
Используйте поля запроса, если необходимо расширить схему предварительно созданной или пользовательской модели или извлечь несколько полей с выходными данными макета.
Поля запросов — это возможность надстройки уровня "Премиум". Для получения наилучших результатов определите поля, которые требуется извлечь с помощью имен полей верблюдьего регистра или Pascal для имен полей с несколькими словами.
Поля запросов поддерживают не более 20 полей на запрос. Если документ содержит значение для поля, возвращается поле и значение.
Этот выпуск имеет новую реализацию возможностей полей запроса, которая имеет более низкую цену, чем более ранняя реализация, и должна быть проверена.
Примечание.
Извлечение поля запросов Document Intelligence Studio в настоящее время доступно с ПОМОЩЬЮ API макетов и предварительно созданных моделей 2024-02-29-preview2023-10-31-preview и более поздних выпусков, кроме US tax моделей (W2, 1098s и 1099s).
Извлечение поля запроса
Для извлечения полей запроса укажите поля, которые необходимо извлечь, и аналитика документов анализирует документ соответствующим образом. Приведем пример:
Если вы обрабатываете контракт в Студии аналитики документов, используйте 2024-02-29-preview2023-10-31-preview следующие версии:
Вы можете передать список меток полей, например Party1, Party2, TermsOfUse, PaymentTermsи PaymentDateTermEndDate как часть analyze document запроса.
Аналитика документов может анализировать и извлекать данные поля и возвращать значения в структурированных выходных данных JSON.
В дополнение к полям запроса ответ включает текст, таблицы, метки выделения и другие соответствующие данные.
# Analyze a document at a URL:
formUrl = "https://github.com/Azure-Samples/document-intelligence-code-samples/blob/main/Data/invoice/simple-invoice.png?raw=true"
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout",
AnalyzeDocumentRequest(url_source=formUrl),
features=[DocumentAnalysisFeature.QUERY_FIELDS], # Specify which add-on capabilities to enable.
query_fields=["Address", "InvoiceNumber"], # Set the features and provide a comma-separated list of field names.
)
result: AnalyzeResult = poller.result()
print("Here are extra fields in result:\n")
if result.documents:
for doc in result.documents:
if doc.fields and doc.fields["Address"]:
print(f"Address: {doc.fields['Address'].value_string}")
if doc.fields and doc.fields["InvoiceNumber"]:
print(f"Invoice number: {doc.fields['InvoiceNumber'].value_string}")