Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
- Azure Cognitive Services Form Recognizer ahora se llama Azure Inteligencia de Documentos en Foundry Tools.
- Algunas plataformas siguen esperando la actualización de cambio de nombre.
- Todas las menciones de Form Recognizer o inteligencia de documentos en nuestra documentación hacen referencia al mismo servicio Azure.
Este contenido se aplica a:
v4.0 (GA)Versiones anteriores:
v3.1 (GA)
v3.0 (GA)
- Comienza a utilizar la última versión estable más reciente de Azure Document Intelligence v4.0
2024-11-30(GA).
Este contenido se aplica a:
v3.1 (GA)Versiones anteriores:
v3.0
v2.1
- Comienza con Azure Form Recognizer versión de disponibilidad general más reciente (
2023-07-31).
Este contenido se aplica a:
v3.0 (GA)Versión más reciente:
v3.1
v2.1
- Introducción a Azure Form Recognizer versión de disponibilidad general heredada (
2022-08-31).
Azure Document Intelligence / Form Recognizer es un servicio de herramientas de Foundry basado en la nube que usa el aprendizaje automático para extraer pares clave-valor, texto, tablas y datos clave de los documentos.
Puede integrar fácilmente modelos de procesamiento de documentos en los flujos de trabajo y las aplicaciones mediante un SDK de lenguaje de programación o una llamada a la API REST.
Se recomienda usar el servicio gratuito mientras está aprendiendo la tecnología para este inicio rápido. Recuerde que el número de páginas gratuitas está limitado a 500 al mes.
Para más información sobre las características de API y las opciones de desarrollo, visite nuestra página de información general .
Biblioteca de cliente |Referencia de API | Paquete (NuGet) | Ejemplos | Versión de API REST compatible
En este inicio rápido, use las siguientes características para analizar y extraer datos y valores de formularios y documentos:
Modelo de diseño: analice y extraiga tablas, líneas, palabras y marcas de selección como botones de radio y casillas en documentos, sin necesidad de entrenar un modelo.
Modelo precompilado: analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo precompilado.
Requisitos previos
suscripción a Azure: Crear una gratuita.
La versión actual de IDE de Visual Studio.
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de servicio único o bien un recurso de multiservicio de Azure en el portal de Azure para obtener la clave y el punto de conexión.
Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.
Propina
Cree un recurso de Microsoft Foundry si planea acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Necesita un recurso de un solo servicio si piensa usar autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga su suscripción de Azure, cree un recurso servicio único o multiservicio de Azure, en el portal de Azure, para obtener su clave y punto de conexión.
Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.
Propina
Cree un recurso de Microsoft Foundry si planea acceder a varias herramientas de Foundry en un único punto de conexión o clave. Solo para acceso a Form Recognizer, cree un recurso de Form Recognizer. Necesita un recurso de un solo servicio si piensa usar autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a la API de Form Recognizer. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Inicie Visual Studio.
En la página de inicio, elija Crear un nuevo proyecto.
En la página Crear un nuevo proyecto, escriba la consola en el cuadro de búsqueda. Elija la plantilla Aplicación de consola y, a continuación, elija Siguiente.
- En la ventana de diálogo Configurar el nuevo proyecto, escriba
doc_intel_quickstarten el cuadro nombre del proyecto. A continuación, elija Siguiente.
- En la ventana de diálogo Configurar tu nuevo proyecto, escriba
form_recognizer_quickstarten el cuadro de nombre del proyecto. A continuación, elija Siguiente.
En la ventana del cuadro de diálogo Información adicional, seleccione .NET 8.0 (Soporte técnico a largo plazo) y, después, seleccione Crear.
Instalación de la biblioteca cliente con NuGet
Haga clic con el botón derecho en el proyecto de doc_intel_quickstart y seleccione Administrar paquetes NuGet... .
Seleccione la pestaña Browse y escriba Azure. IA. DocumentIntelligence.
Selecciona la
Include prereleasecasilla.
Elija una versión en el menú desplegable e instale el paquete en el proyecto.
Haga clic con el botón derecho en el proyecto de form_recognizer_quickstart y seleccione Administrar paquetes NuGet... .
Seleccione la pestaña Examinar y escriba Azure. IA. FormRecognizer. Seleccione la versión 4.1.0 en el menú desplegable.
Haga clic con el botón derecho en el proyecto de form_recognizer_quickstart y seleccione Administrar paquetes NuGet... .
Seleccione la pestaña Examinar y escriba Azure. IA. FormRecognizer. Seleccione la versión 4.0.0 en el menú desplegable.
Compilación de la aplicación
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentIntelligenceClient clase . Para ello, cree un AzureKeyCredential con su key desde el portal de Azure y una instancia DocumentIntelligenceClient de AzureKeyCredential y su Inteligencia de Documentos endpoint.
Para interactuar con el servicio Form Recognizer, debe crear una instancia de la clase /> key desde el portal de Azure y una instancia de DocumentAnalysisClient con la AzureKeyCredential y la Form Recognizer endpoint.
Nota
- A partir de .NET 6, los nuevos proyectos que usan la plantilla
consolegeneran un nuevo estilo de programa que difiere de las versiones anteriores. - La nueva salida usa características recientes de C# que simplifican el código que necesita escribir.
- Cuando se usa la versión más reciente, solo es necesario escribir el cuerpo del
Mainmétodo. No es necesario incluir instrucciones de nivel superior, directivas de uso global ni directivas using implícitas. - Para obtener más información, consulteNuevas plantillas de C# para generar instrucciones de nivel superior.
Abra el archivo Program.cs .
Elimine el código existente, incluida la línea
Console.Writeline("Hola mundo!"), y seleccione uno de los siguientes ejemplos de código para copiar y pegar en el archivo Program.cs de la aplicación:
Importante
Recomendamos la autenticación de Microsoft Entra ID con identidades administradas para los recursos de Azure para evitar almacenar credenciales en sus aplicaciones que se ejecutan en la nube.
Use las claves de API con precaución. No incluya la clave de API directamente en el código y nunca la publique públicamente. Si usa claves de API, almacénelas de forma segura en Azure Key Vault, gire las claves periódicamente y restrinja el acceso a Azure Key Vault mediante el control de acceso basado en rol y las restricciones de acceso de red. Para obtener más información sobre el uso de claves de API de forma segura en las aplicaciones, consulte CLAVESAPI con Azure Key Vault.
Para obtener más información sobre la seguridad de los servicios de inteligencia artificial, consulte
Modelo de diseño
Extraiga texto, marcas de selección, estilos de texto, estructuras de tabla y coordenadas de la región delimitadora de documentos.
- En este ejemplo, necesitará un archivo de documento de un URI. Puede usar nuestro documento sample para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
Uri fileUrivariable en la parte superior del script. - Para extraer el diseño de un archivo determinado en un URI, use el método
AnalyzeDocumentAsyncy paseprebuilt-layoutcomo identificador de modelo. El valor devuelto es unAnalyzeResultobjeto que contiene datos del documento enviado.
Agregue el ejemplo de código siguiente al archivo Program.cs. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource= fileUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", content);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s)," +
$" and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i}:");
Console.WriteLine($" Content: '{line.Content}'");
Console.Write(" Bounding polygon, with points ordered clockwise:");
for (int j = 0; j < line.Polygon.Count; j += 2)
{
Console.Write($" ({line.Polygon[j]}, {line.Polygon[j + 1]})");
}
Console.WriteLine();
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" State: {selectionMark.State}");
Console.Write(" Bounding polygon, with points ordered clockwise:");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.Write($" ({selectionMark.Polygon[j]}, {selectionMark.Polygon[j + 1]})");
}
Console.WriteLine();
}
}
for (int i = 0; i < result.Paragraphs.Count; i++)
{
DocumentParagraph paragraph = result.Paragraphs[i];
Console.WriteLine($"Paragraph {i}:");
Console.WriteLine($" Content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
var handwrittenContent = result.Content.Substring(span.Offset, span.Length);
Console.WriteLine($" {handwrittenContent}");
}
}
}
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) is a '{cell.Kind}' with content: {cell.Content}");
}
}
Ejecución de la aplicación
Una vez que agregue un ejemplo de código a la aplicación, elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Agregue el ejemplo de código siguiente al archivo Program.cs. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {line.Polygon[0].X}, Y= {line.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.Polygon[1].X}, Y= {line.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.Polygon[2].X}, Y= {line.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.Polygon[3].X}, Y= {line.Polygon[3].Y}");
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding box is:");
Console.WriteLine($" Upper left => X: {selectionMark.Polygon[0].X}, Y= {selectionMark.Polygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.Polygon[1].X}, Y= {selectionMark.Polygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.Polygon[2].X}, Y= {selectionMark.Polygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.Polygon[3].X}, Y= {selectionMark.Polygon[3].Y}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Ejecución de la aplicación
Una vez que agregue un ejemplo de código a la aplicación, elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Salida del modelo de diseño
Este es un fragmento de código de la salida esperada:
Document Page 1 has 69 line(s), 425 word(s), and 15 selection mark(s).
Line 0 has content: 'UNITED STATES'.
Its bounding box is:
Upper left => X: 3.4915, Y= 0.6828
Upper right => X: 5.0116, Y= 0.6828
Lower right => X: 5.0116, Y= 0.8265
Lower left => X: 3.4915, Y= 0.8265
Line 1 has content: 'SECURITIES AND EXCHANGE COMMISSION'.
Its bounding box is:
Upper left => X: 2.1937, Y= 0.9061
Upper right => X: 6.297, Y= 0.9061
Lower right => X: 6.297, Y= 1.0498
Lower left => X: 2.1937, Y= 1.0498
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo layout.
Agregue el ejemplo de código siguiente al archivo Program.cs. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentAnalysisClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample document
Uri fileUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-layout", fileUri);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Extract the layout of a document from a file stream
To extract the layout from a given file at a file stream, use the AnalyzeDocument method and pass prebuilt-layout as the model ID. The returned value is an AnalyzeResult object containing data about the submitted document.
string filePath = "<filePath>";
using var stream = new FileStream(filePath, FileMode.Open);
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-layout", stream);
AnalyzeResult result = operation.Value;
foreach (DocumentPage page in result.Pages)
{
Console.WriteLine($"Document Page {page.PageNumber} has {page.Lines.Count} line(s), {page.Words.Count} word(s),");
Console.WriteLine($"and {page.SelectionMarks.Count} selection mark(s).");
for (int i = 0; i < page.Lines.Count; i++)
{
DocumentLine line = page.Lines[i];
Console.WriteLine($" Line {i} has content: '{line.Content}'.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < line.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.Polygon[j].X}, Y: {line.Polygon[j].Y}");
}
}
for (int i = 0; i < page.SelectionMarks.Count; i++)
{
DocumentSelectionMark selectionMark = page.SelectionMarks[i];
Console.WriteLine($" Selection Mark {i} is {selectionMark.State}.");
Console.WriteLine($" Its bounding polygon (points ordered clockwise):");
for (int j = 0; j < selectionMark.Polygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.Polygon[j].X}, Y: {selectionMark.Polygon[j].Y}");
}
}
}
Console.WriteLine("Paragraphs:");
foreach (DocumentParagraph paragraph in result.Paragraphs)
{
Console.WriteLine($" Paragraph content: {paragraph.Content}");
if (paragraph.Role != null)
{
Console.WriteLine($" Role: {paragraph.Role}");
}
}
foreach (DocumentStyle style in result.Styles)
{
// Check the style and style confidence to see if text is handwritten.
// Note that value '0.8' is used as an example.
bool isHandwritten = style.IsHandwritten.HasValue && style.IsHandwritten == true;
if (isHandwritten && style.Confidence > 0.8)
{
Console.WriteLine($"Handwritten content found:");
foreach (DocumentSpan span in style.Spans)
{
Console.WriteLine($" Content: {result.Content.Substring(span.Index, span.Length)}");
}
}
}
Console.WriteLine("The following tables were extracted:");
for (int i = 0; i < result.Tables.Count; i++)
{
DocumentTable table = result.Tables[i];
Console.WriteLine($" Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (DocumentTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) has kind '{cell.Kind}' and content: '{cell.Content}'.");
}
}
Ejecución de la aplicación
Una vez que agregue un ejemplo de código a la aplicación, elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Modelo precompilado
Analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo precompilado. En este ejemplo, analizamos una factura mediante el modelo de factura precompilado .
Propina
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Consulte extracción de datos del modelo.
- Analice una factura mediante el modelo de factura precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
Uri invoiceUrivariable en la parte superior del archivo Program.cs. - Para analizar un archivo determinado en un URI, use el
AnalyzeDocumentAsyncmétodo y paseprebuilt-invoicecomo identificador de modelo. El valor devuelto es unAnalyzeResultobjeto que contiene datos del documento enviado. - Por motivos de simplicidad, no se muestran aquí todos los pares clave-valor que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Agregue el ejemplo de código siguiente al archivo Program.cs. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
using Azure;
using Azure.AI.DocumentIntelligence;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `DocumentIntelligenceClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentIntelligenceClient client = new DocumentIntelligenceClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
AnalyzeDocumentContent content = new AnalyzeDocumentContent()
{
UrlSource = invoiceUri
};
Operation<AnalyzeResult> operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", content);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField)
&& vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.ValueList)
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueDictionary;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.ValueCurrency;
Console.WriteLine($" Amount: '{itemAmount.CurrencySymbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField)
&& subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.ValueCurrency;
Console.WriteLine($"Sub Total: '{subTotal.CurrencySymbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField)
&& totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.ValueCurrency;
Console.WriteLine($"Total Tax: '{totalTax.CurrencySymbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField)
&& invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
Ejecución de la aplicación
Una vez que agregue un ejemplo de código a la aplicación, elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Agregue el ejemplo de código siguiente al archivo Program.cs. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
Operation operation = await client.AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
{
if (vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
{
if (customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.Value.AsString();
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
{
if (itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.Value.AsList())
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
{
if (itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.Value.AsString();
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
{
if (itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();
Console.WriteLine($" Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
{
if (subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.Value.AsCurrency();
Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
{
if (totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
{
if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
}
Ejecución de la aplicación
Una vez que agregue un ejemplo de código a la aplicación, elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Salida del modelo precompilado
Este es un fragmento de código de la salida esperada:
Document 0:
Vendor Name: 'CONTOSO LTD.', with confidence 0.962
Customer Name: 'MICROSOFT CORPORATION', with confidence 0.951
Item:
Description: 'Test for 23 fields', with confidence 0.899
Amount: '100', with confidence 0.902
Sub Total: '100', with confidence 0.979
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo de factura precompilado.
Agregue el ejemplo de código siguiente al archivo Program.cs. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
using Azure;
using Azure.AI.FormRecognizer.DocumentAnalysis;
//set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal to create your `AzureKeyCredential` and `FormRecognizerClient` instance
string endpoint = "<your-endpoint>";
string key = "<your-key>";
AzureKeyCredential credential = new AzureKeyCredential(key);
DocumentAnalysisClient client = new DocumentAnalysisClient(new Uri(endpoint), credential);
//sample invoice document
Uri invoiceUri = new Uri ("https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf");
AnalyzeDocumentOperation operation = await client.AnalyzeDocumentFromUriAsync(WaitUntil.Completed, "prebuilt-invoice", invoiceUri);
AnalyzeResult result = operation.Value;
for (int i = 0; i < result.Documents.Count; i++)
{
Console.WriteLine($"Document {i}:");
AnalyzedDocument document = result.Documents[i];
if (document.Fields.TryGetValue("VendorName", out DocumentField vendorNameField))
{
if (vendorNameField.FieldType == DocumentFieldType.String)
{
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField))
{
if (customerNameField.FieldType == DocumentFieldType.String)
{
string customerName = customerNameField.Value.AsString();
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField))
{
if (itemsField.FieldType == DocumentFieldType.List)
{
foreach (DocumentField itemField in itemsField.Value.AsList())
{
Console.WriteLine("Item:");
if (itemField.FieldType == DocumentFieldType.Dictionary)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.Value.AsDictionary();
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField))
{
if (itemDescriptionField.FieldType == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.Value.AsString();
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField))
{
if (itemAmountField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue itemAmount = itemAmountField.Value.AsCurrency();
Console.WriteLine($" Amount: '{itemAmount.Symbol}{itemAmount.Amount}', with confidence {itemAmountField.Confidence}");
}
}
}
}
}
}
if (document.Fields.TryGetValue("SubTotal", out DocumentField subTotalField))
{
if (subTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue subTotal = subTotalField.Value.AsCurrency();
Console.WriteLine($"Sub Total: '{subTotal.Symbol}{subTotal.Amount}', with confidence {subTotalField.Confidence}");
}
}
if (document.Fields.TryGetValue("TotalTax", out DocumentField totalTaxField))
{
if (totalTaxField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue totalTax = totalTaxField.Value.AsCurrency();
Console.WriteLine($"Total Tax: '{totalTax.Symbol}{totalTax.Amount}', with confidence {totalTaxField.Confidence}");
}
}
if (document.Fields.TryGetValue("InvoiceTotal", out DocumentField invoiceTotalField))
{
if (invoiceTotalField.FieldType == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.Value.AsCurrency();
Console.WriteLine($"Invoice Total: '{invoiceTotal.Symbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
}
Ejecución de la aplicación
Una vez que agregue un ejemplo de código a la aplicación, elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Biblioteca de clientes | Referencia de la API REST | Paquete (Maven) | Ejemplos |Versión de la API REST compatible
En este inicio rápido, use las siguientes características para analizar y extraer datos y valores de formularios y documentos:
Diseño: analice y extraiga tablas, líneas, palabras y marcas de selección como botones de radio y casillas en documentos, sin necesidad de entrenar un modelo.
Factura precompilada: analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo entrenado previamente.
Requisitos previos
suscripción a Azure: Crear una gratuita.
La versión más reciente de Visual Studio Code o su IDE preferido. VerJava en Visual Studio Code.
Propina
- Visual Studio Code ofrece una Coding Pack para Java para Windows y macOS.El paquete de codificación es un paquete de VS Code, el Kit de desarrollo de Java (JDK) y una colección de extensiones sugeridas por Microsoft. El paquete de codificación también se puede usar para corregir un entorno de desarrollo existente.
- Si usa VS Code y el paquete de codificación para Java, instale la extensión Gradle para Java.
Si no usa Visual Studio Code, asegúrese de que tiene lo siguiente instalado en el entorno de desarrollo:
Un Java Kit de desarrollo (JDK) versión 8 o posterior. Para obtener más información, seeCompilación de Microsoft de OpenJDK.
Gradle, versión 6.8 o posterior.
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de Document Intelligence de un solo servicio o múltiples servicios en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Propina
Cree un recurso de Microsoft Foundry si planea acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Necesita un recurso de un solo servicio si piensa usar autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Más adelante, pegue la clave y el punto de conexión en el código:
Configurar
Creación de un nuevo proyecto de Gradle
En la ventana de consola (como cmd, PowerShell o Bash), cree un directorio para la aplicación denominada doc-intel-app y vaya a ella.
mkdir doc-intel-app && doc-intel-appmkdir doc-intel-app; cd doc-intel-appEjecute el comando desde el
gradle initdirectorio de trabajo. Este comando crea archivos de compilación esenciales para Gradle, incluido build.gradle.kts, que se usa en tiempo de ejecución para crear y configurar la aplicación.gradle init --type basicCuando se le pida que elija un DSL, seleccione Kotlin.
Acepte el nombre de proyecto predeterminado (doc-intel-app) seleccionando Devolver o Entrar.
En la ventana de consola (por ejemplo, cmd, PowerShell o Bash), cree un directorio para la aplicación denominada form-recognize-app y vaya a ella.
mkdir form-recognize-app && cd form-recognize-appmkdir form-recognize-app; cd form-recognize-appEjecute el comando desde el
gradle initdirectorio de trabajo. Este comando crea archivos de compilación esenciales para Gradle, incluido build.gradle.kts, que se usa en tiempo de ejecución para crear y configurar la aplicación.gradle init --type basicCuando se le pida que elija un DSL, seleccione Kotlin.
Acepte el nombre de proyecto predeterminado (form-recognize-app) seleccionando Devolver o Entrar.
Instalación de la biblioteca cliente
En este inicio rápido se usa el administrador de dependencias de Gradle. Puede encontrar la biblioteca cliente e información de otros administradores de dependencias en el repositorio central de Maven.
Abra el archivo build.gradle.kts del proyecto en el IDE. Copia y pega el código siguiente para incluir la biblioteca de cliente como una implementation declaración, junto con los complementos y la configuración necesarios.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0'
}
En este inicio rápido se usa el administrador de dependencias de Gradle. Puede encontrar la biblioteca cliente e información de otros administradores de dependencias en el repositorio central de Maven.
Abra el archivo build.gradle.kts del proyecto en el IDE. Copie y pegue el siguiente código para incluir la biblioteca del cliente como una instrucción implementation, junto con los complementos y la configuración necesarios.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
En este inicio rápido se usa el administrador de dependencias de Gradle. Puede encontrar la biblioteca cliente e información de otros administradores de dependencias en el repositorio central de Maven.
Abra el archivo build.gradle.kts del proyecto en el IDE. Copia y pega el código siguiente para incluir la biblioteca del cliente como una instrucción de implementation, junto con los complementos y la configuración necesarios.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Creación de una aplicación de Java
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentIntelligenceClient clase . Para ello, cree un AzureKeyCredential con su key desde el portal de Azure y una instancia DocumentIntelligenceClient de AzureKeyCredential y su Inteligencia de Documentos endpoint.
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentAnalysisClient clase . Para ello, cree un AzureKeyCredential con su key desde el portal de Azure y una instancia DocumentAnalysisClient de AzureKeyCredential y su Inteligencia de Documentos endpoint.
En el directorio doc-intel-app, ejecute el siguiente comando:
mkdir -p src/main/javaCree la siguiente estructura de directorios:
Vaya al
javadirectorio y cree un archivo denominadoDocIntelligence.java.Propina
- Puede crear un nuevo archivo mediante PowerShell.
- Abra una ventana de PowerShell en el directorio del proyecto manteniendo presionada la tecla Mayús y haciendo clic con el botón derecho en la carpeta.
- Escriba el siguiente comando New-Item DocIntelligence.java.
Abra el
DocIntelligence.javaarchivo. Copie y pegue uno de los ejemplos de código siguientes en la aplicación:
Vaya al
javadirectorio y cree un archivo denominadoFormRecognizer.java.Propina
- Puede crear un nuevo archivo mediante PowerShell.
- Abra una ventana de PowerShell en el directorio del proyecto manteniendo presionada la tecla Mayús y haciendo clic con el botón derecho en la carpeta.
- Escriba el siguiente comando New-Item FormRecognizer.java.
Abra el
FormRecognizer.javaarchivo. Copie y pegue uno de los ejemplos de código siguientes en la aplicación:
Importante
Recomendamos la autenticación de Microsoft Entra ID con identidades administradas para los recursos de Azure para evitar almacenar credenciales en sus aplicaciones que se ejecutan en la nube.
Use las claves de API con precaución. No incluya la clave de API directamente en el código y nunca la publique públicamente. Si usa claves de API, almacénelas de forma segura en Azure Key Vault, gire las claves periódicamente y restrinja el acceso a Azure Key Vault mediante el control de acceso basado en rol y las restricciones de acceso de red. Para obtener más información sobre el uso de claves de API de forma segura en las aplicaciones, consulte CLAVESAPI con Azure Key Vault.
Para obtener más información sobre la seguridad de los servicios de inteligencia artificial, consulte
Modelo de diseño
Extraiga texto, marcas de selección, estilos de texto, estructuras de tabla y coordenadas de la región delimitadora de documentos.
- En este ejemplo, necesitará un archivo de documento en un URI. Puede usar nuestro documento sample para este inicio rápido.
- Para analizar un archivo determinado en un URI, usará el
beginAnalyzeDocumentmétodo y pasaráprebuilt-layoutcomo identificador del modelo. El valor devuelto es unAnalyzeResultobjeto que contiene datos sobre el documento enviado. - Hemos agregado el valor del URI de archivo a la
documentUrlvariable en el método main.
Agregue el siguiente ejemplo de código al DocIntelligence.java archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.DocumentTable;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-layout";
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
AnalyzeDocumentOptions options = new AnalyzeDocumentOptions(documentUrl);
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeLayoutPoller = client.beginAnalyzeDocument(modelId, options);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell ->
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex()));
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
}
Compilación y ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, vuelva al directorio principal del proyecto: doc-intel-app.
Compile la aplicación con el
buildcomando :gradle buildEjecute la aplicación con el
runcomando :gradle run
Agregue el siguiente ejemplo de código al FormRecognizer.java archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutResultPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutResultPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line %s is within a bounding polygon %s.%n",
documentLine.getContent(),
documentLine.getPolygon().toString()));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is %s and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getState().toString(),
documentSelectionMark.getPolygon().toString(),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
}
// Utility function to get the bounding polygon coordinates
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Compilación y ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, vuelva al directorio principal del proyecto: form-recognize-app.
Compile la aplicación con el
buildcomando :gradle buildEjecute la aplicación con el
runcomando :gradle run
Salida del modelo de diseño
Este es un fragmento de código de la salida esperada:
Table 0 has 5 rows and 3 columns.
Cell 'Title of each class', has row index 0 and column index 0.
Cell 'Trading Symbol', has row index 0 and column index 1.
Cell 'Name of exchange on which registered', has row index 0 and column index 2.
Cell 'Common stock, $0.00000625 par value per share', has row index 1 and column index 0.
Cell 'MSFT', has row index 1 and column index 1.
Cell 'NASDAQ', has row index 1 and column index 2.
Cell '2.125% Notes due 2021', has row index 2 and column index 0.
Cell 'MSFT', has row index 2 and column index 1.
Cell 'NASDAQ', has row index 2 and column index 2.
Cell '3.125% Notes due 2028', has row index 3 and column index 0.
Cell 'MSFT', has row index 3 and column index 1.
Cell 'NASDAQ', has row index 3 and column index 2.
Cell '2.625% Notes due 2033', has row index 4 and column index 0.
Cell 'MSFT', has row index 4 and column index 1.
Cell 'NASDAQ', has row index 4 and column index 2.
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo layout.
Agregue el siguiente ejemplo de código al FormRecognizer.java archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentTable;
import com.azure.ai.formrecognizer.documentanalysis.models.Point;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.util.List;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String documentUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
String modelId = "prebuilt-layout";
SyncPoller < OperationResult, AnalyzeResult > analyzeLayoutPoller =
client.beginAnalyzeDocumentFromUrl(modelId, documentUrl);
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult();
// pages
analyzeLayoutResult.getPages().forEach(documentPage -> {
System.out.printf("Page has width: %.2f and height: %.2f, measured with unit: %s%n",
documentPage.getWidth(),
documentPage.getHeight(),
documentPage.getUnit());
// lines
documentPage.getLines().forEach(documentLine ->
System.out.printf("Line '%s' is within a bounding polygon %s.%n",
documentLine.getContent(),
getBoundingCoordinates(documentLine.getPolygon())));
// words
documentPage.getWords().forEach(documentWord ->
System.out.printf("Word '%s' has a confidence score of %.2f.%n",
documentWord.getContent(),
documentWord.getConfidence()));
// selection marks
documentPage.getSelectionMarks().forEach(documentSelectionMark ->
System.out.printf("Selection mark is '%s' and is within a bounding polygon %s with confidence %.2f.%n",
documentSelectionMark.getSelectionMarkState().toString(),
getBoundingCoordinates(documentSelectionMark.getPolygon()),
documentSelectionMark.getConfidence()));
});
// tables
List < DocumentTable > tables = analyzeLayoutResult.getTables();
for (int i = 0; i < tables.size(); i++) {
DocumentTable documentTable = tables.get(i);
System.out.printf("Table %d has %d rows and %d columns.%n", i, documentTable.getRowCount(),
documentTable.getColumnCount());
documentTable.getCells().forEach(documentTableCell -> {
System.out.printf("Cell '%s', has row index %d and column index %d.%n", documentTableCell.getContent(),
documentTableCell.getRowIndex(), documentTableCell.getColumnIndex());
});
System.out.println();
}
// styles
analyzeLayoutResult.getStyles().forEach(documentStyle -
> System.out.printf("Document is handwritten %s.%n", documentStyle.isHandwritten()));
}
/**
* Utility function to get the bounding polygon coordinates.
*/
private static String getBoundingCoordinates(List < Point > Polygon) {
return Polygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Compilación y ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, vuelva al directorio principal del proyecto: form-recognize-app.
Compile la aplicación con el
buildcomando :gradle buildEjecute la aplicación con el
runcomando :gradle run
Modelo precompilado
Analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo precompilado. En este ejemplo, analizamos una factura mediante el modelo de factura precompilado .
Propina
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Consulte extracción de datos del modelo.
- Analice una factura mediante el modelo de factura precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor de dirección URL del archivo a la
invoiceUrlvariable en la parte superior del archivo. - Para analizar un archivo determinado en un URI, usará el
beginAnalyzeDocumentsmétodo y pasaráPrebuiltModels.Invoicecomo identificador del modelo. El valor devuelto es unresultobjeto que contiene datos sobre el documento enviado. - Por motivos de simplicidad, no se muestran aquí todos los pares clave-valor que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Agregue el siguiente ejemplo de código al DocIntelligence.java archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
import com.azure.ai.documentintelligence.DocumentIntelligenceClient;
import com.azure.ai.documentintelligence.DocumentIntelligenceClientBuilder;
import com.azure.ai.documentintelligence.models.AnalyzeDocumentOptions;
import com.azure.ai.documentintelligence.models.AnalyzeOperationDetails;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzedDocument;
import com.azure.ai.documentintelligence.models.DocumentField;
import com.azure.ai.documentintelligence.models.DocumentFieldType;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class DocIntelligence {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentIntelligenceClient` instance and `AzureKeyCredential` variable
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller<AnalyzeOperationDetails, AnalyzeResult> analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId, new AnalyzeDocumentOptions(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map<String, DocumentField> invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (invoiceDateField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (invoiceTotalField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List<DocumentField> invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/documentintelligence/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Compilación y ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, vuelva al directorio principal del proyecto: doc-intel-app.
Compile la aplicación con el
buildcomando :gradle buildEjecute la aplicación con el
runcomando :gradle run
Agregue el siguiente ejemplo de código al FormRecognizer.java archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
import com.azure.ai.formrecognizer.documentanalysis.models.*;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.time.LocalDate;
import java.util.Map;
import java.util.stream.Collectors;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(final String[] args) throws IOException {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);
AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/formrecognizer/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Compilación y ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, vuelva al directorio principal del proyecto: doc-intel-app.
Compile la aplicación con el
buildcomando :gradle buildEjecute la aplicación con el
runcomando :gradle run
Salida del modelo precompilado
Este es un fragmento de código de la salida esperada:
----------- Analyzing invoice 0 -----------
Analyzed document has doc type invoice with confidence : 1.00
Vendor Name: CONTOSO LTD., confidence: 0.92
Vendor address: 123 456th St New York, NY, 10001, confidence: 0.91
Customer Name: MICROSOFT CORPORATION, confidence: 0.84
Customer Address Recipient: Microsoft Corp, confidence: 0.92
Invoice ID: INV-100, confidence: 0.97
Invoice Date: 2019-11-15, confidence: 0.97
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo de factura precompilado.
Agregue el siguiente ejemplo de código al FormRecognizer.java archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClient;
import com.azure.ai.formrecognizer.documentanalysis.DocumentAnalysisClientBuilder;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzeResult;
import com.azure.ai.formrecognizer.documentanalysis.models.AnalyzedDocument;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentField;
import com.azure.ai.formrecognizer.documentanalysis.models.DocumentFieldType;
import com.azure.ai.formrecognizer.documentanalysis.models.OperationResult;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import java.io.IOException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
public class FormRecognizer {
// set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
private static final String endpoint = "<your-endpoint>";
private static final String key = "<your-key>";
public static void main(String[] args) {
// create your `DocumentAnalysisClient` instance and `AzureKeyCredential` variable
DocumentAnalysisClient client = new DocumentAnalysisClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
// sample document
String modelId = "prebuilt-invoice";
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
SyncPoller < OperationResult, AnalyzeResult > analyzeInvoicePoller = client.beginAnalyzeDocumentFromUrl(modelId, invoiceUrl);
AnalyzeResult analyzeInvoiceResult = analyzeInvoicePoller.getFinalResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
AnalyzedDocument analyzedInvoice = analyzeInvoiceResult.getDocuments().get(i);
Map < String, DocumentField > invoiceFields = analyzedInvoice.getFields();
System.out.printf("----------- Analyzing invoice %d -----------%n", i);
DocumentField vendorNameField = invoiceFields.get("VendorName");
if (vendorNameField != null) {
if (DocumentFieldType.STRING == vendorNameField.getType()) {
String merchantName = vendorNameField.getValueAsString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n",
merchantName, vendorNameField.getConfidence());
}
}
DocumentField vendorAddressField = invoiceFields.get("VendorAddress");
if (vendorAddressField != null) {
if (DocumentFieldType.STRING == vendorAddressField.getType()) {
String merchantAddress = vendorAddressField.getValueAsString();
System.out.printf("Vendor address: %s, confidence: %.2f%n",
merchantAddress, vendorAddressField.getConfidence());
}
}
DocumentField customerNameField = invoiceFields.get("CustomerName");
if (customerNameField != null) {
if (DocumentFieldType.STRING == customerNameField.getType()) {
String merchantAddress = customerNameField.getValueAsString();
System.out.printf("Customer Name: %s, confidence: %.2f%n",
merchantAddress, customerNameField.getConfidence());
}
}
DocumentField customerAddressRecipientField = invoiceFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.STRING == customerAddressRecipientField.getType()) {
String customerAddr = customerAddressRecipientField.getValueAsString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n",
customerAddr, customerAddressRecipientField.getConfidence());
}
}
DocumentField invoiceIdField = invoiceFields.get("InvoiceId");
if (invoiceIdField != null) {
if (DocumentFieldType.STRING == invoiceIdField.getType()) {
String invoiceId = invoiceIdField.getValueAsString();
System.out.printf("Invoice ID: %s, confidence: %.2f%n",
invoiceId, invoiceIdField.getConfidence());
}
}
DocumentField invoiceDateField = invoiceFields.get("InvoiceDate");
if (customerNameField != null) {
if (DocumentFieldType.DATE == invoiceDateField.getType()) {
LocalDate invoiceDate = invoiceDateField.getValueAsDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.DOUBLE == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueAsDouble();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n",
invoiceTotal, invoiceTotalField.getConfidence());
}
}
DocumentField invoiceItemsField = invoiceFields.get("Items");
if (invoiceItemsField != null) {
System.out.printf("Invoice Items: %n");
if (DocumentFieldType.LIST == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueAsList();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.MAP == invoiceItem.getType())
.map(documentField -> documentField.getValueAsMap())
.forEach(documentFieldMap -> documentFieldMap.forEach((key, documentField) -> {
// See a full list of fields found on an invoice here:
// https://aka.ms/formrecognizer/invoicefields
if ("Description".equals(key)) {
if (DocumentFieldType.STRING == documentField.getType()) {
String name = documentField.getValueAsString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double quantity = documentField.getValueAsDouble();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double unitPrice = documentField.getValueAsDouble();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.DOUBLE == documentField.getType()) {
Double productCode = documentField.getValueAsDouble();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
Compilación y ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, vuelva al directorio principal del proyecto: doc-intel-app.
Compile la aplicación con el
buildcomando :gradle buildEjecute la aplicación con el
runcomando :gradle run
Biblioteca Cliente |Referencia de la API REST | Paquete (npm) | Ejemplos |Versión admitida de la API REST
Biblioteca cliente |Referencia de la API REST | Paquete (npm) | Ejemplos |Versión admitida de la API REST
En este inicio rápido, use las siguientes características para analizar y extraer datos y valores de formularios y documentos:
Diseño: analice y extraiga tablas, líneas, palabras y marcas de selección como botones de radio y casillas en documentos, sin necesidad de entrenar un modelo.
Factura precompilada: analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo de factura previamente entrenado.
Requisitos previos
suscripción a Azure: Crear una gratuita.
La versión más reciente de Visual Studio Code o su IDE preferido. Para obtener más información, seeNode.js en Visual Studio Code.
La versión más reciente
LTSde Node.js.Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de Document Intelligence de un solo servicio o múltiples servicios en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Propina
Cree un recurso de Microsoft Foundry si planea acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Necesita un recurso de un solo servicio si piensa usar autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Cree una nueva aplicación Node.js Express: en una ventana de consola (como cmd, PowerShell o Bash), cree y vaya a un nuevo directorio para la aplicación denominada
doc-intel-app.mkdir doc-intel-app && cd doc-intel-appEjecute el comando
npm initpara inicializar la aplicación y estructurar el proyecto.npm initEspecifique los atributos del proyecto mediante las indicaciones presentadas en el terminal.
- Los atributos más importantes son el nombre, el número de versión y el punto de entrada.
- Se recomienda mantener
index.jscomo el nombre del punto de entrada. La descripción, el comando de prueba, el repositorio GitHub, las palabras clave, el autor y la información de licencia son atributos opcionales; se pueden omitir para este proyecto. - Acepte las sugerencias entre paréntesis seleccionando Devolver o Entrar.
- Después de completar las indicaciones, se creará un
package.jsonarchivo en el directorio doc-intel-app.
Instale
ai-document-intelligencela biblioteca cliente y losazure/identitypaquetes npm.npm i @azure-rest/ai-document-intelligence@1.1.0El archivo de su
package.jsonaplicación ha sido actualizado con las dependencias.
Instale la
ai-form-recognizerbiblioteca cliente y los paquetesazure/identitynpm:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity- El archivo de aplicación
package.jsonse actualiza con las dependencias.
- El archivo de aplicación
Instale la
ai-form-recognizerbiblioteca cliente y los paquetesazure/identityde npm:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Cree un archivo denominado
index.jsen el directorio de la aplicación.Propina
- Puede crear un nuevo archivo mediante PowerShell.
- Abra una ventana de PowerShell en el directorio del proyecto manteniendo presionada la tecla Mayús y haciendo clic con el botón derecho en la carpeta.
- Escriba el comando siguiente New-Item index.js.
Compilación de la aplicación
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentIntelligenceClient clase . Para ello, cree un AzureKeyCredential con su key desde el portal de Azure y una instancia DocumentIntelligenceClient de AzureKeyCredential y su Inteligencia de Documentos endpoint.
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentAnalysisClient clase . Para ello, cree una AzureKeyCredential con el key desde el portal de Azure y una instancia de DocumentAnalysisClient con la AzureKeyCredential y la Form Recognizer endpoint.
Abra el archivo />
Importante
Recomendamos la autenticación de Microsoft Entra ID con identidades administradas para los recursos de Azure para evitar almacenar credenciales en sus aplicaciones que se ejecutan en la nube.
Use las claves de API con precaución. No incluya la clave de API directamente en el código y nunca la publique públicamente. Si usa claves de API, almacénelas de forma segura en Azure Key Vault, gire las claves periódicamente y restrinja el acceso a Azure Key Vault mediante el control de acceso basado en rol y las restricciones de acceso de red. Para obtener más información sobre el uso de claves de API de forma segura en las aplicaciones, consulte CLAVESAPI con Azure Key Vault.
Para obtener más información sobre la seguridad de los servicios de inteligencia artificial, consulte
Modelo de diseño
Extraiga texto, marcas de selección, estilos de texto, estructuras de tabla y coordenadas de la región delimitadora de documentos.
- En este ejemplo, necesitará un archivo de documento desde una dirección URL. Puede usar nuestro documento sample para este inicio rápido.
- Hemos agregado el valor de dirección URL del archivo a la
formUrlvariable cerca de la parte superior del archivo.- Para analizar un archivo determinado desde una dirección URL, usará el
beginAnalyzeDocumentsmétodo y pasaráprebuilt-layoutcomo identificador del modelo.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-layout")
.post({
contentType: "application/json",
body: {
urlSource: formUrl
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const pages = analyzeResult?.pages;
const tables = analyzeResult?.tables;
if (pages && pages.length > 0) {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}`);
console.log(` ${page.lines?.length || 0} lines, ${page.words?.length || 0} words`);
}
} else {
console.log("No pages were extracted from the document.");
}
if (tables && tables.length > 0) {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
} else {
console.log("No tables were extracted from the document.");
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, ejecute el programa:
Vaya a la carpeta en la que tiene la aplicación de Inteligencia de Documentos (doc-intel-app).
Escriba el siguiente comando en el terminal:
node index.js
Agregue el siguiente ejemplo de código al index.js archivo. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-layout", formUrl);
const {
pages,
tables
} = await poller.pollUntilDone();
if (pages.length <= 0) {
console.log("No pages were extracted from the document.");
} else {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}, angle: ${page.angle}`);
console.log(` ${page.lines.length} lines, ${page.words.length} words`);
}
}
if (tables.length <= 0) {
console.log("No tables were extracted from the document.");
} else {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, ejecute el programa:
Vaya a la carpeta donde tiene la aplicación Document Intelligence (doc-intel-app).
Escriba el siguiente comando en el terminal:
node index.js
Salida del modelo de diseño
Este es un fragmento de código de la salida esperada:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo layout.
Modelo precompilado
En este ejemplo, analizamos una factura mediante el modelo de factura precompilado .
Propina
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Consulte extracción de datos del modelo.
- Analice una factura mediante el modelo de factura precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor de dirección URL del archivo a la
invoiceUrlvariable en la parte superior del archivo. - Para analizar un archivo determinado en un URI, usará el
beginAnalyzeDocumentsmétodo y pasaráPrebuiltModels.Invoicecomo identificador del modelo. El valor devuelto es unresultobjeto que contiene datos sobre el documento enviado. - Por motivos de simplicidad, no se muestran aquí todos los pares clave-valor que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = DocumentIntelligence(endpoint, { key });
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const invoice = documents && documents[0];
if (!invoice) {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
invoice.docType,
`(confidence: ${invoice.confidence || "<undefined>"})`
);
console.log("Fields:", invoice.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, ejecute el programa:
Navegue a la carpeta donde tiene su aplicación de Inteligencia de Documentos (doc-intel-app).
Escriba el siguiente comando en el terminal:
node index.js
const {
AzureKeyCredential,
DocumentAnalysisClient
} = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocumentFromUrl("prebuilt-invoice", invoiceUrl);
const {
pages,
tables
} = await poller.pollUntilDone();
if (pages.length <= 0) {
console.log("No pages were extracted from the document.");
} else {
console.log("Pages:");
for (const page of pages) {
console.log("- Page", page.pageNumber, `(unit: ${page.unit})`);
console.log(` ${page.width}x${page.height}, angle: ${page.angle}`);
console.log(` ${page.lines.length} lines, ${page.words.length} words`);
if (page.lines && page.lines.length > 0) {
console.log(" Lines:");
for (const line of page.lines) {
console.log(` - "${line.content}"`);
// The words of the line can also be iterated independently. The words are computed based on their
// corresponding spans.
for (const word of line.words()) {
console.log(` - "${word.content}"`);
}
}
}
}
}
if (tables.length <= 0) {
console.log("No tables were extracted from the document.");
} else {
console.log("Tables:");
for (const table of tables) {
console.log(
`- Extracted table: ${table.columnCount} columns, ${table.rowCount} rows (${table.cells.length} cells)`
);
}
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, ejecute el programa:
Navegue a la carpeta donde tiene su aplicación de Inteligencia de Documentos (doc-intel-app).
Escriba el siguiente comando en el terminal:
node index.js
Salida del modelo precompilado
Este es un fragmento de código de la salida esperada:
Vendor Name: CONTOSO LTD.
Customer Name: MICROSOFT CORPORATION
Invoice Date: 2019-11-15T00:00:00.000Z
Due Date: 2019-12-15T00:00:00.000Z
Items:
- <no product code>
Description: Test for 23 fields
Quantity: 1
Date: undefined
Unit: undefined
Unit Price: 1
Tax: undefined
Amount: 100
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo de factura precompilado.
const { AzureKeyCredential, DocumentAnalysisClient } = require("@azure/ai-form-recognizer");
// set `<your-key>` and `<your-endpoint>` variables with the values from the Azure portal.
const key = "<your-key>";
const endpoint = "<your-endpoint>";
// sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
async function main() {
const client = new DocumentAnalysisClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginAnalyzeDocument("prebuilt-invoice", invoiceUrl);
const {
documents: [document],
} = await poller.pollUntilDone();
if (document) {
const {
vendorName,
customerName,
invoiceDate,
dueDate,
items,
subTotal,
previousUnpaidBalance,
totalTax,
amountDue,
} = document.fields;
// The invoice model has many fields. For details, *see* [Invoice model field extraction](../../prebuilt/invoice.md#field-extraction)
console.log("Vendor Name:", vendorName && vendorName.value);
console.log("Customer Name:", customerName && customerName.value);
console.log("Invoice Date:", invoiceDate && invoiceDate.value);
console.log("Due Date:", dueDate && dueDate.value);
console.log("Items:");
for (const item of (items && items.values) || []) {
const { productCode, description, quantity, date, unit, unitPrice, tax, amount } =
item.properties;
console.log("-", (productCode && productCode.value) || "<no product code>");
console.log(" Description:", description && description.value);
console.log(" Quantity:", quantity && quantity.value);
console.log(" Date:", date && date.value);
console.log(" Unit:", unit && unit.value);
console.log(" Unit Price:", unitPrice && unitPrice.value);
console.log(" Tax:", tax && tax.value);
console.log(" Amount:", amount && amount.value);
}
console.log("Subtotal:", subTotal && subTotal.value);
console.log("Previous Unpaid Balance:", previousUnpaidBalance && previousUnpaidBalance.value);
console.log("Tax:", totalTax && totalTax.value);
console.log("Amount Due:", amountDue && amountDue.value);
} else {
throw new Error("Expected at least one receipt in the result.");
}
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, ejecute el programa:
Navegue a la carpeta donde tiene su aplicación de Inteligencia de Documentos (doc-intel-app).
Escriba el siguiente comando en el terminal:
node index.js
En este inicio rápido, use las siguientes características para analizar y extraer datos de formularios y documentos:
Diseño: analice y extraiga tablas, líneas, palabras y marcas de selección, como botones de radio y casillas, y pares clave-valor, sin necesidad de entrenar un modelo.
Factura precompilada: analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo entrenado previamente.
Requisitos previos
suscripción a Azure: Crear una gratuita.
-
- La instalación de Python debe incluir pip. Puede comprobar si ha instalado pip mediante la ejecución
pip --versionen la línea de comandos. Obtenga pip instalando la versión más reciente de Python.
- La instalación de Python debe incluir pip. Puede comprobar si ha instalado pip mediante la ejecución
La versión más reciente de Visual Studio Code o su IDE preferido. Para obtener más información, seeIntroducción a Python en Visual Studio Code.
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de Document Intelligence de un solo servicio o múltiples servicios en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.
Propina
Cree un recurso de Microsoft Foundry si planea acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Necesita un recurso de un solo servicio si piensa usar autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Abra una ventana de terminal en el entorno local e instale la Azure Document Intelligence en la biblioteca cliente de Foundry Tools para Python con pip:
pip install azure-ai-documentintelligence==1.0.2
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Creación de la aplicación de Python
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentIntelligenceClient clase . Para ello, cree un AzureKeyCredential con su key desde el portal de Azure y una instancia DocumentIntelligenceClient de AzureKeyCredential y su Inteligencia de Documentos endpoint.
Cree un nuevo archivo Python denominado doc_intel_quickstart.py en el editor o IDE que prefiera.
Abra el archivo doc_intel_quickstart.py y seleccione uno de los ejemplos de código siguientes para copiar y pegar en la aplicación:
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la DocumentAnalysisClient clase . Para ello, cree un AzureKeyCredential con su key desde el portal de Azure y una instancia DocumentAnalysisClient de AzureKeyCredential y su Inteligencia de Documentos endpoint.
Cree un archivo Python denominado form_recognizer_quickstart.py en el editor o IDE que prefiera.
Abra el archivo form_recognizer_quickstart.py y seleccione uno de los ejemplos de código siguientes para copiar y pegar en la aplicación:
Importante
Recomendamos la autenticación de Microsoft Entra ID con identidades administradas para los recursos de Azure para evitar almacenar credenciales en sus aplicaciones que se ejecutan en la nube.
Use las claves de API con precaución. No incluya la clave de API directamente en el código y nunca la publique públicamente. Si usa claves de API, almacénelas de forma segura en Azure Key Vault, gire las claves periódicamente y restrinja el acceso a Azure Key Vault mediante el control de acceso basado en rol y las restricciones de acceso de red. Para obtener más información sobre el uso de claves de API de forma segura en las aplicaciones, consulte CLAVESAPI con Azure Key Vault.
Para obtener más información sobre la seguridad de los servicios de inteligencia artificial, consulte
Modelo de diseño
Extraiga texto, marcas de selección, estilos de texto, estructuras de tabla y coordenadas de la región delimitadora de documentos.
- En este ejemplo, necesitará un archivo de documento desde una dirección URL. Puede usar nuestro documento sample para este inicio rápido.
- Hemos agregado el valor de dirección URL del archivo a la
formUrlvariable de laanalyze_layoutfunción .
Agregue el ejemplo de código siguiente a la aplicación doc_intel_quickstart.py. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
# helper functions
def get_words(page, line):
result = []
for word in page.words:
if _in_span(word, line.spans):
result.append(word)
return result
def _in_span(word, spans):
for span in spans:
if word.span.offset >= span.offset and (
word.span.offset + word.span.length
) <= (span.offset + span.length):
return True
return False
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_intelligence_client = DocumentIntelligenceClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-layout", AnalyzeDocumentRequest(url_source=formUrl
))
result: AnalyzeResult = poller.result()
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}'"
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, compile y ejecute el programa:
Vaya a la carpeta donde tiene el archivo doc_intel_quickstart.py .
Escriba el siguiente comando en el terminal:
python doc_intel_quickstart.py
Para analizar un archivo determinado en una dirección URL, use el begin_analyze_document_from_url método y pase prebuilt-layout como identificador de modelo. El valor devuelto es un result objeto que contiene datos sobre el documento enviado.
Agregue el ejemplo de código siguiente a la aplicación de form_recognizer_quickstart.py. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", formUrl)
result = poller.result()
for idx, style in enumerate(result.styles):
print(
"Document contains {} content".format(
"handwritten" if style.is_handwritten else "no handwritten"
)
)
for page in result.pages:
print("----Analyzing layout from page #{}----".format(page.page_number))
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
page.width, page.height, page.unit
)
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
"...Line # {} has word count {} and text '{}' within bounding box '{}'".format(
line_idx,
len(words),
line.content,
format_polygon(line.polygon),
)
)
for word in words:
print(
"......Word '{}' has a confidence of {}".format(
word.content, word.confidence
)
)
for selection_mark in page.selection_marks:
print(
"...Selection mark is '{}' within bounding box '{}' and has a confidence of {}".format(
selection_mark.state,
format_polygon(selection_mark.polygon),
selection_mark.confidence,
)
)
for table_idx, table in enumerate(result.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
for region in table.bounding_regions:
print(
"Table # {} location on page: {} is {}".format(
table_idx,
region.page_number,
format_polygon(region.polygon),
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has content '{}'".format(
cell.row_index,
cell.column_index,
cell.content,
)
)
for region in cell.bounding_regions:
print(
"...content on page {} is within bounding box '{}'".format(
region.page_number,
format_polygon(region.polygon),
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, compile y ejecute el programa:
Vaya a la carpeta donde tiene el archivo form_recognizer_quickstart.py .
Escriba el siguiente comando en el terminal:
python form_recognizer_quickstart.py
Salida del modelo de diseño
Este es un fragmento de código de la salida esperada:
----Analyzing layout from page #1----
Page has width: 8.5 and height: 11.0, measured with unit: inch
...Line # 0 has word count 2 and text 'UNITED STATES' within bounding box '[3.4915, 0.6828], [5.0116, 0.6828], [5.0116, 0.8265], [3.4915, 0.8265]'
......Word 'UNITED' has a confidence of 1.0
......Word 'STATES' has a confidence of 1.0
...Line # 1 has word count 4 and text 'SECURITIES AND EXCHANGE COMMISSION' within bounding box '[2.1937, 0.9061], [6.297, 0.9061], [6.297, 1.0498], [2.1937, 1.0498]'
......Word 'SECURITIES' has a confidence of 1.0
......Word 'AND' has a confidence of 1.0
......Word 'EXCHANGE' has a confidence of 1.0
......Word 'COMMISSION' has a confidence of 1.0
...Line # 2 has word count 3 and text 'Washington, D.C. 20549' within bounding box '[3.4629, 1.1179], [5.031, 1.1179], [5.031, 1.2483], [3.4629, 1.2483]'
......Word 'Washington,' has a confidence of 1.0
......Word 'D.C.' has a confidence of 1.0
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo layout.
Agregue el ejemplo de código siguiente a la aplicación de form_recognizer_quickstart.py. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", formUrl
)
result = poller.result()
for idx, style in enumerate(result.styles):
print(
"Document contains {} content".format(
"handwritten" if style.is_handwritten else "no handwritten"
)
)
for page in result.pages:
print("----Analyzing layout from page #{}----".format(page.page_number))
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
page.width, page.height, page.unit
)
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
"...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
line_idx,
len(words),
line.content,
format_polygon(line.polygon),
)
)
for word in words:
print(
"......Word '{}' has a confidence of {}".format(
word.content, word.confidence
)
)
for selection_mark in page.selection_marks:
print(
"...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
selection_mark.state,
format_polygon(selection_mark.polygon),
selection_mark.confidence,
)
)
for table_idx, table in enumerate(result.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
for region in table.bounding_regions:
print(
"Table # {} location on page: {} is {}".format(
table_idx,
region.page_number,
format_polygon(region.polygon),
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has content '{}'".format(
cell.row_index,
cell.column_index,
cell.content,
)
)
for region in cell.bounding_regions:
print(
"...content on page {} is within bounding polygon '{}'".format(
region.page_number,
format_polygon(region.polygon),
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, compile y ejecute el programa:
Vaya a la carpeta donde tiene el archivo form_recognizer_quickstart.py .
Escriba el siguiente comando en el terminal:
python form_recognizer_quickstart.py
Modelo precompilado
Analice y extraiga campos comunes de tipos de documentos específicos mediante un modelo precompilado. En este ejemplo, analizamos una factura mediante el modelo de factura precompilado .
Propina
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Consulte extracción de datos del modelo.
- Analice una factura mediante el modelo de factura precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor de dirección URL del archivo a la
invoiceUrlvariable en la parte superior del archivo. - Por motivos de simplicidad, no se muestran aquí todos los pares clave-valor que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Agregue el ejemplo de código siguiente a la aplicación doc_intel_quickstart.py. Asegúrese de actualizar las variables de clave y punto de conexión con valores de la instancia de Document Intelligence del portal de Azure:
# import libraries
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult
from azure.ai.documentintelligence.models import AnalyzeDocumentRequest
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def analyze_invoice():
# sample document
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
document_intelligence_client = DocumentIntelligenceClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_intelligence_client.begin_analyze_document(
"prebuilt-invoice", AnalyzeDocumentRequest(url_source=invoiceUrl)
)
invoices = poller.result()
if invoices.documents:
for idx, invoice in enumerate(invoices.documents):
print(f"--------Analyzing invoice #{idx + 1}--------")
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print(
f"Vendor Name: {vendor_name.get('content')} has confidence: {vendor_name.get('confidence')}"
)
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print(
f"Vendor Address: {vendor_address.get('content')} has confidence: {vendor_address.get('confidence')}"
)
vendor_address_recipient = invoice.fields.get("VendorAddressRecipient")
if vendor_address_recipient:
print(
f"Vendor Address Recipient: {vendor_address_recipient.get('content')} has confidence: {vendor_address_recipient.get('confidence')}"
)
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print(
f"Customer Name: {customer_name.get('content')} has confidence: {customer_name.get('confidence')}"
)
customer_id = invoice.fields.get("CustomerId")
if customer_id:
print(
f"Customer Id: {customer_id.get('content')} has confidence: {customer_id.get('confidence')}"
)
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print(
f"Customer Address: {customer_address.get('content')} has confidence: {customer_address.get('confidence')}"
)
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print(
f"Customer Address Recipient: {customer_address_recipient.get('content')} has confidence: {customer_address_recipient.get('confidence')}"
)
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print(
f"Invoice Id: {invoice_id.get('content')} has confidence: {invoice_id.get('confidence')}"
)
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print(
f"Invoice Date: {invoice_date.get('content')} has confidence: {invoice_date.get('confidence')}"
)
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print(
f"Invoice Total: {invoice_total.get('content')} has confidence: {invoice_total.get('confidence')}"
)
due_date = invoice.fields.get("DueDate")
if due_date:
print(
f"Due Date: {due_date.get('content')} has confidence: {due_date.get('confidence')}"
)
purchase_order = invoice.fields.get("PurchaseOrder")
if purchase_order:
print(
f"Purchase Order: {purchase_order.get('content')} has confidence: {purchase_order.get('confidence')}"
)
billing_address = invoice.fields.get("BillingAddress")
if billing_address:
print(
f"Billing Address: {billing_address.get('content')} has confidence: {billing_address.get('confidence')}"
)
billing_address_recipient = invoice.fields.get("BillingAddressRecipient")
if billing_address_recipient:
print(
f"Billing Address Recipient: {billing_address_recipient.get('content')} has confidence: {billing_address_recipient.get('confidence')}"
)
shipping_address = invoice.fields.get("ShippingAddress")
if shipping_address:
print(
f"Shipping Address: {shipping_address.get('content')} has confidence: {shipping_address.get('confidence')}"
)
shipping_address_recipient = invoice.fields.get("ShippingAddressRecipient")
if shipping_address_recipient:
print(
f"Shipping Address Recipient: {shipping_address_recipient.get('content')} has confidence: {shipping_address_recipient.get('confidence')}"
)
print("Invoice items:")
for idx, item in enumerate(invoice.fields.get("Items").get("valueArray")):
print(f"...Item #{idx + 1}")
item_description = item.get("valueObject").get("Description")
if item_description:
print(
f"......Description: {item_description.get('content')} has confidence: {item_description.get('confidence')}"
)
item_quantity = item.get("valueObject").get("Quantity")
if item_quantity:
print(
f"......Quantity: {item_quantity.get('content')} has confidence: {item_quantity.get('confidence')}"
)
unit = item.get("valueObject").get("Unit")
if unit:
print(
f"......Unit: {unit.get('content')} has confidence: {unit.get('confidence')}"
)
unit_price = item.get("valueObject").get("UnitPrice")
if unit_price:
unit_price_code = (
unit_price.get("valueCurrency").get("currencyCode")
if unit_price.get("valueCurrency").get("currencyCode")
else ""
)
print(
f"......Unit Price: {unit_price.get('content')}{unit_price_code} has confidence: {unit_price.get('confidence')}"
)
product_code = item.get("valueObject").get("ProductCode")
if product_code:
print(
f"......Product Code: {product_code.get('content')} has confidence: {product_code.get('confidence')}"
)
item_date = item.get("valueObject").get("Date")
if item_date:
print(
f"......Date: {item_date.get('content')} has confidence: {item_date.get('confidence')}"
)
tax = item.get("valueObject").get("Tax")
if tax:
print(
f"......Tax: {tax.get('content')} has confidence: {tax.get('confidence')}"
)
amount = item.get("valueObject").get("Amount")
if amount:
print(
f"......Amount: {amount.get('content')} has confidence: {amount.get('confidence')}"
)
subtotal = invoice.fields.get("SubTotal")
if subtotal:
print(
f"Subtotal: {subtotal.get('content')} has confidence: {subtotal.get('confidence')}"
)
total_tax = invoice.fields.get("TotalTax")
if total_tax:
print(
f"Total Tax: {total_tax.get('content')} has confidence: {total_tax.get('confidence')}"
)
previous_unpaid_balance = invoice.fields.get("PreviousUnpaidBalance")
if previous_unpaid_balance:
print(
f"Previous Unpaid Balance: {previous_unpaid_balance.get('content')} has confidence: {previous_unpaid_balance.get('confidence')}"
)
amount_due = invoice.fields.get("AmountDue")
if amount_due:
print(
f"Amount Due: {amount_due.get('content')} has confidence: {amount_due.get('confidence')}"
)
service_start_date = invoice.fields.get("ServiceStartDate")
if service_start_date:
print(
f"Service Start Date: {service_start_date.get('content')} has confidence: {service_start_date.get('confidence')}"
)
service_end_date = invoice.fields.get("ServiceEndDate")
if service_end_date:
print(
f"Service End Date: {service_end_date.get('content')} has confidence: {service_end_date.get('confidence')}"
)
service_address = invoice.fields.get("ServiceAddress")
if service_address:
print(
f"Service Address: {service_address.get('content')} has confidence: {service_address.get('confidence')}"
)
service_address_recipient = invoice.fields.get("ServiceAddressRecipient")
if service_address_recipient:
print(
f"Service Address Recipient: {service_address_recipient.get('content')} has confidence: {service_address_recipient.get('confidence')}"
)
remittance_address = invoice.fields.get("RemittanceAddress")
if remittance_address:
print(
f"Remittance Address: {remittance_address.get('content')} has confidence: {remittance_address.get('confidence')}"
)
remittance_address_recipient = invoice.fields.get(
"RemittanceAddressRecipient"
)
if remittance_address_recipient:
print(
f"Remittance Address Recipient: {remittance_address_recipient.get('content')} has confidence: {remittance_address_recipient.get('confidence')}"
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_invoice()
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, compile y ejecute el programa:
Vaya a la carpeta donde tiene el archivo doc_intel_quickstart.py .
Escriba el siguiente comando en el terminal:
python doc_intel_quickstart.py
Para analizar un archivo determinado en un URI, use el begin_analyze_document_from_url método y pase prebuilt-invoice como identificador de modelo. El valor devuelto es un result objeto que contiene datos sobre el documento enviado.
Agregue el ejemplo de código siguiente a la aplicación de form_recognizer_quickstart.py. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def format_bounding_region(bounding_regions):
if not bounding_regions:
return "N/A"
return ", ".join(
"Page #{}: {}".format(region.page_number, format_polygon(region.polygon))
for region in bounding_regions
)
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def analyze_invoice():
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-invoice", invoiceUrl
)
invoices = poller.result()
for idx, invoice in enumerate(invoices.documents):
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,
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_invoice()
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, compile y ejecute el programa:
Vaya a la carpeta donde tiene el archivo form_recognizer_quickstart.py .
Escriba el siguiente comando en el terminal:
python form_recognizer_quickstart.py
Salida del modelo precompilado
Este es un fragmento de código de la salida esperada:
--------Recognizing invoice #1--------
Vendor Name: CONTOSO LTD. has confidence: 0.919
Vendor Address: 123 456th St New York, NY, 10001 has confidence: 0.907
Vendor Address Recipient: Contoso Headquarters has confidence: 0.919
Customer Name: MICROSOFT CORPORATION has confidence: 0.84
Customer Id: CID-12345 has confidence: 0.956
Customer Address: 123 Other St, Redmond WA, 98052 has confidence: 0.909
Customer Address Recipient: Microsoft Corp has confidence: 0.917
Invoice Id: INV-100 has confidence: 0.972
Invoice Date: 2019-11-15 has confidence: 0.971
Invoice Total: CurrencyValue(amount=110.0, symbol=$) has confidence: 0.97
Due Date: 2019-12-15 has confidence: 0.973
Para ver toda la salida, visite el repositorio de ejemplos de Azure en GitHub para ver la salida del modelo de factura precompilado.
Agregue el ejemplo de código siguiente a la aplicación de form_recognizer_quickstart.py. Asegúrese de actualizar las variables de clave y punto de conexión con los valores de la instancia de Form Recognizer de su portal de Azure.
# import libraries
import os
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
# set `<your-endpoint>` and `<your-key>` variables with the values from the Azure portal
endpoint = "<your-endpoint>"
key = "<your-key>"
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def analyze_layout():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document_from_url(
"prebuilt-layout", formUrl
)
result = poller.result()
for idx, style in enumerate(result.styles):
print(
"Document contains {} content".format(
"handwritten" if style.is_handwritten else "no handwritten"
)
)
for page in result.pages:
print("----Analyzing layout from page #{}----".format(page.page_number))
print(
"Page has width: {} and height: {}, measured with unit: {}".format(
page.width, page.height, page.unit
)
)
for line_idx, line in enumerate(page.lines):
words = line.get_words()
print(
"...Line # {} has word count {} and text '{}' within bounding polygon '{}'".format(
line_idx,
len(words),
line.content,
format_polygon(line.polygon),
)
)
for word in words:
print(
"......Word '{}' has a confidence of {}".format(
word.content, word.confidence
)
)
for selection_mark in page.selection_marks:
print(
"...Selection mark is '{}' within bounding polygon '{}' and has a confidence of {}".format(
selection_mark.state,
format_polygon(selection_mark.polygon),
selection_mark.confidence,
)
)
for table_idx, table in enumerate(result.tables):
print(
"Table # {} has {} rows and {} columns".format(
table_idx, table.row_count, table.column_count
)
)
for region in table.bounding_regions:
print(
"Table # {} location on page: {} is {}".format(
table_idx,
region.page_number,
format_polygon(region.polygon),
)
)
for cell in table.cells:
print(
"...Cell[{}][{}] has content '{}'".format(
cell.row_index,
cell.column_index,
cell.content,
)
)
for region in cell.bounding_regions:
print(
"...content on page {} is within bounding polygon '{}'".format(
region.page_number,
format_polygon(region.polygon),
)
)
print("----------------------------------------")
if __name__ == "__main__":
analyze_layout()
Ejecución de la aplicación
Después de agregar un ejemplo de código a la aplicación, compile y ejecute el programa:
Vaya a la carpeta donde tiene el archivo form_recognizer_quickstart.py .
Escriba el siguiente comando en el terminal:
python form_recognizer_quickstart.py
En este inicio rápido, aprenderá a usar la API REST de Document Intelligence para analizar y extraer datos y valores de documentos:
Requisitos previos
suscripción a Azure: Crear una gratuita
La herramienta de línea de comandos
cURLha sido instalada.Versión 7.*+ de PowerShell (o una aplicación de línea de comandos similar).
Para comprobar la versión de PowerShell, escriba el comando siguiente en relación con el sistema operativo:
- Windows:
Get-Host | Select-Object Version - macOS o Linux:
$PSVersionTable
- Windows:
Un recurso de inteligencia de documentos (servicio único) o herramientas de foundry (multi-servicio). Una vez que tenga la suscripción de Azure, cree un recurso de Document Intelligence de un solo servicio o múltiples servicios en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.
Propina
Cree un recurso de Microsoft Foundry si planea acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Necesita un recurso de un solo servicio si piensa usar autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Análisis de documentos y obtención de resultados
Una solicitud POST se usa para analizar documentos con un modelo precompilado o personalizado. Se usa una solicitud GET para recuperar el resultado de una llamada de análisis de documentos.
modelId se usa con POST y resultId con operaciones GET.
Analizar el documento (solicitud POST)
Antes de ejecutar el comando cURL, realice los siguientes cambios en la solicitud POST:
Reemplaza
{endpoint}con el valor del endpoint de tu instancia de Document Intelligence en el portal de Azure.Reemplaza
{key}por la clave de la instancia de Document Intelligence en el portal de Azure.Con la tabla siguiente como referencia, reemplace
{modelID}y{your-document-url}por los valores deseados.Necesita un archivo de documento en una dirección URL. Para este inicio rápido, puede usar los formularios de ejemplo proporcionados en la tabla siguiente para cada característica:
Documentos de ejemplo
| Característica | {modelID} | {your-document-url} |
|---|---|---|
| Lectura | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Diseño | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Tarjeta de seguro de salud | prebuilt-healthInsuranceCard.us |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
| W-2 | prebuilt-tax.us.w2 |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
| Factura | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Recibo | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| Documento de identificador | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Documentos de ejemplo
| Característica | {modelID} | {your-document-url} |
|---|---|---|
| Documento general | prebuilt-document |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
| Lectura | prebuilt-read |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
| Diseño | prebuilt-layout |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
| Tarjeta de seguro de salud | prebuilt-healthInsuranceCard.us |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/insurance-card.png |
| W-2 | prebuilt-tax.us.w2 |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/w2.png |
| Factura | prebuilt-invoice |
https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
| Recibo | prebuilt-receipt |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
| Documento de identificador | prebuilt-idDocument |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
| Tarjeta de presentación | prebuilt-businessCard |
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Importante
Recuerde quitar la clave del código cuando haya terminado y nunca publicarla públicamente. Para producción, use una forma segura de almacenar y acceder a sus credenciales, como Azure Key Vault. Para obtener más información, consulte la seguridad de las herramientas de fundición.
Solicitud POST
curl -v -i -X POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-11-30" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelID}:analyze?api-version=2023-07-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
curl -v -i POST "{endpoint}/formrecognizer/documentModels/{modelId}:analyze?api-version=2022-08-31" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
Respuesta de POST (resultID)
Recibirá una 202 (Success) respuesta que incluye un encabezado Operation-Location de solo lectura. El valor de este encabezado contiene un resultID que se puede consultar para obtener el estado de la operación asincrónica y recuperar los resultados mediante una solicitud GET con la misma clave de suscripción de recursos:
Obtención de resultados de análisis (solicitud GET)
Después de llamar a la API Analyze document, llame a la API Get analyze result para obtener el estado de la operación y los datos extraídos. Antes de ejecutar el comando, realice estos cambios:
Después de llamar a la API Analyze document, llame a la API de obtener resultado del análisis para obtener el estado de la operación y los datos extraídos. Antes de ejecutar el comando, realice estos cambios:
Después de llamar a la API Analyze document, llame a la API Get Analyze Result para obtener el estado de la operación y los datos extraídos. Antes de ejecutar el comando, realice estos cambios:
Reemplace el encabezado
{resultID}Operation-Location de la respuesta POST.Reemplace
{key}por el valor de clave de la instancia de Document Intelligence en el portal de Azure.
Solicitud GET
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-11-30" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2023-07-31" -H "Ocp-Apim-Subscription-Key: {key}"
curl -v -X GET "{endpoint}/formrecognizer/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2022-08-31" -H "Ocp-Apim-Subscription-Key: {key}"
Examen de la respuesta
Recibes una respuesta 200 (Success) con la salida JSON. El primer campo, "status", indica el estado de la operación. Si la operación no se completa, el valor de "status" es "running" o "notStarted", y debe llamar a la API de nuevo, ya sea manualmente o a través de un script. Se recomienda un intervalo de un segundo o más entre llamadas.
Respuesta de ejemplo para la factura precompilada
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-11-30",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2023-08-25T19:31:37Z",
"lastUpdatedDateTime": "2023-08-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2023-07-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
{
"status": "succeeded",
"createdDateTime": "2022-09-25T19:31:37Z",
"lastUpdatedDateTime": "2022-09-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2022-08-31",
"modelId": "prebuilt-invoice",
"stringIndexType": "textElements"...
..."pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"words": [
{
"content": "CONTOSO",
"boundingBox": [
0.5911,
0.6857,
1.7451,
0.6857,
1.7451,
0.8664,
0.5911,
0.8664
],
"confidence": 1,
"span": {
"offset": 0,
"length": 7
}
}],
}]
}
}
Campos de documentos admitidos
Los modelos precompilados extraen conjuntos predefinidos de campos de documento. Consulte Extracción de datos de modelos para obtener nombres de campo extraídos, tipos, descripciones y ejemplos.
¡Eso es todo, felicitaciones!
En este inicio rápido, ha usado un modelo de inteligencia de documentos para analizar varios formularios y documentos. A continuación, explore Document Intelligence Studio y la documentación de referencia para obtener información sobre Document Intelligence API a fondo.
Pasos siguientes
Para obtener una experiencia mejorada y una calidad avanzada del modelo, pruebe Document Intelligence Studio.
Para la migración de v3.1 a v4.0, consulte Guías de migración de registro de cambios.
Este contenido se aplica a:
v2.1 | Versión más reciente:
v4.0 (GA)
Comience con Azure Document Intelligence usando el lenguaje de programación que prefiera o la API REST. Document Intelligence es un servicio Foundry Tools basado en la nube que usa el aprendizaje automático para extraer pares clave-valor, texto y tablas de tus documentos. Se recomienda usar el servicio gratuito cuando esté aprendiendo la tecnología. Recuerde que el número de páginas gratuitas está limitado a 500 al mes.
Para obtener más información sobre las características y las opciones de desarrollo de Document Intelligence, visite nuestra página de información general .
Reference documentation | Library source code | Package (NuGet) | Samples
En este inicio rápido, usará las siguientes API para extraer datos estructurados de formularios y documentos:
Requisitos previos
suscripción a Azure: Crear una gratuita.
La versión actual de IDE de Visual Studio.
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de inteligencia de documentos de servicio único o de servicios múltiples en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Propina
Cree un recurso de foundry si tiene previsto acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Tenga en cuenta que necesitará un recurso de servicio exclusivo si piensa usar la autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Inicia Visual Studio 2019.
En la página de inicio, elija Crear un nuevo proyecto.
En la página Crear un nuevo proyecto, escriba la consola en el cuadro de búsqueda. Elija la plantilla Aplicación de consola y, a continuación, elija Siguiente.
En la ventana de diálogo Configurar tu nuevo proyecto, escriba
formRecognizer_quickstarten el cuadro de nombre del proyecto. A continuación, elija Siguiente.
En la ventana de diálogo de información adicional, seleccione .NET 5.0 (Actual) y después seleccione Crear.
Instalación de la biblioteca cliente con NuGet
Haga clic con el botón derecho en el proyecto de formRecognizer_quickstart y seleccione Administrar paquetes NuGet... .
Seleccione la pestaña Examinar y escriba Azure. IA. FormRecognizer.
Seleccione la versión 3.1.1 en el menú desplegable y seleccione Instalar.
Compilación de la aplicación
Para interactuar con el servicio De inteligencia de documentos, debe crear una instancia de la FormRecognizerClient clase . Para ello, cree un AzureKeyCredential con tu clave y una FormRecognizerClient instancia con AzureKeyCredential y la inteligencia endpoint de documentos.
Nota
- A partir de .NET 6, los nuevos proyectos que usan la plantilla
consolegeneran un nuevo estilo de programa que difiere de las versiones anteriores. - La nueva salida usa características recientes de C# que simplifican el código que necesita escribir.
- Cuando se usa la versión más reciente, solo es necesario escribir el cuerpo del
Mainmétodo. No es necesario incluir instrucciones de nivel superior, directivas de uso global ni directivas using implícitas. - Para obtener más información, consulteNuevas plantillas de C# para generar instrucciones de nivel superior.
Abra el archivo Program.cs .
Incluya las siguientes directivas using:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- Establezca sus variables de entorno
endpointykeyy cree su instanciaAzureKeyCredentialyFormRecognizerClient.
private static readonly string endpoint = "your-form-recognizer-endpoint";
private static readonly string key = "your-api-key";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(key);
Elimine la línea,
Console.Writeline("Hola mundo!");y agregue uno de los Try It ejemplos de código a Program.cs archivo:
Seleccione un ejemplo de código para copiar y pegar en el método Main de la aplicación:
Importante
Recuerde quitar la clave del código cuando haya terminado y nunca publicarla públicamente. Para producción, use una forma segura de almacenar y acceder a sus credenciales, como Azure Key Vault. Para obtener más información, consulte el artículo seguridad de Foundry Tools.
Pruébelo: Modelo de diseño
Extraiga texto, marcas de selección, estilos de texto y estructuras de tabla, junto con sus coordenadas de las regiones delimitadoras del documento.
- En este ejemplo, necesitará un archivo de documento en un URI. Puede usar nuestro documento sample para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
formUrivariable . - Para extraer el esquema de un archivo localizado en un URI, use el método
StartRecognizeContentFromUriAsync.
Agregue el siguiente código al archivo Program.cs de la aplicación de diseño:
FormRecognizerClient recognizerClient = AuthenticateClient();
Task recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);
private static FormRecognizerClient AuthenticateClient()
{
var credential = new AzureKeyCredential(key);
var client = new FormRecognizerClient(new Uri(endpoint), credential);
return client;
}
private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
{
string formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
FormPageCollection formPages = await recognizerClient
.StartRecognizeContentFromUri(new Uri(formUrl))
.WaitForCompletionAsync();
foreach (FormPage page in formPages)
{
Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");
for (int i = 0; i < page.Lines.Count; i++)
{
FormLine line = page.Lines[i];
Console.WriteLine($" Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
}
for (int i = 0; i < page.Tables.Count; i++)
{
FormTable table = page.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (FormTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
}
}
}
}
}
}
Pruébelo: Modelo precompilado
En este ejemplo se muestra cómo analizar datos de determinados tipos de documentos comunes con modelos entrenados previamente, usando una factura como ejemplo.
- En este ejemplo, analizaremos un documento de factura mediante un modelo precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
invoiceUrivariable en la parte superior del método Main. - Para analizar un archivo determinado en un URI, use el
StartRecognizeInvoicesFromUriAsyncmétodo . - Por motivos de simplicidad, no se muestran aquí todos los campos que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Elección de un modelo precompilado
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la operación de análisis depende del tipo de documento que se va a analizar. Estos son los modelos precompilados admitidos actualmente por el servicio Document Intelligence:
- Factura: extrae texto, marcas de selección, tablas, campos e información clave de las facturas.
- Recibo: extrae el texto y la información clave de los recibos.
- Documento de identificación: extrae el texto y la información clave de las licencias de conducir y los pasaportes internacionales.
- Tarjeta de presentación: extrae el texto y la información clave de las tarjetas de presentación.
Agregue el siguiente código al método del archivo Program.cs de su aplicación de factura precompilada.
FormRecognizerClient recognizerClient = AuthenticateClient();
Task analyzeinvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
Task.WaitAll(analyzeinvoice);
private static FormRecognizerClient AuthenticateClient() {
var credential = new AzureKeyCredential(key);
var client = new FormRecognizerClient(new Uri(endpoint), credential);
return client;
}
static string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
private static async Task AnalyzeInvoice(FormRecognizerClient recognizerClient, string invoiceUrl) {
var options = new RecognizeInvoicesOptions() {
Locale = "en-US"
};
RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(new Uri(invoiceUrl), options).WaitForCompletionAsync();
RecognizedForm invoice = invoices[0];
FormField invoiceIdField;
if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
if (invoiceIdField.Value.ValueType == FieldValueType.String) {
string invoiceId = invoiceIdField.Value.AsString();
Console.WriteLine($" Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
}
}
FormField invoiceDateField;
if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
DateTime invoiceDate = invoiceDateField.Value.AsDate();
Console.WriteLine($" Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
}
}
FormField dueDateField;
if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
if (dueDateField.Value.ValueType == FieldValueType.Date) {
DateTime dueDate = dueDateField.Value.AsDate();
Console.WriteLine($" Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
}
}
FormField vendorNameField;
if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
if (vendorNameField.Value.ValueType == FieldValueType.String) {
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($" Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
FormField vendorAddressField;
if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
if (vendorAddressField.Value.ValueType == FieldValueType.String) {
string vendorAddress = vendorAddressField.Value.AsString();
Console.WriteLine($" Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
}
}
FormField customerNameField;
if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
if (customerNameField.Value.ValueType == FieldValueType.String) {
string customerName = customerNameField.Value.AsString();
Console.WriteLine($" Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
FormField customerAddressField;
if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
if (customerAddressField.Value.ValueType == FieldValueType.String) {
string customerAddress = customerAddressField.Value.AsString();
Console.WriteLine($" Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
}
}
FormField customerAddressRecipientField;
if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
Console.WriteLine($" Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
}
}
FormField invoiceTotalField;
if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
float invoiceTotal = invoiceTotalField.Value.AsFloat();
Console.WriteLine($" Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
}
}
}
}
}
Ejecución de la aplicación
Elija el botón verde Inicio situado junto a formRecognizer_quickstart para compilar y ejecutar el programa, o presione F5.
Reference documentation | Library source code | Package (Maven) | Samples
En este inicio rápido, usará las siguientes API para extraer datos estructurados de formularios y documentos:
Requisitos previos
suscripción a Azure: Crear una gratuita.
Un Java Kit de desarrollo (JDK) versión 8 o posterior. Para obtener más información, consulte Versiones de Java compatibles y programación de actualizaciones.
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de inteligencia de documentos de servicio único o de servicios múltiples en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Creación de un nuevo proyecto de Gradle
En una ventana de consola (como cmd, PowerShell o Bash), cree un directorio para la aplicación denominada form-recognizer-app y vaya a ella.
mkdir form-recognizer-app && form-recognizer-app
Ejecute el comando desde el
gradle initdirectorio de trabajo. Este comando crea archivos de compilación esenciales para Gradle, incluido build.gradle.kts, que se usa en tiempo de ejecución para crear y configurar la aplicación.gradle init --type basicCuando se le pida que elija un DSL, seleccione Kotlin.
Acepte el nombre de proyecto predeterminado (form-recognizer-app)
Instalación de la biblioteca cliente
En este inicio rápido se usa el administrador de dependencias de Gradle. Puede encontrar la biblioteca cliente e información de otros administradores de dependencias en el repositorio central de Maven.
En el archivo build.gradle.kts del proyecto, incluya la biblioteca cliente como una implementation instrucción, junto con los complementos y la configuración necesarios.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Creación de un archivo de Java
En el directorio de trabajo, ejecute el siguiente comando:
mkdir -p src/main/java
Cree la siguiente estructura de directorios:
Vaya al directorio Java y cree un archivo denominado FormRecognizer.java. Ábralo en el editor o IDE de su preferencia y agregue la siguiente declaración de paquete y las instrucciones import.
import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.models.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;
Seleccione un ejemplo de código para copiar y pegar en el método principal de la aplicación:
Importante
Recuerde quitar la clave del código cuando haya terminado y nunca publicarla públicamente. Para producción, use una forma segura de almacenar y acceder a sus credenciales, como Azure Key Vault. Para obtener más información, consulte la seguridad de las herramientas de fundición.
Pruébelo: Modelo de diseño
Extraiga texto, marcas de selección, estilos de texto y estructuras de tabla, junto con sus coordenadas de las regiones delimitadoras del documento.
- En este ejemplo, necesitará un archivo de documento en un URI. Puede usar nuestro documento sample para este inicio rápido.
- Para analizar un archivo determinado en una URI, usará el método
beginRecognizeContentFromUrl. - Hemos agregado el valor del URI de archivo a la
formUrlvariable en el método main.
Actualice la clase
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
.credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf";
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);
}
private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
String analyzeFilePath = invoiceUri;
SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
.beginRecognizeContentFromUrl(analyzeFilePath);
List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
// </snippet_getcontent_call>
// <snippet_getcontent_print>
contentResult.forEach(formPage -> {
// Table information
System.out.println("----Recognizing content ----");
System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
formPage.getHeight(), formPage.getUnit());
formPage.getTables().forEach(formTable -> {
System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
formTable.getColumnCount());
formTable.getCells().forEach(formTableCell -> {
System.out.printf("Cell has text %s.%n", formTableCell.getText());
});
System.out.println();
});
});
}
Pruébelo: Modelo precompilado
En este ejemplo se muestra cómo analizar datos de determinados tipos de documentos comunes con modelos entrenados previamente, usando una factura como ejemplo.
- En este ejemplo, analizaremos un documento de factura mediante un modelo precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Para analizar un archivo determinado en un URI, usará el
beginRecognizeInvoicesFromUrl. - Hemos agregado el valor del URI de archivo a la
invoiceUrlvariable en el método main. - Por motivos de simplicidad, no se muestran aquí todos los campos que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Elección de un modelo precompilado
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Estos son los modelos precompilados admitidos actualmente por el servicio Document Intelligence:
- Factura: extrae texto, marcas de selección, tablas, campos e información clave de las facturas.
- Recibo: extrae el texto y la información clave de los recibos.
- Documento de identificación: extrae el texto y la información clave de las licencias de conducir y los pasaportes internacionales.
- Tarjeta de presentación: extrae el texto y la información clave de las tarjetas de presentación.
Actualice la clase
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
public static void main(String[] args) {
FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder().credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
String invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);
}
private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> recognizeInvoicesPoller = recognizerClient.beginRecognizeInvoicesFromUrl(invoiceUrl);
List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();
for (int i = 0; i < recognizedInvoices.size(); i++) {
RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
Map < String,
FormField > recognizedFields = recognizedInvoice.getFields();
System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
FormField vendorNameField = recognizedFields.get("VendorName");
if (vendorNameField != null) {
if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
String merchantName = vendorNameField.getValue().asString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
}
}
FormField vendorAddressField = recognizedFields.get("VendorAddress");
if (vendorAddressField != null) {
if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
String merchantAddress = vendorAddressField.getValue().asString();
System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
}
}
FormField customerNameField = recognizedFields.get("CustomerName");
if (customerNameField != null) {
if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
String merchantAddress = customerNameField.getValue().asString();
System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
}
}
FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
String customerAddr = customerAddressRecipientField.getValue().asString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
}
}
FormField invoiceIdField = recognizedFields.get("InvoiceId");
if (invoiceIdField != null) {
if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
String invoiceId = invoiceIdField.getValue().asString();
System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
}
}
FormField invoiceDateField = recognizedFields.get("InvoiceDate");
if (customerNameField != null) {
if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
LocalDate invoiceDate = invoiceDateField.getValue().asDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
}
}
FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
Float invoiceTotal = invoiceTotalField.getValue().asFloat();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
}
}
}
}
Compilación y ejecución de la aplicación
Vuelva al directorio principal del proyecto: form-recognizer-app.
- Compile la aplicación con el
buildcomando :
gradle build
- Ejecute la aplicación con el
runcomando :
gradle run
Reference documentation | Library source code | Package (npm) | Samples
En este inicio rápido, usará las siguientes API para extraer datos estructurados de formularios y documentos:
Requisitos previos
suscripción a Azure: Crear una gratuita.
La versión más reciente de Visual Studio Code o su IDE preferido.
La versión más reciente
LTSde Node.jsUn recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de inteligencia de documentos de servicio único o de servicios múltiples en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Propina
Cree un recurso de foundry si tiene previsto acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Tenga en cuenta que necesitará un recurso de servicio exclusivo si piensa usar la autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Cree una nueva aplicación de Node.js. En una ventana de consola (como cmd, PowerShell o Bash), cree un directorio para la aplicación y vaya a ella.
mkdir form-recognizer-app && cd form-recognizer-appEjecute el
npm initcomando para crear una aplicación de nodo con unpackage.jsonarchivo.npm initInstale el paquete npm de la
ai-form-recognizerbiblioteca cliente:npm install @azure/ai-form-recognizerEl archivo de aplicación
package.jsonse actualiza con las dependencias.Cree un archivo denominado
index.js, ábralo e importe las bibliotecas siguientes:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");Cree variables para el punto de conexión y la clave de Azure del recurso:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";En este momento, la aplicación de JavaScript debe contener las siguientes líneas de código:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Seleccione un ejemplo de código para copiar y pegar en la aplicación:
Importante
Recuerde quitar la clave del código cuando haya terminado y nunca publicarla públicamente. Para producción, use una forma segura de almacenar y acceder a sus credenciales, como Azure Key Vault. Para obtener más información, consulte la seguridad de las herramientas de fundición.
Pruébelo: Modelo de diseño
- En este ejemplo, necesitará un archivo de documento en un URI. Puede usar nuestro documento sample para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
formUrlvariable cerca de la parte superior del archivo. - Para analizar un archivo determinado en una URI, usará el método
beginRecognizeContent.
Agregue el código siguiente a la aplicación de diseño en la línea debajo de la key variable
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
async function recognizeContent() {
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginRecognizeContentFromUrl(formUrl);
const pages = await poller.pollUntilDone();
if (!pages || pages.length === 0) {
throw new Error("Expecting non-empty list of pages!");
}
for (const page of pages) {
console.log(
`Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
);
for (const table of page.tables) {
for (const cell of table.cells) {
console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
}
}
}
}
recognizeContent().catch((err) => {
console.error("The sample encountered an error:", err);
});
Pruébelo: Modelo precompilado
En este ejemplo se muestra cómo analizar datos de determinados tipos de documentos comunes con modelos entrenados previamente, usando una factura como ejemplo. Consulte nuestra página de concepto precompilada para obtener una lista completa de los campos de factura.
- En este ejemplo, analizaremos un documento de factura mediante un modelo precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
invoiceUrlvariable en la parte superior del archivo. - Para analizar un archivo determinado en una URI, usará el método
beginRecognizeInvoices. - Por motivos de simplicidad, no se muestran aquí todos los campos que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Elección de un modelo precompilado
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Estos son los modelos precompilados admitidos actualmente por el servicio Document Intelligence:
- Factura: extrae texto, marcas de selección, tablas, campos e información clave de las facturas.
- Recibo: extrae el texto y la información clave de los recibos.
- Documento de identificación: extrae el texto y la información clave de las licencias de conducir y los pasaportes internacionales.
- Tarjeta de presentación: extrae el texto y la información clave de las tarjetas de presentación.
Agregue el código siguiente a la aplicación de factura precompilada debajo de la key variable
const invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf";
async function recognizeInvoices() {
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(key));
const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl);
const [invoice] = await poller.pollUntilDone();
if (invoice === undefined) {
throw new Error("Failed to extract data from at least one invoice.");
}
/**
* This is a helper function for printing a simple field with an elemental type.
*/
function fieldToString(field) {
const {
name,
valueType,
value,
confidence
} = field;
return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
}
console.log("Invoice fields:");
/**
* Invoices contain a lot of optional fields, but they are all of elemental types
* such as strings, numbers, and dates, so we will just enumerate them all.
*/
for (const [name, field] of Object.entries(invoice.fields)) {
if (field.valueType !== "array" && field.valueType !== "object") {
console.log(`- ${name} ${fieldToString(field)}`);
}
}
// Invoices also support nested line items, so we can iterate over them.
let idx = 0;
console.log("- Items:");
const items = invoice.fields["Items"]?.value;
for (const item of items ?? []) {
const value = item.value;
// Each item has several subfields that are nested within the item. We'll
// map over this list of the subfields and filter out any fields that
// weren't found. Not all fields will be returned every time, only those
// that the service identified for the particular document in question.
const subFields = [
"Description",
"Quantity",
"Unit",
"UnitPrice",
"ProductCode",
"Date",
"Tax",
"Amount"
]
.map((fieldName) => value[fieldName])
.filter((field) => field !== undefined);
console.log(
[
` - Item #${idx}`,
// Now we will convert those fields into strings to display
...subFields.map((field) => ` - ${fieldToString(field)}`)
].join("\n")
);
}
}
recognizeInvoices().catch((err) => {
console.error("The sample encountered an error:", err);
});
Reference documentation | Library source code | Package (PyPi) | Samples
En este inicio rápido, usará las siguientes API para extraer datos estructurados de formularios y documentos:
Requisitos previos
suscripción a Azure: Crear una gratuita
-
- La instalación de Python debe incluir pip. Puede comprobar si ha instalado pip mediante la ejecución
pip --versionen la línea de comandos. Obtenga pip instalando la versión más reciente de Python.
- La instalación de Python debe incluir pip. Puede comprobar si ha instalado pip mediante la ejecución
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de inteligencia de documentos de servicio único o de servicios múltiples en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Propina
Cree un recurso de foundry si tiene previsto acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Tenga en cuenta que necesitará un recurso de servicio exclusivo si piensa usar la autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Configurar
Abra una ventana de terminal en el entorno local e instale la Azure Document Intelligence en la biblioteca cliente de Foundry Tools para Python con pip:
pip install azure-ai-formrecognizer
Creación de una nueva aplicación de Python
Cree una nueva aplicación de Python denominada form_recognizer_quickstart.py en el editor o IDE que prefiera. A continuación, importe las bibliotecas siguientes:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Crea variables para el punto de conexión y la clave del recurso de Azure
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
En este momento, la aplicación Python debe contener las siguientes líneas de código:
import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Seleccione un ejemplo de código para copiar y pegar en la aplicación:
Importante
Recuerde quitar la clave del código cuando haya terminado y nunca publicarla públicamente. Para producción, use una forma segura de almacenar y acceder a sus credenciales, como Azure Key Vault. Para obtener más información, consulte la seguridad de las herramientas de fundición.
Pruébelo: Modelo de diseño
- En este ejemplo, necesitará un archivo de documento en un URI. Puede usar nuestro documento sample para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la
formUrlvariable cerca de la parte superior del archivo. - Para analizar un archivo determinado en una URI, usará el método
begin_recognize_content_from_url.
Agregue el código siguiente a la aplicación de diseño en la línea debajo de la key variable
def format_bounding_box(bounding_box):
if not bounding_box:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in bounding_box])
def recognize_content():
# sample document
formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf"
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
form_pages = poller.result()
for idx, content in enumerate(form_pages):
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("----------------------------------------")
if __name__ == "__main__":
recognize_content()
Pruébelo: Modelo precompilado
En este ejemplo se muestra cómo analizar datos de determinados tipos de documentos comunes con modelos entrenados previamente, usando una factura como ejemplo. Consulte nuestra página de concepto precompilada para obtener una lista completa de los campos de factura.
- En este ejemplo, analizaremos un documento de factura mediante un modelo precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
- Hemos agregado el valor del URI de archivo a la variable ""formUrl" en la parte superior del archivo.
- Para analizar un archivo determinado en un URI, utilizará el método ‘begin_recognize_invoices_from_url’.
- Por motivos de simplicidad, no se muestran aquí todos los campos que devuelve el servicio. Para ver la lista de todos los campos admitidos y los tipos correspondientes, consulte la página Concepto de factura .
Elección de un modelo precompilado
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Estos son los modelos precompilados admitidos actualmente por el servicio Document Intelligence:
- Factura: extrae texto, marcas de selección, tablas, campos e información clave de las facturas.
- Recibo: extrae el texto y la información clave de los recibos.
- Documento de identificación: extrae el texto y la información clave de las licencias de conducir y los pasaportes internacionales.
- Tarjeta de presentación: extrae el texto y la información clave de las tarjetas de presentación.
Agregue el código siguiente a la aplicación de factura precompilada debajo de la key variable
def recognize_invoice():
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf"
form_recognizer_client = FormRecognizerClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = form_recognizer_client.begin_recognize_invoices_from_url(
invoiceUrl, locale="en-US"
)
invoices = poller.result()
for idx, invoice in enumerate(invoices):
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):
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,
)
)
if __name__ == "__main__":
recognize_invoice()
Ejecución de la aplicación
Vaya a la carpeta donde tiene el archivo form_recognizer_quickstart.py .
Escriba el siguiente comando en el terminal:
python form_recognizer_quickstart.py
| Document Intelligence REST API | Azure referencia de la API REST |
En este inicio rápido, usará las siguientes API para extraer datos estructurados de formularios y documentos:
Requisitos previos
suscripción a Azure: Crear una gratuita
cURL instalado.
PowerShell versión 6.0 o posterior, o una aplicación de línea de comandos similar.
Un recurso de Foundry Tools o Document Intelligence. Una vez que tenga la suscripción de Azure, cree un recurso de inteligencia de documentos de servicio único o de servicios múltiples en el portal de Azure para obtener la clave y el punto de conexión. Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un nivel de pago para producción.Propina
Cree un recurso de foundry si tiene previsto acceder a varias herramientas de Foundry en un único punto de conexión o clave. Para acceder únicamente a Document Intelligence, cree un recurso dedicado a Document Intelligence. Tenga en cuenta que necesitará un recurso de servicio exclusivo si piensa usar la autenticación de Microsoft Entra.
Después de implementar el recurso, seleccione Ir al recurso. Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación a Document Intelligence API. Pegue la clave y el punto de conexión en el código más adelante en el inicio rápido:
Seleccione un ejemplo de código para copiar y pegar en la aplicación:
Importante
Recuerde quitar la clave del código cuando haya terminado y nunca publicarla públicamente. Para producción, use una forma segura de almacenar y acceder a sus credenciales, como Azure Key Vault. Para obtener más información, consulte la seguridad de las herramientas de fundición.
Pruébelo: Modelo de diseño
- En este ejemplo, necesitará un archivo de documento en un URI. Puede usar nuestro documento sample para este inicio rápido.
- Reemplace por
{endpoint}el punto de conexión que obtuvo con la suscripción de Document Intelligence. - Reemplace por
{key}la clave que copió del paso anterior. - Reemplace
\"{your-document-url}con una dirección URL de un documento de ejemplo.
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
Solicitud
curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your-document-url}'}"
Operation-Location
Recibirá una 202 (Success) respuesta que incluye un encabezado Operation-Location . El valor de este encabezado contiene un identificador de resultado que puede usar para consultar el estado de la operación asincrónica y obtener los resultados:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
En el ejemplo siguiente, como parte de la dirección URL, la cadena después analyzeResults/ es el identificador de resultado.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Obtención de resultados de diseño
Después de llamar a la Analyze Layout API, debe llamar a la API Get Analyze Layout Result para obtener el estado de la operación y los datos extraídos. Antes de ejecutar el comando, realice estos cambios:
- Reemplace por
{endpoint}el punto de conexión que obtuvo con la suscripción de Document Intelligence. - Reemplace por
{key}la clave que copió del paso anterior. - Reemplace
{resultId}por el identificador de resultado del paso anterior.
Solicitud
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Examen de los resultados
Recibirá una 200 (success) respuesta con contenido JSON.
Consulte la siguiente imagen de factura y su salida JSON correspondiente.
- El
"readResults"nodo contiene todas las líneas de texto con la ubicación del cuadro delimitador correspondiente en la página. - El
selectionMarksnodo muestra cada marca de selección (casilla, marca de radio) y si su estado esselectedounselected. - La
"pageResults"sección incluye las tablas extraídas. Para cada tabla, se extraen el texto, el índice de fila y columna, la amplitud de filas y columnas, el cuadro delimitador y mucho más.
Cuerpo de la respuesta
Puede ver la salida de ejemplo completa en GitHub.
Pruébelo: Modelo precompilado
- En este ejemplo, analizaremos un documento de factura mediante un modelo precompilado. Puede usar nuestro documento de factura de ejemplo para este inicio rápido.
Elección de un modelo precompilado
No se limita a las facturas: hay varios modelos precompilados entre los que elegir, cada uno de los cuales tiene su propio conjunto de campos admitidos. El modelo que se va a usar para la analyze operación depende del tipo de documento que se va a analizar. Estos son los modelos precompilados admitidos actualmente por el servicio Document Intelligence:
- Factura: extrae texto, marcas de selección, tablas, campos e información clave de las facturas.
- Recibo: extrae el texto y la información clave de los recibos.
- Documento de identificación: extrae el texto y la información clave de las licencias de conducir y los pasaportes internacionales.
- Tarjeta de presentación: extrae el texto y la información clave de las tarjetas de presentación.
Antes de ejecutar el comando, realice estos cambios:
Reemplace por
{endpoint}el punto de conexión que obtuvo con la suscripción de Document Intelligence.Reemplace por
{key}la clave que copió del paso anterior.Reemplace
\"{your-document-url}con una URL de factura de ejemplo.https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
Solicitud
curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {key}" --data-ascii "{'urlSource': '{your invoice URL}'}"
Operation-Location
Recibirá una 202 (Success) respuesta que incluye un encabezado Operation-Location . El valor de este encabezado contiene un identificador de resultado que puede usar para consultar el estado de la operación asincrónica y obtener los resultados:
https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
En el ejemplo siguiente, como parte de la dirección URL, la cadena después de analyzeResults/ es el identificador de resultado.
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Obtención de los resultados de la factura
Después de llamar a la API Analyze Invoice, llame a la API Obtener Resultado de Análisis de Factura para obtener el estado de la operación y los datos extraídos. Antes de ejecutar el comando, realice estos cambios:
- Reemplace por
{endpoint}el punto de conexión que obtuvo con la clave de Inteligencia de documentos. Puede encontrarlo en la pestaña Información general del recurso de Document Intelligence. - Reemplace
{resultId}por el identificador de resultado del paso anterior. - Reemplace
{key}por su clave.
Solicitud
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Examen de la respuesta
Recibes una respuesta 200 (Success) con la salida JSON.
- El
"readResults"campo contiene todas las líneas de texto extraídas de la factura. -
"pageResults"incluye las tablas y los indicadores de selección extraídos de la factura. - El
"documentResults"campo contiene información de clave y valor para las partes más relevantes de la factura.
Consulte el documento Sample invoice.
Cuerpo de la respuesta
¡Eso es todo, bien hecho!
Pasos siguientes
Para obtener una experiencia mejorada y una calidad avanzada del modelo, pruebe Document Intelligence Studio.
Studio admite cualquier modelo entrenado con datos etiquetados v2.1.
Los registros de cambios proporcionan información detallada sobre la migración de v3.1 a v4.0.