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

Tcl

load ./chilkat.dll

set success 0

#  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

set pdf [new_CkPdf]

set success [CkPdf_LoadFile $pdf "qa_data/pdf/invoice_template.pdf"]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    exit
}

#  Values for most of the template's placeholders -- but not {{po}}, {{qty2}}, {{desc2}}, {{price2}} or {{amount2}}.
set json [new_CkJsonObject]

CkJsonObject_UpdateString $json "placeholders.customer" "Acme Corp"
CkJsonObject_UpdateString $json "placeholders.date" "2026-10-18"
CkJsonObject_UpdateString $json "placeholders.qty1" "2"
CkJsonObject_UpdateString $json "placeholders.desc1" "Cordless drill, 18 V"
CkJsonObject_UpdateString $json "placeholders.price1" "$460.00"
CkJsonObject_UpdateString $json "placeholders.amount1" "$920.00"
CkJsonObject_UpdateString $json "placeholders.subtotal" "$920.00"
CkJsonObject_UpdateString $json "placeholders.taxRate" "7.35%"
CkJsonObject_UpdateString $json "placeholders.tax" "$67.62"
CkJsonObject_UpdateString $json "placeholders.total" "$987.62"

#  "check" reports what "apply" would do, without changing the PDF.
set jsonOut [new_CkJsonObject]

set success [CkPdf_TextReplace $pdf "check" $json $jsonOut]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    delete_CkJsonObject $json
    delete_CkJsonObject $jsonOut
    exit
}

puts "ok: [CkJsonObject_BoolOf $jsonOut ok]"
puts "would replace: [CkJsonObject_SizeOfArray $jsonOut 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
set i 0
set count_i [CkJsonObject_SizeOfArray $jsonOut "problems"]
while {$i < $count_i} {
    CkJsonObject_put_I $jsonOut $i
    puts "problem: [CkJsonObject_stringOf $jsonOut {problems[i].field}][CkJsonObject_stringOf $jsonOut {problems[i].label}] - [CkJsonObject_stringOf $jsonOut {problems[i].reason}] (page [CkJsonObject_IntOf $jsonOut {problems[i].page}])"
    set i [expr $i + 1]
}

#  Give the missing placeholders their values and check again.
CkJsonObject_UpdateString $json "placeholders.po" "PO-88213"
CkJsonObject_UpdateString $json "placeholders.qty2" "0"
CkJsonObject_UpdateString $json "placeholders.desc2" "(no second item)"
CkJsonObject_UpdateString $json "placeholders.price2" ""
CkJsonObject_UpdateString $json "placeholders.amount2" ""
set success [CkPdf_TextReplace $pdf "check" $json $jsonOut]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    delete_CkJsonObject $json
    delete_CkJsonObject $jsonOut
    exit
}

puts "ok after adding the values: [CkJsonObject_BoolOf $jsonOut ok]"

#  Now apply.
if {[CkJsonObject_BoolOf $jsonOut "ok"] == 1} then {
    set success [CkPdf_TextReplace $pdf "apply" $json $jsonOut]
    if {$success == 0} then {
        puts [CkPdf_lastErrorText $pdf]
        delete_CkPdf $pdf
        delete_CkJsonObject $json
        delete_CkJsonObject $jsonOut
        exit
    }

    puts "applied: [CkJsonObject_BoolOf $jsonOut applied]"
    set success [CkPdf_WriteFile $pdf "qa_output/invoice_checked.pdf"]
    if {$success == 0} then {
        puts [CkPdf_lastErrorText $pdf]
        delete_CkPdf $pdf
        delete_CkJsonObject $json
        delete_CkJsonObject $jsonOut
        exit
    }

}

#  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

delete_CkPdf $pdf
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut