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

Why a PDF Text Replacement Is Refused: the Font Rule

See more PDF Text Replacement Examples

A PDF stores glyphs drawn with particular fonts, so new text can only be drawn when the original font can draw it. This example shows the two common refusals. A font embedded as a subset carries only the glyphs the document used: a value made of other characters is refused with the reason missingGlyph, and the report names the font and the characters it lacks. A font that is neither one of the standard 14 nor embedded (here Verdana) is refused with nonStandardUnembeddedFont, because Chilkat cannot know what a viewer will draw for it. A non-embedded Arial, Times New Roman or Courier New is treated as the standard font every viewer substitutes for it.

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;
  pdf2: TPdf;
  json2: TJsonObject;

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 quote_subset_font.pdf
  //  and letter_verdana.pdf

  //  1. An embedded subset font: only the glyphs the document uses are in the PDF.
  pdf := TPdf.Create;
  success := pdf.LoadFile('qa_data/pdf/quote_subset_font.pdf');
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;

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

  //  The regular face's subset carries the characters of the quotation's text, among them the digits of
  //  "58341".  A new number made of those digits can be drawn...
  json.UpdateString('labels[0].label','Quote #:');
  json.UpdateString('labels[0].value','58314');
  success := pdf.TextReplace('check',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn('58314: ok = ' + jsonOut.BoolOf('ok'));

  //  ...but "Q" and "-" are not in the subset (nothing in the quotation's regular text uses them).
  json.UpdateString('labels[0].value','Q-58341');
  success := pdf.TextReplace('check',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf.LastErrorText);
      Exit;
    end;
  WriteLn('Q-58341: ok = ' + jsonOut.BoolOf('ok'));
  if (jsonOut.BoolOf('ok') = False) then
    begin
      //  The problem names the font and the characters it cannot draw.
      WriteLn('    reason: ' + jsonOut.StringOf('problems[0].reason'));
      WriteLn('    font: ' + jsonOut.StringOf('problems[0].font'));
      WriteLn('    missing: ' + jsonOut.StringOf('problems[0].chars'));
    end;

  //  "apply" with a problem returns false and changes nothing.
  success := pdf.TextReplace('apply',json,jsonOut);
  WriteLn('apply returned ' + success + ', applied = ' + jsonOut.BoolOf('applied'));

  //  2. A font that is not embedded and not one of the standard 14.
  pdf2 := TPdf.Create;
  success := pdf2.LoadFile('qa_data/pdf/letter_verdana.pdf');
  if (success = False) then
    begin
      WriteLn(pdf2.LastErrorText);
      Exit;
    end;

  json2 := TJsonObject.Create;
  json2.UpdateString('labels[0].label','Account Number:');
  json2.UpdateString('labels[0].value','0000099999');
  success := pdf2.TextReplace('check',json2,jsonOut);
  if (success = False) then
    begin
      WriteLn(pdf2.LastErrorText);
      Exit;
    end;
  WriteLn('Verdana, not embedded: ok = ' + jsonOut.BoolOf('ok') + ', reason: ' + jsonOut.StringOf('problems[0].reason') + ', font: ' + jsonOut.StringOf('problems[0].font'));

  //  Sample output:

  //  58314: ok = true
  //  Q-58341: ok = false
  //      reason: missingGlyph
  //      font: AAAAAA+DejaVuSans
  //      missing: Q-
  //  apply returned false, applied = false
  //  Verdana, not embedded: ok = false, reason: nonStandardUnembeddedFont, font: Verdana


  pdf.Free;
  json.Free;
  jsonOut.Free;
  pdf2.Free;
  json2.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.