Belge Zekası'yla çalışmaya başlama
Önemli
- Azure Bilişsel Hizmetler Form Tanıma artık Azure AI Belge Zekası'dır.
- Bazı platformlar hala yeniden adlandırma güncelleştirmesini bekliyor.
- Belgelerimizdeki Form Tanıma veya Belge Zekası'nın tüm ifadeleri aynı Azure hizmetini ifade eder.
Bu içerik şunlar için geçerlidir: v4.0 (önizleme) Önceki sürümler: v3.1 (GA) v3.0 (GA)
- Azure AI Document Intelligence en son önizleme sürümünü (2024-07-31-preview) kullanmaya başlayın.
Bu içerik şunlar için geçerlidir: v3.1 (GA) Önceki sürümler: v3.0 v2.1
- Azure Form Tanıma en son GA sürümünü (
2023-07-31
) kullanmaya başlayın.
Bu içerik şunlar için geçerlidir: v3.0 (GA) Daha yeni sürüm: v3.1 v2.1
- Azure Form Tanıma eski GA sürümünü (
2022-08-31
) kullanmaya başlayın.
Azure AI Belge Zekası / Form Tanıma, belgelerinizden anahtar-değer çiftlerini, metinleri, tabloları ve anahtar verilerini ayıklamak için makine öğrenmesini kullanan bulut tabanlı bir Azure yapay zeka hizmetidir.
Programlama dili SDK'sını kullanarak veya REST API'yi çağırarak belge işleme modellerini iş akışlarınızla ve uygulamalarınızla kolayca tümleştirebilirsiniz.
Bu hızlı başlangıçta, teknolojiyi öğrenirken ücretsiz hizmeti kullanmanızı öneririz. Ücretsiz sayfa sayısının ayda 500 ile sınırlı olduğunu unutmayın.
API özellikleri ve geliştirme seçenekleri hakkında daha fazla bilgi edinmek için Genel Bakış sayfamızı ziyaret edin.
İstemci kitaplığı | SDK başvurusu | REST API başvurusu | Paket| Örnekleri|Desteklenen REST API sürümü
İstemci kitaplığı | SDK başvuru | API'si başvuru | Paketi (NuGet) | Örnekleri | Desteklenen REST API sürümü
İstemci kitaplığı | SDK başvurusu | REST API başvurusu | Paket | Örnekleri |Desteklenen REST API sürümü
Bu hızlı başlangıçta, formlardan ve belgelerden veri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:
Düzen modeli— Model eğitmeye gerek kalmadan belgelerdeki radyo düğmeleri ve onay kutuları gibi tabloları, satırları, sözcükleri ve seçim işaretlerini analiz edin ve ayıklayın.
Önceden oluşturulmuş model—Önceden oluşturulmuş bir model kullanarak belirli belge türlerinde ortak alanları analiz edin ve ayıklayın.
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya Azure AI çok hizmetli bir kaynak oluşturun.
Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.
İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Azure AI hizmetleri veya Form Tanıma kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya Azure AI çok hizmetli bir kaynak oluşturun.
Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.
İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Form Tanıma erişim için bir Form Tanıma kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Form Tanıma API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Visual Studio'yu başlatın.
Başlangıç sayfasında Yeni proje oluştur'u seçin.
Yeni proje oluştur sayfasında, arama kutusuna konsol yazın. Konsol Uygulaması şablonunu ve ardından İleri'yi seçin.
- Yeni projenizi yapılandırın iletişim penceresinde Proje adı kutusuna girin
doc_intel_quickstart
. Ardından İleri'yi seçin.
- Yeni projenizi yapılandırın iletişim penceresinde Proje adı kutusuna girin
form_recognizer_quickstart
. Ardından İleri'yi seçin.
Ek bilgiler iletişim kutusunda .NET 8.0 (uzun süreli destek) öğesini ve ardından Oluştur'u seçin.
NuGet ile istemci kitaplığını yükleme
doc_intel_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.
Gözat sekmesini seçin ve Azure.AI.DocumentIntelligence yazın.
Include prerelease
Onay kutusunu seçin.Açılan menüden bir sürüm seçin ve paketi projenize yükleyin.
form_recognizer_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.
Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın. Açılan menüden sürüm 4.1.0'ı seçin
form_recognizer_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.
Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın. Açılan menüden sürüm 4.0.0'ı seçin
Uygulamanızı derleme
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
bir ve ve Belge Zekanız endpoint
ile AzureKeyCredential
bir DocumentIntelligenceClient
örnek oluşturursunuzAzureKeyCredential
.
Form Tanıma hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
ve ile bir örnek endpoint
AzureKeyCredential
Form Tanıma oluşturursunuzAzureKeyCredential
.DocumentAnalysisClient
Not
- .NET 6'dan başlayarak, şablonu kullanan
console
yeni projeler önceki sürümlerden farklı yeni bir program stili oluşturur. - Yeni çıkış, yazmanız gereken kodu basitleştiren son C# özelliklerini kullanır.
- Daha yeni sürümü kullandığınızda, yalnızca yönteminin gövdesini
Main
yazmanız gerekir. Üst düzey deyimleri, genel using yönergelerini veya örtük using yönergelerini eklemeniz gerekmez. - Daha fazla bilgi için bkz. Yeni C# şablonları üst düzey deyimler oluşturma.
Program.cs dosyasını açın.
satırı
Console.Writeline("Hello World!")
da dahil olmak üzere önceden var olan kodu silin ve uygulamanızın Program.cs dosyasına kopyalayıp yapıştırmak için aşağıdaki kod örneklerinden birini seçin:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Düzen modeli
Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.
- Bu örnekte, URI'den bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
- Dosya URI değerini betiğin
Uri fileUri
en üstündeki değişkene ekledik. - URI'deki belirli bir dosyadan düzeni ayıklamak için yöntemini kullanın
StartAnalyzeDocumentFromUri
ve model kimliği olarak geçirinprebuilt-layout
. Döndürülen değer, gönderilen belgedeki verileri içeren birAnalyzeResult
nesnedir.
aşağıdaki kod örneğini Program.cs dosyasına ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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}");
}
}
Uygulamanızı çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
aşağıdaki kod örneğini Program.cs dosyasına ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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.BoundingPolygon[0].X}, Y= {line.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {line.BoundingPolygon[1].X}, Y= {line.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {line.BoundingPolygon[2].X}, Y= {line.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {line.BoundingPolygon[3].X}, Y= {line.BoundingPolygon[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.BoundingPolygon[0].X}, Y= {selectionMark.BoundingPolygon[0].Y}");
Console.WriteLine($" Upper right => X: {selectionMark.BoundingPolygon[1].X}, Y= {selectionMark.BoundingPolygon[1].Y}");
Console.WriteLine($" Lower right => X: {selectionMark.BoundingPolygon[2].X}, Y= {selectionMark.BoundingPolygon[2].Y}");
Console.WriteLine($" Lower left => X: {selectionMark.BoundingPolygon[3].X}, Y= {selectionMark.BoundingPolygon[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}'.");
}
}
Uygulamanızı çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
Düzen modeli çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
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
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.
aşağıdaki kod örneğini Program.cs dosyasına ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {line.BoundingPolygon[j].X}, Y: {line.BoundingPolygon[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.BoundingPolygon.Count; j++)
{
Console.WriteLine($" Point {j} => X: {selectionMark.BoundingPolygon[j].X}, Y: {selectionMark.BoundingPolygon[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}'.");
}
}
Uygulamanızı çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
Önceden oluşturulmuş model
Önceden oluşturulmuş bir model kullanarak belirli belge türlerinden ortak alanları analiz edin ve ayıklayın. Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.
İpucu
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze
kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.
- Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Dosya URI değerini
Uri invoiceUri
Program.cs dosyasının en üstündeki değişkene ekledik. - URI'de belirli bir dosyayı analiz etmek için yöntemini kullanın
StartAnalyzeDocumentFromUri
ve model kimliği olarak geçirinprebuilt-invoice
. Döndürülen değer, gönderilen belgedeki verileri içeren birAnalyzeResult
nesnedir. - Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
aşağıdaki kod örneğini Program.cs dosyanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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.Type == DocumentFieldType.String)
{
string vendorName = vendorNameField.ValueString;
Console.WriteLine($"Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
if (document.Fields.TryGetValue("CustomerName", out DocumentField customerNameField)
&& customerNameField.Type == DocumentFieldType.String)
{
string customerName = customerNameField.ValueString;
Console.WriteLine($"Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
if (document.Fields.TryGetValue("Items", out DocumentField itemsField)
&& itemsField.Type == DocumentFieldType.Array)
{
foreach (DocumentField itemField in itemsField.ValueArray)
{
Console.WriteLine("Item:");
if (itemField.Type == DocumentFieldType.Object)
{
IReadOnlyDictionary<string, DocumentField> itemFields = itemField.ValueObject;
if (itemFields.TryGetValue("Description", out DocumentField itemDescriptionField)
&& itemDescriptionField.Type == DocumentFieldType.String)
{
string itemDescription = itemDescriptionField.ValueString;
Console.WriteLine($" Description: '{itemDescription}', with confidence {itemDescriptionField.Confidence}");
}
if (itemFields.TryGetValue("Amount", out DocumentField itemAmountField)
&& itemAmountField.Type == 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.Type == 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.Type == 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.Type == DocumentFieldType.Currency)
{
CurrencyValue invoiceTotal = invoiceTotalField.ValueCurrency;
Console.WriteLine($"Invoice Total: '{invoiceTotal.CurrencySymbol}{invoiceTotal.Amount}', with confidence {invoiceTotalField.Confidence}");
}
}
Uygulamanızı çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
aşağıdaki kod örneğini Program.cs dosyanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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}");
}
}
}
Uygulamanızı çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
Önceden oluşturulmuş model çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
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
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.
aşağıdaki kod örneğini Program.cs dosyanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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}");
}
}
}
Uygulamanızı çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra, programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
İstemci kitaplığı | SDK başvurusu | REST API başvuru | Paketi (Maven) | Desteklenen REST API sürümü örnekleri |
İstemci kitaplığı | SDK başvurusu | REST API başvuru | Paketi (Maven) | Desteklenen REST API sürümü örnekleri|
İstemci kitaplığı | SDK başvurusu | REST API başvuru | Paketi (Maven) | Desteklenen REST API sürümü örnekleri|
Bu hızlı başlangıçta, formlardan ve belgelerden veri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:
Düzen— Model eğitmeye gerek kalmadan belgelerdeki radyo düğmeleri ve onay kutuları gibi tabloları, çizgileri, sözcükleri ve seçim işaretlerini analiz edin ve ayıklayın.
Önceden oluşturulmuş Fatura— Önceden eğitilmiş bir model kullanarak belirli belge türlerinde ortak alanları analiz edin ve ayıklayın.
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE. Bkz. Visual Studio Code'da Java.
İpucu
- Visual Studio Code, Windows ve macOS için Java için bir Kodlama Paketi sunar.Kodlama paketi, BIR VS Code paketi, Java Geliştirme Seti (JDK) ve Microsoft tarafından önerilen uzantılardan oluşan bir koleksiyondur. Kodlama Paketi, mevcut geliştirme ortamını düzeltmek için de kullanılabilir.
- VS Code ve Java için Kodlama Paketi kullanıyorsanız Java için Gradle uzantısını yükleyin.
Visual Studio Code kullanmıyorsanız, geliştirme ortamınızda aşağıdakilerin yüklü olduğundan emin olun:
Java Geliştirme Seti (JDK) sürüm 8 veya üzeri. Daha fazla bilgi için bkz. OpenJDK'nin Microsoft Derlemesi.
Gradle, sürüm 6.8 veya üzeri.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Daha sonra anahtarınızı ve uç noktanızı koda yapıştırırsınız:
Ayarlama
Yeni Gradle projesi oluşturma
Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için doc-intel-app adlı yeni bir dizin oluşturun ve bu dizine gidin.
mkdir doc-intel-app && doc-intel-app
mkdir doc-intel-app; cd doc-intel-app
gradle init
Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.gradle init --type basic
DSL seçmeniz istendiğinde Kotlin'i seçin.
İade veya Enter'ı seçerek varsayılan proje adını (doc-intel-app) kabul edin.
Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için form-recognize-app adlı yeni bir dizin oluşturun ve bu dizine gidin.
mkdir form-recognize-app && form-recognize-app
mkdir form-recognize-app; cd form-recognize-app
gradle init
Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.gradle init --type basic
DSL seçmeniz istendiğinde Kotlin'i seçin.
İade veya Enter'ı seçerek varsayılan proje adını (form-recognize-app) kabul edin.
İstemci kitaplığını yükleme
Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.
IDE'nizde projenin build.gradle.kts dosyasını açın. İstemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation
deyim olarak eklemek için aşağıdaki kodu birlikte ödenin ve yapıştırın.
plugins {
java
application
}
application {
mainClass.set("DocIntelligence")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-documentintelligence', version: '1.0.0-beta.4'
}
Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.
IDE'nizde projenin build.gradle.kts dosyasını açın. İstemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation
deyim olarak eklemek için aşağıdaki kodu birlikte ödenin ve yapıştırın.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.1.0'
}
Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.
IDE'nizde projenin build.gradle.kts dosyasını açın. İstemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation
deyim olarak eklemek için aşağıdaki kodu birlikte ödenin ve yapıştırın.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation group: 'com.azure', name: 'azure-ai-formrecognizer', version: '4.0.0'
}
Java uygulaması oluşturma
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
bir ve ve Belge Zekanız endpoint
ile AzureKeyCredential
bir DocumentIntelligenceClient
örnek oluşturursunuzAzureKeyCredential
.
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
bir ve ve Belge Zekanız endpoint
ile AzureKeyCredential
bir DocumentAnalysisClient
örnek oluşturursunuzAzureKeyCredential
.
doc-intel-app dizininden aşağıdaki komutu çalıştırın:
mkdir -p src/main/java
Aşağıdaki dizin yapısını oluşturursunuz:
dizinine
java
gidin ve adlıDocIntelligence.java
bir dosya oluşturun.İpucu
- PowerShell kullanarak yeni bir dosya oluşturabilirsiniz.
- Shift tuşunu basılı tutarak ve klasöre sağ tıklayarak proje dizininizde bir PowerShell penceresi açın.
- Yeni Öğe DocIntelligence.java aşağıdaki komutu yazın.
DocIntelligence.java
dosyasını açın. Aşağıdaki kod örneklerinden birini kopyalayıp uygulamanıza yapıştırın:
dizinine
java
gidin ve adlıFormRecognizer.java
bir dosya oluşturun.İpucu
- PowerShell kullanarak yeni bir dosya oluşturabilirsiniz.
- Shift tuşunu basılı tutarak ve klasöre sağ tıklayarak proje dizininizde bir PowerShell penceresi açın.
- Yeni Öğe FormRecognizer.java aşağıdaki komutu yazın.
FormRecognizer.java
dosyasını açın. Aşağıdaki kod örneklerinden birini kopyalayıp uygulamanıza yapıştırın:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Düzen modeli
Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.
- Bu örnekte, URI'de bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
- Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak
beginAnalyzeDocumentFromUrl
ve model kimliği olarak geçireceksinizprebuilt-layout
. Döndürülen değer, gönderilen belgeyle ilgili verileri içeren birAnalyzeResult
nesnedir. - Main yöntemindeki değişkene
documentUrl
dosya URI değerini ekledik.
Aşağıdaki kod örneğini dosyaya DocIntelligence.java
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
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";
SyncPoller <AnalyzeResultOperation, AnalyzeResultOperation> analyzeLayoutPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(documentUrl));
AnalyzeResult analyzeLayoutResult = analyzeLayoutPoller.getFinalResult().getAnalyzeResult();
// 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()));
}
}
Uygulamayı derleme ve çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.
Uygulamanızı şu komutla
build
oluşturun:gradle build
Uygulamanızı şu komutla
run
çalıştırın:gradle run
Aşağıdaki kod örneğini dosyaya FormRecognizer.java
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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.getBoundingPolygon().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.getBoundingPolygon().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 > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Uygulamayı derleme ve çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (form-recognize-app) geri gidin.
Uygulamanızı şu komutla
build
oluşturun:gradle build
Uygulamanızı şu komutla
run
çalıştırın:gradle run
Düzen modeli çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
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.
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.
Aşağıdaki kod örneğini dosyaya FormRecognizer.java
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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.getBoundingPolygon())));
// 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.getBoundingPolygon()),
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 > boundingPolygon) {
return boundingPolygon.stream().map(point -> String.format("[%.2f, %.2f]", point.getX(),
point.getY())).collect(Collectors.joining(", "));
}
}
Uygulamayı derleme ve çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (form-recognize-app) geri gidin.
Uygulamanızı şu komutla
build
oluşturun:gradle build
Uygulamanızı şu komutla
run
çalıştırın:gradle run
Önceden oluşturulmuş model
Önceden oluşturulmuş bir model kullanarak belirli belge türlerinden ortak alanları analiz edin ve ayıklayın. Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.
İpucu
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze
kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.
- Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Dosyanın üst kısmındaki değişkene
invoiceUrl
dosya URL'si değerini ekledik. - Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak
beginAnalyzeDocuments
ve model kimliği olarak geçireceksinizPrebuiltModels.Invoice
. Döndürülen değer, gönderilen belgeyle ilgili verileri içeren birresult
nesnedir. - Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
Aşağıdaki kod örneğini dosyaya DocIntelligence.java
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
import com.azure.ai.documentintelligence.models.AnalyzeDocumentRequest;
import com.azure.ai.documentintelligence.models.AnalyzeResult;
import com.azure.ai.documentintelligence.models.AnalyzeResultOperation;
import com.azure.ai.documentintelligence.models.Document;
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.io.IOException;
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) {
// 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";
public static void main(final String[] args) throws IOException {
// Instantiate a client that will be used to call the service.
DocumentIntelligenceClient client = new DocumentIntelligenceClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
SyncPoller<AnalyzeResultOperation, AnalyzeResultOperation > analyzeInvoicesPoller =
client.beginAnalyzeDocument(modelId,
null,
null,
null,
null,
null,
null,
new AnalyzeDocumentRequest().setUrlSource(invoiceUrl));
AnalyzeResult analyzeInvoiceResult = analyzeInvoicesPoller.getFinalResult().getAnalyzeResult();
for (int i = 0; i < analyzeInvoiceResult.getDocuments().size(); i++) {
Document 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.getValueString();
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.getValueString();
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.getValueString();
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.getValueString();
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.getValueString();
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.getValueDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n",
invoiceDate, invoiceDateField.getConfidence());
}
}
DocumentField invoiceTotalField = invoiceFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (DocumentFieldType.NUMBER == invoiceTotalField.getType()) {
Double invoiceTotal = invoiceTotalField.getValueNumber();
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.ARRAY == invoiceItemsField.getType()) {
List < DocumentField > invoiceItems = invoiceItemsField.getValueArray();
invoiceItems.stream()
.filter(invoiceItem -> DocumentFieldType.OBJECT == invoiceItem.getType())
.map(documentField -> documentField.getValueObject())
.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.getValueString();
System.out.printf("Description: %s, confidence: %.2fs%n",
name, documentField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double quantity = documentField.getValueNumber();
System.out.printf("Quantity: %f, confidence: %.2f%n",
quantity, documentField.getConfidence());
}
}
if ("UnitPrice".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double unitPrice = documentField.getValueNumber();
System.out.printf("Unit Price: %f, confidence: %.2f%n",
unitPrice, documentField.getConfidence());
}
}
if ("ProductCode".equals(key)) {
if (DocumentFieldType.NUMBER == documentField.getType()) {
Double productCode = documentField.getValueNumber();
System.out.printf("Product Code: %f, confidence: %.2f%n",
productCode, documentField.getConfidence());
}
}
}));
}
}
}
}
}
}
Uygulamayı derleme ve çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.
Uygulamanızı şu komutla
build
oluşturun:gradle build
Uygulamanızı şu komutla
run
çalıştırın:gradle run
Aşağıdaki kod örneğini dosyaya FormRecognizer.java
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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());
}
}
}));
}
}
}
}
}
Uygulamayı derleme ve çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.
Uygulamanızı şu komutla
build
oluşturun:gradle build
Uygulamanızı şu komutla
run
çalıştırın:gradle run
Önceden oluşturulmuş model çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
----------- 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
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.
Aşağıdaki kod örneğini dosyaya FormRecognizer.java
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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());
}
}
}));
}
}
}
}
}
Uygulamayı derleme ve çalıştırma
Uygulamanıza bir kod örneği ekledikten sonra ana proje dizininize (doc-intel-app) geri gidin.
Uygulamanızı şu komutla
build
oluşturun:gradle build
Uygulamanızı şu komutla
run
çalıştırın:gradle run
İstemci kitaplığı | SDK başvurusu | REST API başvuru | Paketi (npm) | Desteklenen REST API sürümü örnekleri |
İstemci kitaplığı | SDK başvurusu | REST API başvuru | Paketi (npm) | Desteklenen REST API sürümü örnekleri |
Bu hızlı başlangıçta, formlardan ve belgelerden veri ve değerleri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:
Düzen— Model eğitmeye gerek kalmadan belgelerdeki radyo düğmeleri ve onay kutuları gibi tabloları, çizgileri, sözcükleri ve seçim işaretlerini analiz edin ve ayıklayın.
Önceden oluşturulmuş Fatura— Önceden eğitilmiş bir fatura modeli kullanarak belirli belge türlerinde ortak alanları analiz edin ve ayıklayın.
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE. Daha fazla bilgi için bkz. Visual Studio Code'da Node.js.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Yeni Node.js Express uygulaması oluşturma: Bir konsol penceresinde (cmd, PowerShell veya Bash gibi) uygulamanız için adlı
doc-intel-app
yeni bir dizin oluşturun ve bu dizine gidin.mkdir doc-intel-app && cd doc-intel-app
npm init
Uygulamayı başlatmak ve projenizin iskelesini yapmak için komutunu çalıştırın.npm init
Terminalde sunulan istemleri kullanarak projenizin özniteliklerini belirtin.
- En önemli öznitelikler ad, sürüm numarası ve giriş noktasıdır.
- Giriş noktası adı için saklamanızı
index.js
öneririz. Açıklama, test komutu, GitHub deposu, anahtar sözcükler, yazar ve lisans bilgileri isteğe bağlı özniteliklerdir; bunlar bu proje için atlanabilir. - İade veya Enter'ı seçerek önerileri parantez içinde kabul edin.
- İstemleri tamamladıktan sonra doc-intel-app dizininizde bir
package.json
dosya oluşturulur.
İstemci kitaplığını
ai-document-intelligence
veazure/identity
npm paketlerini yükleyin:npm i @azure-rest/ai-document-intelligence@1.0.0-beta.3 @azure/core-auth
Uygulamanızın
package.json
dosyası bağımlılıklarla güncelleştirilir.
İstemci kitaplığını
ai-form-recognizer
veazure/identity
npm paketlerini yükleyin:npm i @azure/ai-form-recognizer@5.0.0 @azure/identity
- Uygulamanızın
package.json
dosyası bağımlılıklarla güncelleştirilir.
- Uygulamanızın
İstemci kitaplığını
ai-form-recognizer
veazure/identity
npm paketlerini yükleyin:npm i @azure/ai-form-recognizer@4.0.0 @azure/identity
Uygulama dizininde adlı
index.js
bir dosya oluşturun.İpucu
- PowerShell kullanarak yeni bir dosya oluşturabilirsiniz.
- Shift tuşunu basılı tutarak ve klasöre sağ tıklayarak proje dizininizde bir PowerShell penceresi açın.
- Yeni Öğe index.js aşağıdaki komutu yazın.
Uygulamanızı derleme
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
bir ve ve Belge Zekanız endpoint
ile AzureKeyCredential
bir DocumentIntelligenceClient
örnek oluşturursunuzAzureKeyCredential
.
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
ve ile bir örnek endpoint
AzureKeyCredential
Form Tanıma oluşturursunuzAzureKeyCredential
.DocumentAnalysisClient
index.js
Dosyayı Visual Studio Code'da veya sık kullandığınız IDE'de açın. Aşağıdaki kod örneklerinden birini kopyalayıp uygulamanıza yapıştırın:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Düzen modeli
Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.
- Bu örnekte, URL'den bir belge dosyası gerekir. Bu hızlı başlangıç için örnek belgemizi kullanabilirsiniz.
- Dosyanın üst kısmındaki değişkene
formUrl
dosya URL'si değerini ekledik.- Url'den belirli bir dosyayı analiz etmek için yöntemini kullanır
beginAnalyzeDocuments
ve model kimliği olarak geçirirsinizprebuilt-layout
.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// 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, new AzureKeyCredential(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 = await getLongRunningPoller(client, initialResponse);
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const document = documents && documents[0];
if (!document) {
throw new Error("Expected at least one document in the result.");
}
console.log(
"Extracted document:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Uygulamanızı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:
Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
node index.js
Aşağıdaki kod örneğini dosyaya index.js
ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
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);
});
Uygulamanızı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:
Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
node index.js
Düzen modeli çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
Pages:
- Page 1 (unit: inch)
8.5x11, angle: 0
69 lines, 425 words
Tables:
- Extracted table: 3 columns, 5 rows (15 cells)
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.
Önceden oluşturulmuş model
Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.
İpucu
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze
kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.
- Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Dosyanın üst kısmındaki değişkene
invoiceUrl
dosya URL'si değerini ekledik. - Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak
beginAnalyzeDocuments
ve model kimliği olarak geçireceksinizPrebuiltModels.Invoice
. Döndürülen değer, gönderilen belgeyle ilgili verileri içeren birresult
nesnedir. - Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
const DocumentIntelligence = require("@azure-rest/ai-document-intelligence").default,
{ getLongRunningPoller, isUnexpected } = require("@azure-rest/ai-document-intelligence");
const { AzureKeyCredential } = require("@azure/core-auth");
// 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, new AzureKeyCredential(key));
const initialResponse = await client
.path("/documentModels/{modelId}:analyze", "prebuilt-invoice")
.post({
contentType: "application/json",
body: {
// The Document Intelligence service will access the URL to the invoice image and extract data from it
urlSource: invoiceUrl,
},
});
if (isUnexpected(initialResponse)) {
throw initialResponse.body.error;
}
const poller = await getLongRunningPoller(client, initialResponse);
poller.onProgress((state) => console.log("Operation:", state.result, state.status));
const analyzeResult = (await poller.pollUntilDone()).body.analyzeResult;
const documents = analyzeResult?.documents;
const result = documents && documents[0];
if (result) {
console.log(result.fields);
} else {
throw new Error("Expected at least one invoice in the result.");
}
console.log(
"Extracted invoice:",
document.docType,
`(confidence: ${document.confidence || "<undefined>"})`,
);
console.log("Fields:", document.fields);
}
main().catch((error) => {
console.error("An error occurred:", error);
process.exit(1);
});
Uygulamanızı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:
Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
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);
});
Uygulamanızı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:
Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
node index.js
Önceden oluşturulmuş model çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
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
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.
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);
});
Uygulamanızı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı çalıştırın:
Belge Yönetim Bilgileri uygulamanızın (doc-intel-app) bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
node index.js
İstemci kitaplığı |SDK başvurusu | REST API başvuru | Paketi (PyPi) | Örnekleri | Desteklenen REST API sürümü
İstemci kitaplığı |SDK başvurusu | REST API başvuru | Paketi (PyPi) | Örnekleri | Desteklenen REST API sürümü
İstemci kitaplığı | SDK başvurusu | REST API başvuru | Paketi (PyPi) | Örnekleri | Desteklenen REST API sürümü
Bu hızlı başlangıçta, form ve belgelerden verileri analiz etmek ve ayıklamak için aşağıdaki özellikleri kullanın:
Düzen— Model eğitmeye gerek kalmadan radyo düğmeleri, onay kutuları ve anahtar-değer çiftleri gibi tabloları, çizgileri, sözcükleri ve seçim işaretlerini analiz edip ayıklayın.
Önceden oluşturulmuş Fatura— Önceden eğitilmiş bir model kullanarak belirli belge türlerinde ortak alanları analiz edin ve ayıklayın.
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
-
- Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz
pip --version
. Python'ın en son sürümünü yükleyerek pip alın.
- Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz
Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE. Daha fazla bilgi için bkz. Visual Studio Code'da Python'ı Kullanmaya Başlama.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.
İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Yerel ortamınızda bir terminal penceresi açın ve pip ile Python için Azure AI Document Intelligence istemci kitaplığını yükleyin:
pip install azure-ai-documentintelligence==1.0.0b4
pip install azure-ai-formrecognizer==3.3.0
pip install azure-ai-formrecognizer==3.2.0b6
Python uygulamanızı oluşturma
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentIntelligenceClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
bir ve ve Belge Zekanız endpoint
ile AzureKeyCredential
bir DocumentIntelligenceClient
örnek oluşturursunuzAzureKeyCredential
.
Tercih ettiğiniz düzenleyicide veya IDE'de doc_intel_quickstart.py adlı yeni bir Python dosyası oluşturun.
doc_intel_quickstart.py dosyasını açın ve aşağıdaki kod örneklerinden birini seçerek kopyalayıp uygulamanıza yapıştırın:
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini DocumentAnalysisClient
oluşturmanız gerekir. Bunu yapmak için Azure portalından ile key
bir ve ve Belge Zekanız endpoint
ile AzureKeyCredential
bir DocumentAnalysisClient
örnek oluşturursunuzAzureKeyCredential
.
Tercih ettiğiniz düzenleyicide veya IDE'de form_recognizer_quickstart.py adlı yeni bir Python dosyası oluşturun.
form_recognizer_quickstart.py dosyasını açın ve aşağıdaki kod örneklerinden birini seçerek kopyalayıp uygulamanıza yapıştırın:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Düzen modeli
Belgelerden metin, seçim işaretleri, metin stilleri, tablo yapıları ve sınırlayıcı bölge koordinatlarını ayıklayın.
aşağıdaki kod örneğini doc_intel_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
# 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()
Uygulamayı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:
doc_intel_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python doc_intel_quickstart.py
Belirli bir dosyayı URL'de analiz etmek için yöntemini kullanacaksınız begin_analyze_document_from_url
ve model kimliği olarak geçiş yapacaksınız prebuilt-layout
. Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir result
nesnedir.
aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
# 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()
Uygulamayı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:
form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python form_recognizer_quickstart.py
Düzen modeli çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
----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
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve düzen modeli çıkışını görüntüleyin.
aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
# 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()
Uygulamayı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:
form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python form_recognizer_quickstart.py
Önceden oluşturulmuş model
Önceden oluşturulmuş bir model kullanarak belirli belge türlerinden ortak alanları analiz edin ve ayıklayın. Bu örnekte, önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz ediyoruz.
İpucu
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. İşlem için analyze
kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Bkz. model veri ayıklama.
- Önceden oluşturulmuş fatura modelini kullanarak bir faturayı analiz edin. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Dosyanın üst kısmındaki değişkene
invoiceUrl
dosya URL'si değerini ekledik. - Kolaylık olması için, hizmetin döndürdüğü tüm anahtar-değer çiftleri burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
aşağıdaki kod örneğini doc_intel_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
# 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()
Uygulamayı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:
doc_intel_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python doc_intel_quickstart.py
Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacak begin_analyze_document_from_url
ve model kimliği olarak geçireceksiniz prebuilt-invoice
. Döndürülen değer, gönderilen belgeyle ilgili verileri içeren bir result
nesnedir.
aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
# 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()
Uygulamayı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:
form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python form_recognizer_quickstart.py
Önceden oluşturulmuş model çıkışı
Beklenen çıkışın kod parçacığı aşağıdadır:
--------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
Çıkışın tamamını görüntülemek için GitHub'daki Azure örnekleri deposunu ziyaret edin ve önceden oluşturulmuş fatura modeli çıkışını görüntüleyin.
aşağıdaki kod örneğini form_recognizer_quickstart.py uygulamanıza ekleyin. Anahtar ve uç nokta değişkenlerini Azure portal Form Tanıma örneğinizdeki değerlerle güncelleştirdiğinizden emin olun:
# 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()
Uygulamayı çalıştırma
Uygulamanıza kod örneği ekledikten sonra programınızı derleyip çalıştırın:
form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python form_recognizer_quickstart.py
Bu hızlı başlangıçta, belgelerdeki verileri ve değerleri analiz etmek ve ayıklamak için Belge Zekası REST API'sini kullanmayı öğrenin:
Önkoşullar
Azure aboneliği - Ücretsiz olarak oluşturun
curl komut satırı aracı yüklendi.
PowerShell sürüm 7.*+ (veya benzer bir komut satırı uygulaması).):
PowerShell sürümünüzü denetlemek için işletim sisteminize göre aşağıdaki komutu yazın:
- Windows:
Get-Host | Select-Object Version
- macOS veya Linux:
$PSVersionTable
- Windows:
Belge Zekası (tek hizmetli) veya Azure AI hizmetleri (çok hizmetli) kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.
İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Belgeleri analiz etme ve sonuç alma
POST isteği, belgeleri önceden oluşturulmuş veya özel bir modelle analiz etmek için kullanılır. Get isteği, belge çözümleme çağrısının sonucunu almak için kullanılır. , modelId
POST ve resultId
GET işlemleriyle birlikte kullanılır.
Belgeyi analiz etme (POST İsteği)
cURL komutunu çalıştırmadan önce, istek sonrası için aşağıdaki değişiklikleri yapın:
değerini Azure portal Belge Zekası örneğinizdeki uç nokta değeriyle değiştirin
{endpoint}
.değerini Azure portal Belge Zekası örneğinizdeki anahtar değeriyle değiştirin
{key}
.Başvuru olarak aşağıdaki tabloyu kullanarak ve
{your-document-url}
değerlerini istediğiniz değerlerle değiştirin{modelID}
.URL'de bir belge dosyası gerekir. Bu hızlı başlangıç için, her özellik için aşağıdaki tabloda sağlanan örnek formları kullanabilirsiniz:
Örnek belgeler
Özellik | {modelID} | {your-document-url} |
---|---|---|
Okuma | önceden oluşturulmuş okuma | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Düzen | önceden oluşturulmuş düzen | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Sağlık sigortası kartı | 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 |
Fatura | önceden oluşturulmuş fatura | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Makbuz | önceden oluşturulmuş makbuz | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Kimlik belgesi | prebuilt-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Örnek belgeler
Özellik | {modelID} | {your-document-url} |
---|---|---|
Genel Belge | önceden oluşturulmuş belge | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf |
Okuma | önceden oluşturulmuş okuma | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/read.png |
Düzen | önceden oluşturulmuş düzen | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/layout.png |
Sağlık sigortası kartı | 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 |
Fatura | önceden oluşturulmuş fatura | https://github.com/Azure-Samples/cognitive-services-REST-api-samples/raw/master/curl/form-recognizer/rest-api/invoice.pdf |
Makbuz | önceden oluşturulmuş makbuz | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/receipt.png |
Kimlik belgesi | prebuilt-idDocument | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/rest-api/identity_documents.png |
Kartvizit | önceden oluşturulmuş businessCard | https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/de5e0d8982ab754823c54de47a47e8e499351523/curl/form-recognizer/rest-api/business_card.jpg |
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
POST isteği
curl -v -i POST "{endpoint}/documentintelligence/documentModels/{modelId}:analyze?api-version=2024-07-31-preview" -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}'}"
POST yanıtı (resultID)
Salt okunur operation-location 202 (Success)
üst bilgisi içeren bir yanıt alırsınız. Bu üst bilginin değeri, zaman uyumsuz işlemin durumunu almak ve aynı kaynak abonelik anahtarınızla bir GET isteği kullanarak sonuçları almak için sorgulanabilen bir içerir resultID
:
Sonuçları analiz etme (GET İsteği)
API'yi Analyze document
çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Çözümle sonuç API'sini çağırın. Komutu çalıştırmadan önce şu değişiklikleri yapın:
API'yi Analyze document
çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Çözümle sonuç API'sini çağırın. Komutu çalıştırmadan önce şu değişiklikleri yapın:
API'yi Analyze document
çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Çözümle sonuç API'sini çağırın. Komutu çalıştırmadan önce şu değişiklikleri yapın:
POST yanıtından Operation-Location üst bilgisini değiştirin
{resultID}
.değerini Azure portalındaki Belge Zekası örneğinizdeki anahtar değeriyle değiştirin
{key}
.
GET isteği
curl -v -X GET "{endpoint}/documentintelligence/documentModels/{modelId}/analyzeResults/{resultId}?api-version=2024-07-31-preview" -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}"
Yanıtı inceleme
JSON çıkışıyla bir 200 (Success)
yanıt alırsınız. İlk alan olan "status"
, işlemin durumunu gösterir. İşlem tamamlanmazsa veya "notStarted"
değeridir "status"
"running"
ve API'yi el ile veya bir betik aracılığıyla yeniden çağırmalısınız. Aramalar arasında bir saniyelik veya daha fazla bir aralık öneririz.
Önceden oluşturulmuş fatura için örnek yanıt
{
"status": "succeeded",
"createdDateTime": "2024-03-25T19:31:37Z",
"lastUpdatedDateTime": "2024-03-25T19:31:43Z",
"analyzeResult": {
"apiVersion": "2024-07-31-preview",
"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
}
}],
}]
}
}
Desteklenen belge alanları
Önceden oluşturulmuş modeller, önceden tanımlanmış belge alanı kümelerini ayıklar. Ayıklanan alan adları, türleri, açıklamaları ve örnekler için bkz . Model veri ayıklama .
İşte bu kadar, tebrikler!
Bu hızlı başlangıçta, çeşitli formları ve belgeleri analiz etmek için bir belge Yönetim Bilgileri modeli kullandınız. Ardından, Belge Zekası API'sini ayrıntılı olarak öğrenmek için Document Intelligence Studio'yu inceleyin ve belgelere başvurun.
Sonraki adımlar
Gelişmiş bir deneyim ve gelişmiş model kalitesi için Document Intelligence Studio'yu deneyin
v3.1 ile v4.0 arasında geçiş için bkz . Changelog Geçişi kılavuzları.
- GitHub'da daha fazla örnek bulun.
- GitHub'da daha fazla örnek bulun.
Bu içerik şunlar için geçerlidir: v2.1 | En son sürüm: v4.0 (önizleme)
İstediğiniz programlama dilini veya REST API'yi kullanarak Azure AI Belge Zekası'nı kullanmaya başlayın. Belge Zekası, belgelerinizden anahtar-değer çiftlerini, metinleri ve tabloları ayıklamak için makine öğrenmesini kullanan bulut tabanlı bir Azure yapay zeka hizmetidir. Teknolojiyi öğrenirken ücretsiz hizmeti kullanmanızı öneririz. Ücretsiz sayfa sayısının ayda 500 ile sınırlı olduğunu unutmayın.
Belge Zekası özellikleri ve geliştirme seçenekleri hakkında daha fazla bilgi edinmek için Genel Bakış sayfamızı ziyaret edin.
Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (NuGet)Örnekleri |
Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Visual Studio 2019'u başlatın.
Başlangıç sayfasında Yeni proje oluştur'u seçin.
Yeni proje oluştur sayfasında, arama kutusuna konsol yazın. Konsol Uygulaması şablonunu ve ardından İleri'yi seçin.
Yeni projenizi yapılandırın iletişim penceresinde Proje adı kutusuna girin
formRecognizer_quickstart
. Ardından İleri'yi seçin.Ek bilgiler iletişim kutusunda .NET 5.0 (Geçerli) öğesini ve ardından Oluştur'u seçin.
NuGet ile istemci kitaplığını yükleme
formRecognizer_quickstart projenize sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.
Gözat sekmesini seçin ve Azure.AI.FormRecognizer yazın.
Açılan menüden sürüm 3.1.1'i ve ardından Yükle'yi seçin.
Uygulamanızı derleme
Belge Yönetim Bilgileri hizmetiyle etkileşim kurmak için sınıfının bir örneğini FormRecognizerClient
oluşturmanız gerekir. Bunu yapmak için anahtarınız ile bir AzureKeyCredential
ve ve Belge Zekası endpoint
ile AzureKeyCredential
bir FormRecognizerClient
örnek oluşturursunuz.
Not
- .NET 6'dan başlayarak, şablonu kullanan
console
yeni projeler önceki sürümlerden farklı yeni bir program stili oluşturur. - Yeni çıkış, yazmanız gereken kodu basitleştiren son C# özelliklerini kullanır.
- Daha yeni sürümü kullandığınızda, yalnızca yönteminin gövdesini
Main
yazmanız gerekir. Üst düzey deyimleri, genel using yönergelerini veya örtük using yönergelerini eklemeniz gerekmez. - Daha fazla bilgi için bkz. Yeni C# şablonları üst düzey deyimler oluşturma.
Program.cs dosyasını açın.
Aşağıdaki kullanım yönergelerini ekleyin:
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using System.Threading.Tasks;
- ve ortam değişkenlerinizi
endpoint
ayarlayın ve veFormRecognizerClient
örneğiniziAzureKeyCredential
oluşturun:key
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);
satırını
Console.Writeline("Hello World!");
silin ve Try It kod örneklerinden birini Program.cs dosyasına ekleyin:Uygulamanızın Main yöntemine kopyalayıp yapıştırmak için bir kod örneği seçin:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.
Deneyin: Düzen modeli
Belgelerden sınırlayıcı bölge koordinatlarıyla birlikte metin, seçim işaretleri, metin stilleri ve tablo yapılarını ayıklayın.
Düzen uygulama Program.cs dosyanıza aşağıdaki kodu ekleyin:
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}'.");
}
}
}
}
}
}
Deneyin: Önceden oluşturulmuş model
Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir.
- Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Main yönteminin en üstündeki değişkene
invoiceUri
dosya URI değerini ekledik. - URI'de belirli bir dosyayı analiz etmek için yöntemini kullanın
StartRecognizeInvoicesFromUriAsync
. - Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
Önceden oluşturulmuş bir model seçin
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:
- Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
- Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
- Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
- Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.
Aşağıdaki kodu önceden oluşturulmuş fatura uygulamanıza Program.cs dosya yönteminize ekleyin
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}");
}
}
}
}
}
Uygulamanızı çalıştırma
Programınızı oluşturmak ve çalıştırmak için formRecognizer_quickstart yanındaki yeşil Başlangıç düğmesini seçin veya F5 tuşuna basın.
Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (Maven)Örnekler |
Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
Java Geliştirme Seti (JDK) sürüm 8 veya üzeri. Daha fazla bilgi için bkz. Desteklenen Java Sürümleri ve güncelleştirme zamanlaması.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Yeni Gradle projesi oluşturma
Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için form-recognizer-app adlı yeni bir dizin oluşturun ve bu dizine gidin.
mkdir form-recognizer-app && form-recognizer-app
gradle init
Komutunu çalışma dizininizden çalıştırın. Bu komut, uygulamanızı oluşturmak ve yapılandırmak için çalışma zamanında kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturur.gradle init --type basic
DSL seçmeniz istendiğinde Kotlin'i seçin.
Varsayılan proje adını kabul edin (form-recognizer-app)
İstemci kitaplığını yükleme
Bu hızlı başlangıçta Gradle bağımlılık yöneticisi kullanılır. Maven Central Repository'de diğer bağımlılık yöneticilerinin istemci kitaplığını ve bilgilerini bulabilirsiniz.
Projenizin build.gradle.kts dosyasında, istemci kitaplığını gerekli eklentiler ve ayarlarla birlikte bir implementation
deyim olarak ekleyin.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Java dosyası oluşturma
Çalışma dizininizden aşağıdaki komutu çalıştırın:
mkdir -p src/main/java
Aşağıdaki dizin yapısını oluşturursunuz:
Java dizinine gidin ve FormRecognizer.java adlı bir dosya oluşturun. Bunu tercih ettiğiniz düzenleyicide veya IDE'de açın ve aşağıdaki paket bildirimini ve import
deyimlerini ekleyin:
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;
Uygulamanızın ana yöntemine kopyalayıp yapıştırmak için bir kod örneği seçin:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Deneyin: Düzen modeli
Belgelerden sınırlayıcı bölge koordinatlarıyla birlikte metin, seçim işaretleri, metin stilleri ve tablo yapılarını ayıklayın.
Uygulamanızın FormRecognizer sınıfını aşağıdaki kodla güncelleştirin (anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirin):
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();
});
});
}
Deneyin: Önceden oluşturulmuş model
Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir.
- Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Belirli bir dosyayı URI'de analiz etmek için kullanacaksınız
beginRecognizeInvoicesFromUrl
. - Main yöntemindeki değişkene
invoiceUrl
dosya URI değerini ekledik. - Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
Önceden oluşturulmuş bir model seçin
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:
- Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
- Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
- Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
- Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.
Uygulamanızın FormRecognizer sınıfını aşağıdaki kodla güncelleştirin (anahtar ve uç nokta değişkenlerini Azure portal Belge Zekası örneğinizdeki değerlerle güncelleştirin):
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());
}
}
}
}
Uygulamanızı derleme ve çalıştırma
Ana proje dizininize (form-recognizer-app) geri dönün.
- Uygulamanızı şu komutla
build
oluşturun:
gradle build
- Uygulamanızı şu komutla
run
çalıştırın:
gradle run
Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (npm)Örnekler |
Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:
Önkoşullar
Azure aboneliği - Ücretsiz bir abonelik oluşturun.
Visual Studio Code'un en son sürümü veya tercih ettiğiniz IDE.
Node.js'nin en son LTS sürümü
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Yeni bir Node.js uygulaması oluşturun. Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.
mkdir form-recognizer-app && cd form-recognizer-app
Bir
package.json
dosyası ile bir düğüm uygulaması oluşturmak içinnpm init
komutunu çalıştırın.npm init
ai-form-recognizer
İstemci kitaplığı npm paketini yükleyin:npm install @azure/ai-form-recognizer
Uygulamanızın
package.json
dosyası bağımlılıklarla güncelleştirilir.adlı
index.js
bir dosya oluşturun, dosyayı açın ve aşağıdaki kitaplıkları içeri aktarın:const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
Kaynağınızın Azure uç noktası ve anahtarı için değişkenler oluşturun:
const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE"; const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
Bu noktada JavaScript uygulamanız aşağıdaki kod satırlarını içermelidir:
const { FormRecognizerClient, AzureKeyCredential } = require("@azure/ai-form-recognizer"); const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"; const key = "PASTE_YOUR_FORM_RECOGNIZER_KEY_HERE";
Kopyalayıp uygulamanıza yapıştırmak için bir kod örneği seçin:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Deneyin: Düzen modeli
Aşağıdaki kodu değişkenin altındaki key
satıra düzen uygulamanıza ekleyin
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);
});
Deneyin: Önceden oluşturulmuş model
Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir. Fatura alanlarının tam listesi için önceden oluşturulmuş kavram sayfamıza bakın
- Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Dosyanın üst kısmındaki değişkene
invoiceUrl
dosya URI değerini ekledik. - Belirli bir dosyayı URI'de analiz etmek için yöntemini kullanacaksınız
beginRecognizeInvoices
. - Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
Önceden oluşturulmuş bir model seçin
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:
- Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
- Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
- Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
- Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.
Önceden oluşturulmuş fatura uygulamanıza aşağıdaki kodu değişkeninin key
altına ekleyin
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);
});
Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (PyPi)Örnekleri |
Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:
Önkoşullar
Azure aboneliği - Ücretsiz olarak oluşturun
-
- Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz
pip --version
. Python'ın en son sürümünü yükleyerek pip alın.
- Python yüklemeniz pip içermelidir. Pip'in yüklü olup olmadığını denetlemek için komut satırında komutunu çalıştırabilirsiniz
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Ayarlama
Yerel ortamınızda bir terminal penceresi açın ve pip ile Python için Azure AI Document Intelligence istemci kitaplığını yükleyin:
pip install azure-ai-formrecognizer
Yeni Python uygulaması oluşturma
Tercih ettiğiniz düzenleyicide veya IDE'de form_recognizer_quickstart.py adlı yeni bir Python uygulaması oluşturun. Ardından aşağıdaki kitaplıkları içeri aktarın:
import os
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
Azure kaynak uç noktanız ve anahtarınız için değişkenler oluşturma
endpoint = "YOUR_FORM_RECOGNIZER_ENDPOINT"
key = "YOUR_FORM_RECOGNIZER_KEY"
Bu noktada Python uygulamanız aşağıdaki kod satırlarını içermelidir:
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"
Kopyalayıp uygulamanıza yapıştırmak için bir kod örneği seçin:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Deneyin: Düzen modeli
Aşağıdaki kodu değişkenin altındaki key
satıra düzen uygulamanıza ekleyin
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()
Deneyin: Önceden oluşturulmuş model
Bu örnek, örnek olarak fatura kullanarak önceden eğitilmiş modellerle belirli ortak belge türlerindeki verilerin nasıl çözümlendiğini gösterir. Fatura alanlarının tam listesi için önceden oluşturulmuş kavram sayfamıza bakın
- Bu örnekte, önceden oluşturulmuş bir model kullanarak bir fatura belgesini analiz edeceğiz. Bu hızlı başlangıç için örnek fatura belgemizi kullanabilirsiniz.
- Dosyanın en üstündeki ''formUrl' değişkenine dosya URI değerini ekledik.
- Belirli bir dosyayı URI'de analiz etmek için ''begin_recognize_invoices_from_url' yöntemini kullanacaksınız.
- Kolaylık olması için, hizmetin döndürdüğü tüm alanlar burada gösterilmez. Tüm desteklenen alanların ve ilgili türlerin listesini görmek için Fatura kavramı sayfamıza bakın.
Önceden oluşturulmuş bir model seçin
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:
- Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
- Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
- Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
- Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.
Önceden oluşturulmuş fatura uygulamanıza aşağıdaki kodu değişkeninin key
altına ekleyin
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()
Uygulamanızı çalıştırma
form_recognizer_quickstart.py dosyanızın bulunduğu klasöre gidin.
Terminalinize aşağıdaki komutu yazın:
python form_recognizer_quickstart.py
| Belge Zekası REST API'si | Azure REST API başvurusu |
Bu hızlı başlangıçta, formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanacaksınız:
Önkoşullar
Azure aboneliği - Ücretsiz olarak oluşturun
cURL yüklü.
PowerShell sürüm 6.0+ veya benzer bir komut satırı uygulaması.
Azure AI hizmetleri veya Belge Zekası kaynağı. Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında tek hizmetli veya çok hizmetli bir Belge Zekası kaynağı oluşturun. Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.İpucu
Tek bir uç nokta/anahtar altında birden çok Azure AI hizmetine erişmeyi planlıyorsanız bir Azure AI hizmetleri kaynağı oluşturun. Yalnızca Belge Yönetim Bilgileri erişimi için bir Belge Yönetim Bilgileri kaynağı oluşturun. Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız tek hizmetli bir kaynağa ihtiyacınız olduğunu lütfen unutmayın.
Kaynağınız dağıtıldıktan sonra Kaynağa git'i seçin. Uygulamanızı Belge Zekası API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde koda yapıştırırsınız:
Kopyalayıp uygulamanıza yapıştırmak için bir kod örneği seçin:
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için bkz . Azure AI hizmetleri güvenliği.
Deneyin: Düzen modeli
- değerini, elde ettiğiniz uç noktayla Belge Yönetim Bilgileri aboneliğinizle değiştirin
{endpoint}
. - değerini önceki adımda kopyaladığınız anahtarla değiştirin
{key}
. - değerini örnek belge URL'si ile değiştirin
\"{your-document-url}
:
https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-layout.pdf
İstek
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}'}"
İşlem Konumu
Operation-Location üst bilgisi içeren bir yanıt alırsınız202 (Success)
. Bu üst bilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç kimliği içerir:
https:// cognitiveservice/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Aşağıdaki örnekte URL'nin bir parçası olarak, sonrasındaki dize analyzeResults/
sonuç kimliğidir.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Düzen sonuçlarını alma
Çözümle Düzeni API'sini çağırdıktan sonra, işlemin durumunu ve ayıklanan verileri almak için Çözümle Düzeni Sonuç API'sini çağırırsınız. Komutu çalıştırmadan önce şu değişiklikleri yapın:
- değerini, elde ettiğiniz uç noktayla Belge Yönetim Bilgileri aboneliğinizle değiştirin
{endpoint}
. - değerini önceki adımda kopyaladığınız anahtarla değiştirin
{key}
. - değerini önceki adımdaki sonuç kimliğiyle değiştirin
{resultId}
.
İstek
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Sonuçları inceleme
JSON içeriğiyle bir 200 (success)
yanıt alırsınız.
Aşağıdaki fatura görüntüsüne ve buna karşılık gelen JSON çıkışına bakın.
- Düğüm,
"readResults"
sayfada ilgili sınırlayıcı kutu yerleşimine sahip her metin satırını içerir. - Düğüm her
selectionMarks
seçim işaretini (onay kutusu, radyo işareti) ve durumunun veyaunselected
olupselected
olmadığını gösterir. - bölümü
"pageResults"
ayıklanan tabloları içerir. Her tablo için metin, satır ve sütun dizini, yayılan satır ve sütun, sınırlayıcı kutu ve daha fazlası ayıklanır.
Yanıt gövdesi
GitHub'da tam örnek çıktısını görüntüleyebilirsiniz.
Deneyin: Önceden oluşturulmuş model
Önceden oluşturulmuş bir model seçin
Faturalarla sınırlı değilsiniz; aralarından seçim yapabileceğiniz birkaç önceden oluşturulmuş model vardır ve bunların her birinin kendi desteklenen alanları vardır. Analiz işlemi için kullanılacak model, analiz edilecek belgenin türüne bağlıdır. Belge Yönetim Bilgileri hizmeti tarafından şu anda desteklenen önceden oluşturulmuş modeller şunlardır:
- Fatura: Faturalardan metin, seçim işaretleri, tablolar, alanlar ve anahtar bilgilerini ayıklar.
- Alındı bilgisi: Makbuzlardan metin ve anahtar bilgilerini ayıklar.
- Kimlik belgesi: Sürücü belgelerinden ve uluslararası pasaportlardan metin ve anahtar bilgilerini ayıklar.
- Kartvizit: Kartvizitlerden metin ve önemli bilgileri ayıklar.
Komutu çalıştırmadan önce şu değişiklikleri yapın:
değerini, elde ettiğiniz uç noktayla Belge Yönetim Bilgileri aboneliğinizle değiştirin
{endpoint}
.değerini önceki adımda kopyaladığınız anahtarla değiştirin
{key}
.değerini örnek fatura URL'si ile değiştirin
\"{your-document-url}
:https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/sample-invoice.pdf
İstek
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}'}"
İşlem Konumu
Operation-Location üst bilgisi içeren bir yanıt alırsınız202 (Success)
. Bu üst bilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç kimliği içerir:
https:// cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Aşağıdaki örnekte URL'nin bir parçası olarak, sonraki dize analyzeResults/
sonuç kimliğidir:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Fatura sonuçlarını alma
Fatura Analizi API'sini çağırdıktan sonra, işlemin ve ayıklanan verilerin durumunu almak için Fatura AnaliziNi Al Sonuç API'sini çağırırsınız. Komutu çalıştırmadan önce şu değişiklikleri yapın:
- değerini, aldığınız uç noktayla Belge Yönetim Bilgileri anahtarınız ile değiştirin
{endpoint}
. Belge Yönetim Bilgileri kaynağına Genel Bakış sekmesinde bulabilirsiniz. - değerini önceki adımdaki sonuç kimliğiyle değiştirin
{resultId}
. {key}
yerine anahtarınızı yazın.
İstek
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {key}"
Yanıtı inceleme
JSON çıkışıyla bir 200 (Success)
yanıt alırsınız.
- alanı,
"readResults"
faturadan ayıklanan her metin satırını içerir. - ,
"pageResults"
faturadan ayıklanan tabloları ve seçim işaretlerini içerir. - alanı,
"documentResults"
faturanın en ilgili bölümleri için anahtar/değer bilgilerini içerir.
Örnek fatura belgesine bakın.