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

Check a PDF Text Replacement Before Applying It

See more PDF Text Replacement Examples

Demonstrates the "check" operation, which finds every placeholder and label and applies the font rule but changes nothing, and how to read its report: "ok" says whether "apply" would succeed, "replacements" lists what would be replaced, and "problems" lists what prevents it, each with a reason. Here the first check fails because a placeholder on the page was given no value; the value is added and the check passes, and only then is "apply" called.

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;
  i: Integer;
  count_i: Integer;

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;

  //  Values for most of the template's placeholders -- but not {{po}}, {{qty2}}, {{desc2}}, {{price2}} or {{amount2}}.
  json := TJsonObject.Create;
  json.UpdateString('placeholders.customer','Acme Corp');
  json.UpdateString('placeholders.date','2026-10-18');
  json.UpdateString('placeholders.qty1','2');
  json.UpdateString('placeholders.desc1','Cordless drill, 18 V');
  json.UpdateString('placeholders.price1','$460.00');
  json.UpdateString('placeholders.amount1','$920.00');
  json.UpdateString('placeholders.subtotal','$920.00');
  json.UpdateString('placeholders.taxRate','7.35%');
  json.UpdateString('placeholders.tax','$67.62');
  json.UpdateString('placeholders.total','$987.62');

  //  "check" reports what "apply" would do, without changing the PDF.
  jsonOut := TJsonObject.Create;
  success := pdf.TextReplace('check',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;

  WriteLn('ok: ' + jsonOut.BoolOf('ok'));
  WriteLn('would replace: ' + jsonOut.SizeOfArray('replacements') + ' placeholders');

  //  Each problem names the placeholder (field) or label, and a reason:
  //    notFound - the placeholder or label is not on the selected pages
  //    unusedPlaceholder - a placeholder on the page was given no value
  //    missingGlyph, notInEncoding, nonStandardUnembeddedFont, unsupportedFont - the font rule
  //    placeholderSpansFonts - the text is drawn with more than one font or size
  i := 0;
  count_i := jsonOut.SizeOfArray('problems');
  while i < count_i do
    begin
      jsonOut.I := i;
      WriteLn('problem: ' + jsonOut.StringOf('problems[i].field') + jsonOut.StringOf('problems[i].label') + ' - ' + jsonOut.StringOf('problems[i].reason') + ' (page '
           + jsonOut.IntOf('problems[i].page') + ')');
      i := i + 1;
    end;

  //  Give the missing placeholders their values and check again.
  json.UpdateString('placeholders.po','PO-88213');
  json.UpdateString('placeholders.qty2','0');
  json.UpdateString('placeholders.desc2','(no second item)');
  json.UpdateString('placeholders.price2','');
  json.UpdateString('placeholders.amount2','');
  success := pdf.TextReplace('check',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn('ok after adding the values: ' + jsonOut.BoolOf('ok'));

  //  Now apply.
  if (jsonOut.BoolOf('ok') = True) then
    begin
      success := pdf.TextReplace('apply',json,jsonOut);
      if (success = False) then
        begin
          WriteLn(pdf.LastErrorText);
          Exit;
        end;
      WriteLn('applied: ' + jsonOut.BoolOf('applied'));
      success := pdf.WriteFile('qa_output/invoice_checked.pdf');
      if (success = False) then
        begin
          WriteLn(pdf.LastErrorText);
          Exit;
        end;
    end;

  //  Sample output:

  //  ok: false
  //  would replace: 10 placeholders
  //  problem: po - unusedPlaceholder (page 1)
  //  problem: qty2 - unusedPlaceholder (page 1)
  //  problem: desc2 - unusedPlaceholder (page 1)
  //  problem: price2 - unusedPlaceholder (page 1)
  //  problem: amount2 - unusedPlaceholder (page 1)
  //  ok after adding the values: true
  //  applied: true


  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.