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

Alignment of Replaced PDF Text: Right-Aligned Amounts

See more PDF Text Replacement Examples

When the new text is wider or narrower than the text it replaces, the "align" option decides where it sits. The default, "auto", keeps a placeholder in place when it is right-aligned with other text on the page or centered, and otherwise keeps its left edge; a label's value is always left-aligned after its label. The invoice template's amounts are right-aligned, so the new amounts keep their right edge, which the "grid" text layout (characters placed by position) shows.

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.StringBuilder,
  Chilkat.Pdf,
  Chilkat.JsonObject;

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

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

begin
  success := False;

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

  //  The PDF used in this example is available at invoice_template.pdf

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

  json := TJsonObject.Create;
  json.UpdateString('placeholders.customer','Acme Corp');
  json.UpdateString('placeholders.date','2026-10-18');
  json.UpdateString('placeholders.po','PO-88213');
  json.UpdateString('placeholders.qty1','12');
  json.UpdateString('placeholders.desc1','Cordless drill, 18 V');
  json.UpdateString('placeholders.price1','$460.00');
  json.UpdateString('placeholders.amount1','$5,520.00');
  json.UpdateString('placeholders.qty2','60');
  json.UpdateString('placeholders.desc2','Galvanized hinge, 4 inch');
  json.UpdateString('placeholders.price2','$12.50');
  json.UpdateString('placeholders.amount2','$750.00');
  json.UpdateString('placeholders.subtotal','$6,270.00');
  json.UpdateString('placeholders.taxRate','7.35%');
  json.UpdateString('placeholders.tax','$460.85');
  json.UpdateString('placeholders.total','$6,730.85');

  //  "auto" is the default: a placeholder that is right-aligned with other text keeps its right edge.
  //  The other choices are "left", "right" and "center".
  json.UpdateString('align','auto');

  jsonOut := TJsonObject.Create;
  success := pdf.TextReplace('apply',json,jsonOut);
  if (success = False) then
    begin
      WriteLn('Not applied: ' + jsonOut.Emit());
      if (success = False) then
        begin
          WriteLn(pdf.LastErrorText);
          Exit;
        end;
    end;

  //  A replacement that runs into neighbouring text or off the page is still made, with a warning.
  WriteLn('warnings: ' + jsonOut.SizeOfArray('warnings'));

  success := pdf.WriteFile('qa_output/invoice_aligned.pdf');
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;

  //  The "grid" layout places each character by its position on the page, so the right-aligned
  //  amounts can be seen to line up (the wider amounts grew to the left).
  jsonText := TJsonObject.Create;
  jsonText.UpdateString('layout','grid');
  sbText := TStringBuilder.Create;
  success := pdf.ExtractTextSb('text',jsonText,sbText,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn(sbText.GetAsString());

  //  Sample output:

  //  warnings: 0
  //  INVOICE
  //  Chilkat Hardware Supply
  //  1200 Harbor Road, Suite 4
  //  Portside, WA 98000
  //  
  //  
  //  Bill To:         Acme Corp
  //  Invoice #:       INV-0000
  //  Date:            2026-10-18
  //  PO Number:       PO-88213
  //  Ref:             A-1
  //  
  //  
  //  
  //   Qty         Description                          Unit Price    Amount
  //   12          Cordless drill, 18 V                     $460.00     $5,520.00
  //   60          Galvanized hinge, 4 inch                 $12.50      $750.00
  //  
  //                                                         Subtotal:    $6,270.00
  //                                                  Tax (7.35%):          $460.85
  //                                                        Total Due:    $6,730.85
  //  
  //  Ref:             A-2
  //  
  //  Payment is due within 30 days. Please include the invoice number with your payment.
  //  Thank you for your business, Acme Corp!
  //  View this invoice online


  pdf.Free;
  json.Free;
  jsonOut.Free;
  jsonText.Free;
  sbText.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.