diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py index c20ead661b69..c58ddf145717 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py @@ -61,6 +61,7 @@ AccountInfo, DocumentAnalysisError, DocumentAnalysisInnerError, + get_document_content_elements, ) from ._api_versions import FormRecognizerApiVersion, DocumentAnalysisApiVersion @@ -123,6 +124,7 @@ "AccountInfo", "DocumentAnalysisError", "DocumentAnalysisInnerError", + "get_document_content_elements", ] __VERSION__ = VERSION diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py index e5260d3414d4..8682fe6653ee 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py @@ -4039,3 +4039,38 @@ def from_dict(cls, data): innererror=DocumentAnalysisInnerError.from_dict(data.get("innererror")) # type: ignore if data.get("innererror") else None ) + + +class ElementNavigator(object): + """Provides element navigation methods.""" + + def get_document_content_elements(base_element, page, search_elements): + # type: (DocumentLine, DocumentPage, List[str]) -> List[Union[DocumentElement, DocumentWord, DocumentSelectionMark]] + result = [] + for elem in search_elements: + if elem == "words": + for word in page.words: + # performance wise this is not great since it runs through ALL the words every time even if the line is very short + for span in base_element.spans: + if word.span.offset >= span.offset and ( + word.span.offset + word.span.length + ) <= (span.offset + span.length): + result.append(word) + elif elem == "selection_marks": + for mark in page.selection_marks: + for span in base_element.spans: + if mark.span.offset >= span.offset and ( + mark.span.offset + mark.span.length + ) <= (span.offset + span.length): + result.append(mark) + return result + + def get_document_structure_elements(base_element, analyze_result, search_elements): + # type: (DocumentLine, AnalyzeResult, List[str]) -> List[Union[DocumentElement, DocumentWord, DocumentSelectionMark]] + # TODO implementation + return + + def get_styles(element, analyze_result): + # type: (Union[DocumentContentElement, DocumentStructureElement, DocumentPageElement], AnalyzeResult) -> List[DocumentStyle] + # TODO implementation + return \ No newline at end of file diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_document.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_document.py index 232bc6bbaf36..f307544f6a9b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_document.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_document.py @@ -7,7 +7,7 @@ import functools from azure.ai.formrecognizer._generated.models import AnalyzeResultOperation from azure.ai.formrecognizer import DocumentAnalysisClient -from azure.ai.formrecognizer import AnalyzeResult +from azure.ai.formrecognizer import AnalyzeResult, get_document_content_elements from preparers import FormRecognizerPreparer from testcase import FormRecognizerTest from preparers import GlobalClientPreparer as _GlobalClientPreparer @@ -18,6 +18,18 @@ class TestDocumentFromStream(FormRecognizerTest): + @FormRecognizerPreparer() + @DocumentAnalysisClientPreparer() + def test_document_line_get_words(self, client): + with open(self.selection_form_pdf, "rb") as fd: + document = fd.read() + + poller = client.begin_analyze_document("prebuilt-document", document) + result = poller.result() + + res = get_document_content_elements(result.pages[0].lines[13], result.pages[0], ["words", "selection_marks"]) + assert len(res) == 1 + @FormRecognizerPreparer() @DocumentAnalysisClientPreparer() def test_document_stream_transform_pdf(self, client):