Extração de Documentos com IA para Delphi e .NET

· Componentes
Extração de Documentos com IA para Delphi e .NET

A maioria dos softwares empresariais ainda tem alguém que lê um PDF e digita seus números à mão em um formulário. Faturas de fornecedores, recibos de caixa, o escaneamento de um documento de identidade na recepção. Hoje os grandes modelos de linguagem leem bem esses documentos, mas pedir a um modelo "os dados da fatura" devolve um texto em prosa, ou um JSON no formato que ele quis escrever, sem nenhuma forma de saber de quais valores ele não tinha certeza.

O sgcWebSockets 2026.10 adiciona o TsgcAIDocumentExtractor para Delphi, C++Builder e .NET. Você dá a ele um PDF ou uma imagem, ele pergunta ao modelo que você já usa por meio do TsgcAIChat, e devolve um JSON validado contra um esquema, com uma confiança para cada campo. O componente não faz parte da versão disponível para download atualmente. Ele chega com o lançamento 2026.10.

O TsgcAIDocumentExtractor lendo uma fatura PDF real com Anthropic Claude e devolvendo JSON validado com uma confiança por campo. Também no YouTube.

Entra um PDF, sai JSON

Coloque um TsgcAIChat e um TsgcAIDocumentExtractor em um formulário, aponte o extrator para o chat, escolha um preset e chame ExtractFile. OpenAI, Anthropic e Gemini leem arquivos PDF como eles são. DeepSeek, Grok, Mistral e Ollama só aceitam imagens, então para esses provedores você envia as páginas como PNG ou JPEG.

uses
  sgcAI, sgcAI_Chat, sgcAI_DocumentExtractor;

procedure TForm1.btnExtractClick(Sender: TObject);
begin
  oChat := TsgcAIChat.Create(Self);
  oChat.Provider := aicpAnthropic;
  oChat.ChatOptions.ApiKey := 'your-api-key';

  oExtractor := TsgcAIDocumentExtractor.Create(Self);
  oExtractor.AIChat := oChat;
  oExtractor.Preset := dpInvoice;

  Memo1.Lines.Text := oExtractor.ExtractFile('invoice.pdf');
end;

Esse é o fluxo mostrado no vídeo, e foi verificado ao vivo com o Anthropic Claude em uma fatura PDF real. ExtractFiles envia várias páginas de um mesmo documento em uma única requisição, e ExtractAttachments recebe documentos que você já tem em memória como base64.

O extrator faz seu trabalho por meio do TsgcAIChat, que ganha as mesmas capacidades para os seus próprios prompts. ChatWithDocument envia um PDF ou uma imagem com uma mensagem, ChatWithAttachments envia vários de uma vez, e ChatJSONWithAttachments pede uma resposta em JSON sobre eles. Uma nova propriedade TLSOptions define a versão do OpenSSL, o IOHandler e os certificados usados por cada provedor.

Memo1.Lines.Text := oChat.ChatWithDocument('Summarize this contract', 'contract.pdf');

oFiles := TsgcAIChatAttachments.Create;
try
  oFiles.AddFile('page1.png');
  oFiles.AddFile('page2.png');
  Memo1.Lines.Text := oChat.ChatJSONWithAttachments(
    'List every line item as JSON', oFiles);
finally
  oFiles.Free;
end;

Presets e seu próprio esquema

Três presets cobrem os documentos mais comuns: dpInvoice, dpReceipt e dpIDCard. Cada um traz seu esquema JSON e suas instruções de extração, então não há mais nada para configurar. Para qualquer outro documento, defina Preset como dpCustom e escreva você mesmo o esquema.

oExtractor.Preset := dpCustom;
oExtractor.SchemaName := 'purchase_order';
oExtractor.Schema.Text :=
  '{"type": "object", "additionalProperties": false,' +
  ' "required": ["order_number", "supplier", "total"],' +
  ' "properties": {' +
  '   "order_number": {"type": "string"},' +
  '   "supplier": {"type": ["string", "null"]},' +
  '   "total": {"type": "number"}}}';
oExtractor.Instructions.Text := 'Write every amount without a currency symbol.';

Com a OpenAI o esquema é enviado em modo estrito, então ele precisa seguir as regras estritas: todo objeto declara "additionalProperties": false, toda propriedade aparece em required, e um valor opcional usa um tipo anulável como ["string", "null"]. Os presets já embutidos seguem essas regras. Para partir de um deles e adicionar um campo, copie-o com TsgcAIDocumentExtractor.GetPresetSchema(dpInvoice).

Validação e nova tentativa

A resposta nunca chega ao seu código sem verificação. O extrator a valida localmente contra o esquema: tipos, propriedades obrigatórias, objetos e arrays aninhados, e enums. Quando não corresponde, o componente diz ao modelo o que deu errado e pede novamente. ValidationRetries define quantas vezes, e o padrão é 1.

Se os dados continuarem inválidos depois das tentativas, o extrator lança uma exceção. Defina RaiseOnInvalid como False para obter os dados mesmo assim e ler os problemas em LastResult.ValidationErrors, uma linha path: message para cada um.

oExtractor.ValidationRetries := 1;
oExtractor.RaiseOnInvalid := False;

Memo1.Lines.Text := oExtractor.ExtractFile('invoice.pdf');
if not oExtractor.LastResult.Valid then
  Memo1.Lines.AddStrings(oExtractor.LastResult.ValidationErrors);

Confiança e revisão humana

JSON válido não é o mesmo que JSON correto. Um total borrado ou uma data manchada ainda podem produzir um número bem formado. Por isso o modelo também informa o quão seguro está de cada campo que extraiu, e o extrator te dá esses valores. LastResult.Confidence é o mais baixo entre eles, LastResult.FieldConfidence('total') devolve o valor de um caminho específico, e OnLowConfidence dispara uma vez para cada campo abaixo de MinConfidence.

oExtractor.MinConfidence := 0.8;
oExtractor.OnLowConfidence := OnLowConfidenceEvent;
Memo1.Lines.Text := oExtractor.ExtractFile('invoice.pdf');

if oExtractor.LastResult.FieldConfidence('total') < 0.8 then
  ShowMessage('Check the total by hand');

procedure TForm1.OnLowConfidenceEvent(Sender: TObject; const aField: string;
  aConfidence: Double);
begin
  lstReview.Items.Add(Format('%s: %.2f', [aField, aConfidence]));
end;

Isso transforma uma fila de revisão em algo que uma pessoa consegue terminar: ela confere os dois campos dos quais o modelo não tinha certeza, não a fatura inteira.

OCR local, nada sai da máquina

Alguns documentos não podem ir para nenhum serviço na nuvem. Vincule um componente de OCR ao extrator e escolha o mecanismo que preferir. O TsgcAIOCRTesseract executa o mecanismo OCR Tesseract instalado na máquina. O TsgcAIOCRWindows usa o reconhecimento de texto embutido no Windows 10 e versões posteriores, então não há nada para instalar. Com OCRMode definido como domAlways, as imagens nunca são enviadas ao modelo. O mecanismo de OCR lê o texto localmente, e um modelo de texto como o Ollama faz a extração, então todo o pipeline roda no seu próprio hardware.

oOCR := TsgcAIOCRTesseract.Create(Self);
oOCR.Language := 'eng';

oChat.Provider := aicpOllama;
oChat.ChatOptions.Model := 'llama3.1';

oExtractor.OCR := oOCR;
oExtractor.OCRMode := domAlways;
oExtractor.Preset := dpReceipt;
Memo1.Lines.Text := oExtractor.ExtractFile('receipt.png');

O mecanismo do Windows aceita uma tag de idioma BCP-47, como en-US, ou um Language vazio para usar os idiomas do perfil do usuário.

oWinOCR := TsgcAIOCRWindows.Create(Self);
oWinOCR.Language := 'en-US';

oExtractor.OCR := oWinOCR;
oExtractor.OCRMode := domFallback;
Memo1.Lines.Text := oExtractor.ExtractFile('invoice.png');

domFallback, usado neste segundo exemplo, é a outra opção. O extrator tenta primeiro a requisição de visão e só usa o texto reconhecido quando essa requisição falha, disparando OnOCRFallback para que você saiba que isso aconteceu. LastResult.UsedOCR e LastResult.OCRText informam depois qual caminho produziu os dados. A etapa de OCR lê imagens, então um PDF escaneado entra como imagens de página.

C# para .NET

A edição .NET do sgcWebSockets tem os mesmos componentes com os mesmos nomes no namespace esegece.sgcWebSockets. Os presets, os valores de confiança e os eventos funcionam da mesma forma, e os dois mecanismos de OCR, TsgcAIOCRTesseract e TsgcAIOCRWindows, também estão lá.

using esegece.sgcWebSockets;

var chat = new TsgcAIChat();
chat.Provider = TsgcAIChatProvider.aicpAnthropic;
chat.ChatOptions.ApiKey = "your-api-key";

var extractor = new TsgcAIDocumentExtractor();
extractor.AIChat = chat;
extractor.Preset = TsgcAIDocumentPreset.dpInvoice;
extractor.MinConfidence = 0.8;
extractor.OnLowConfidence += (sender, field, confidence) =>
    Console.WriteLine($"review {field}: {confidence:0.00}");

string json = extractor.ExtractFile("invoice.pdf");
Console.WriteLine(json);
Console.WriteLine($"valid: {extractor.LastResult.Valid}, confidence: {extractor.LastResult.Confidence:0.00}");

Disponibilidade

TsgcAIDocumentExtractor, TsgcAIOCRTesseract, TsgcAIOCRWindows e os novos métodos de TsgcAIChat chegam no sgcWebSockets 2026.10, para Delphi, C++Builder e .NET. Eles não estão na versão que você pode baixar hoje. Quando a 2026.10 sair, estará na página de download.

A referência completa, com cada propriedade e evento e um guia passo a passo para faturas, está na ajuda do TsgcAIDocumentExtractor. Para tudo mais que os componentes de IA fazem, veja a página de produto sgcAI e a página de IA do sgcWebSockets.

Leia também

Dúvidas, feedback ou ajuda com a migração? Entre em contato. Você receberá uma resposta das pessoas que escreveram o código.