Sample code for 30+ languages & platforms
Lazarus Pascal Requires Chilkat v11.7.0+

Get a PDF Field Value by its Label (Value to the Right)

See more PDF Text Extraction Examples

Demonstrates the "label" option, which captures the text that belongs to a caption such as "Invoice Number:" without needing coordinates. With labelValue "right", the value is the rest of the label's line. Label matching ignores case, extra spaces and a trailing colon.

Chilkat Lazarus Pascal Downloads

Lazarus Pascal
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Pdf,
  Chilkat.JsonObject;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  pdf: TPdf;
  json: TJsonObject;
  jsonOut: TJsonObject;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  The invoice used in this example is available at invoice_labels.pdf

  pdf := TPdf.Create;
  success := pdf.LoadFile('qa_data/pdf/invoice_labels.pdf');
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;

  json := TJsonObject.Create;
  jsonOut := TJsonObject.Create;

  //  The invoice has lines such as "Invoice Number:   INV-2026-0412".
  //  The label option restricts the "text" operation to the text belonging to the label.
  json.UpdateString('label','Invoice Number');

  //  "right" means the value is the rest of the label's line.
  //  (The default, "auto", uses the rest of the line if there is text there, otherwise the block below.)
  json.UpdateString('labelValue','right');

  success := pdf.ExtractText('text',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;

  //  The value is returned as the text.
  WriteLn('Invoice Number: ' + jsonOut.StringOf('text'));

  //  The labelMatches array tells where the label was found and how it appeared in the PDF.
  WriteLn('Found on page ' + jsonOut.IntOf('labelMatches[0].page') + ' as "' + jsonOut.StringOf('labelMatches[0].label') + '"');

  //  Matching ignores case and the trailing colon, so these all work:
  json.UpdateString('label','CUSTOMER:');
  success := pdf.ExtractText('text',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn('Customer: ' + jsonOut.StringOf('text'));

  json.UpdateString('label','due date');
  success := pdf.ExtractText('text',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn('Due Date: ' + jsonOut.StringOf('text'));

  //  The totals at the foot of the invoice are right-aligned labels with the amount beside them.
  json.UpdateString('label','Total Due');
  success := pdf.ExtractText('text',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn('Total Due: ' + jsonOut.StringOf('text'));

  //  A label that is not found is not an error.  The text is empty, labelMatches is empty,
  //  and the quality report has an issue with the code "labelNotFound".
  json.UpdateString('label','Tracking Number');
  success := pdf.ExtractText('text',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  if (jsonOut.SizeOfArray('labelMatches') = 0) then
    begin
      WriteLn('Tracking Number: (not found) ' + jsonOut.StringOf('quality.pages[0].issues[0].code'));
    end;

  //  Sample output:

  //  Invoice Number: INV-2026-0412
  //  Found on page 1 as "Invoice Number:"
  //  Customer: Northwind Traders
  //  Due Date: April 13, 2026
  //  Total Due: $1,234.53
  //  Tracking Number: (not found) labelNotFound


  pdf.Free;
  json.Free;
  jsonOut.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.