Sample code for 30+ languages & platforms
React Native 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 React Native Downloads

React Native
import { JsonObject, Pdf } from '@chilkat/react-native'

function chilkatExample() {
  // 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

  const pdf = new Pdf();
  try {
    pdf.loadFile('qa_data/pdf/invoice_signed.pdf');
  } catch {
    console.log(pdf.lastErrorText);
    return;
  }

  console.log(`Signatures: ${pdf.numSignatures}`);

  const json = new JsonObject();
  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.
  const jsonOut = new JsonObject();
  try {
    pdf.textReplace('check', json, jsonOut);
  } catch {
    console.log(pdf.lastErrorText);
    return;
  }

  console.log(`check: ok = ${jsonOut.boolOf('ok')}`);

  // "apply" is refused while PreserveSignatures is true (the default).
  try {
    pdf.textReplace('apply', json, jsonOut);
  } catch {
    console.log(`apply refused: ${pdf.lastErrorText}`);
  }

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

  console.log(`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');
  } catch {
    console.log(pdf.lastErrorText);
    return;
  }

  console.log(`Signatures after writing: ${pdf.numSignatures}`);
  const sigInfo = new JsonObject();
  let validated = true;
  try {
    pdf.verifySignature(0, sigInfo);
  } catch {
    validated = false;
  }
  console.log(`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
}