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

Split Data across Several QR Codes (Structured Append)

See more QR Code Examples

Demonstrates structured append, the QR feature for data too large for one symbol of the size wanted. The data is divided over up to 16 symbols, and each carries its position, the total, and a parity byte that ties the set together. With encoding.structuredAppend.enabled, QrCode uses as few symbols as it can. output.pathTemplate writes one file per symbol, with {index} replaced by 1, 2, 3 and so on. The reader must support structured append to put the parts back together. Many phone camera apps do not, and show each part separately.

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

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

procedure RunDemo;
var
  success: Boolean;
  sbText: TStringBuilder;
  i: Integer;
  json: TJsonObject;
  fmt: TFormats;
  jsonOut: TJsonObject;
  numSymbols: Integer;

begin
  success := False;

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

  //  Some text that is too long for one symbol of the size allowed below.
  sbText := TStringBuilder.Create;

  for i := 1 to 20 do
    begin
      sbText.Append('Line ');
      sbText.AppendInt(i);
      sbText.AppendLine(' of a message that is too long for one small QR code.',True);
    end;

  json := TJsonObject.Create;
  json.UpdateSb('payload.text',sbText);

  //  Keep each symbol small (version 10 is 57 modules wide) and allow a set of symbols.
  json.UpdateInt('encoding.qr.maxVersion',10);
  json.UpdateBool('encoding.structuredAppend.enabled',True);

  //  One file for each symbol: qr_part_1.png, qr_part_2.png, ...
  json.UpdateString('output.pathTemplate','qa_output/qr_part_{index}.png');
  json.UpdateBool('output.overwrite',True);
  json.UpdateString('output.return','none');

  fmt := TFormats.Create;
  jsonOut := TJsonObject.Create;
  success := fmt.QrCode('generate',json,jsonOut);
  if (success = False) then
    begin
      WriteLn(fmt.LastErrorText);
      Exit;
    end;

  WriteLn('text length: ' + sbText.Length);
  numSymbols := jsonOut.SizeOfArray('symbols');
  WriteLn('symbols: ' + numSymbols);
  for i := 0 to numSymbols - 1 do
    begin
      jsonOut.I := i;
      //  structuredAppend.index counts from 0.
      WriteLn(jsonOut.StringOf('outputs[i].path') + ': symbol ' + (jsonOut.IntOf('symbols[i].structuredAppend.index') + 1) + ' of ' + jsonOut.IntOf('symbols[i].structuredAppend.total')
           + ', version ' + jsonOut.IntOf('symbols[i].selectedEncoding.version') + ', ' + jsonOut.IntOf('symbols[i].payloadBytes') + ' bytes');
    end;

  //  Every symbol of a set carries the same parity byte, which is how a reader knows they belong together.
  WriteLn('parity: ' + jsonOut.IntOf('symbols[0].structuredAppend.parity'));

  //  The six symbols:

  //  image

  //  Sample output:

  //  text length: 1231
  //  symbols: 6
  //  qa_output/qr_part_1.png: symbol 1 of 6, version 10, 206 bytes
  //  qa_output/qr_part_2.png: symbol 2 of 6, version 10, 205 bytes
  //  qa_output/qr_part_3.png: symbol 3 of 6, version 10, 205 bytes
  //  qa_output/qr_part_4.png: symbol 4 of 6, version 10, 205 bytes
  //  qa_output/qr_part_5.png: symbol 5 of 6, version 10, 205 bytes
  //  qa_output/qr_part_6.png: symbol 6 of 6, version 10, 205 bytes
  //  parity: 50


  sbText.Free;
  json.Free;
  fmt.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.