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

Replace Text in a Signed PDF (PreserveSignatures)

See more PDF Text Replacement Examples

Applying a text replacement rewrites the page content, which invalidates any digital signature on the PDF. While the PreserveSignatures property is true (the default), "apply" is refused on a signed PDF; "check" only reads and is always allowed. Setting PreserveSignatures to false allows the replacement; the signature field stays in the written PDF but no longer verifies, so the document should be signed again afterwards if a signature is wanted.

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // 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_signed.pdf

  final pdf = CkPdf();
  try {
    pdf.loadFile('qa_data/pdf/invoice_signed.pdf');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  print('Signatures: ${pdf.numSignatures}');

  final json = CkJsonObject();
  json.updateString('labels[0].label', 'Invoice Number:');
  json.updateString('labels[0].value', 'INV-2026-0500');

  // "check" reads only, so it works on a signed PDF.
  final jsonOut = CkJsonObject();
  try {
    pdf.textReplace('check', json, jsonOut);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  print('check: ok = ${jsonOut.boolOf('ok')}');

  // "apply" is refused while PreserveSignatures is true (the default).
  try {
    pdf.textReplace('apply', json, jsonOut);
  } on ChilkatException catch (e) {
    print('apply refused: ${e.lastErrorText}');
  }

  // Allowing the signature to be broken:
  pdf.preserveSignatures = false;
  try {
    pdf.textReplace('apply', json, jsonOut);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  print('applied: ${jsonOut.boolOf('applied')}');

  // The written PDF is a full rewrite with the replacement.  The signature field is still in the document,
  // but the bytes it signed are gone, so it no longer verifies.
  try {
    pdf.writeFile('qa_output/invoice_reissued_broken_signature.pdf');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  print('Signatures after writing: ${pdf.numSignatures}');
  final sigInfo = CkJsonObject();
  var validated = true;
  try {
    pdf.verifySignature(0, sigInfo);
  } on ChilkatException {
    validated = false;
  }
  print('Signature 0 verifies: $validated');

  // Sample output:

  // Signatures: 1
  // check: ok = true
  // apply refused: ChilkatLog:
  //   TextReplace:
  //     DllDate: Nov  7 2026
  //     ChilkatVersion: 11.7.0
  //     UnlockPrefix: CHLKAT
  //     UnlockStatus: 2
  //     Architecture: Little Endian; 64-bit
  //     Language: Visual C++ 11.0 / x64
  //     VerboseLogging: 0
  //     replaceTextOp:
  //       op: apply
  //       The PDF is signed: replacing text rewrites the content and invalidates the signatures (set PreserveSignatures = false to allow it).
  //     --replaceTextOp
  //     Failed.
  //   --TextReplace
  // --ChilkatLog
  // 
  // applied: true
  // Signatures after writing: 1
  // Signature 0 verifies: false
}