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

Search a PDF with a Regular Expression

See more PDF Text Extraction Examples

Demonstrates searching a PDF with a regular expression (regex: true), limiting the number of results (maxResults), and matching whole words only (wholeWord).

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 order_records.pdf

set pdf [new_CkPdf]

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

set json [new_CkJsonObject]

set jsonOut [new_CkJsonObject]

#  Find every order number.  With regex set to true, the query is a regular expression.
CkJsonObject_UpdateString $json "query" "ORD-[0-9]{4}-[0-9]{4}"
CkJsonObject_UpdateBool $json "regex" 1
#  We only want the matched text, so no context is needed.
CkJsonObject_UpdateInt $json "context" 0

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

puts "Order numbers found: [CkJsonObject_IntOf $jsonOut count]"
set i 0
set count_i [CkJsonObject_SizeOfArray $jsonOut "matches"]
while {$i < $count_i} {
    CkJsonObject_put_I $jsonOut $i
    puts [CkJsonObject_stringOf $jsonOut {matches[i].text}]
    set i [expr $i + 1]
}

#  Find the e-mail addresses, but stop after the first three.
CkJsonObject_UpdateString $json "query" "[a-z0-9._]+@[a-z]+[.][a-z]+"
CkJsonObject_UpdateInt $json "maxResults" 3
set success [CkPdf_ExtractText $pdf "search" $json $jsonOut]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    delete_CkJsonObject $json
    delete_CkJsonObject $jsonOut
    exit
}

puts "First three e-mail addresses:"
set i 0
set count_i [CkJsonObject_SizeOfArray $jsonOut "matches"]
while {$i < $count_i} {
    CkJsonObject_put_I $jsonOut $i
    puts [CkJsonObject_stringOf $jsonOut {matches[i].text}]
    set i [expr $i + 1]
}

#  wholeWord: true matches only whole words.  The word "cat" appears once in the PDF,
#  but it is also inside "catalog" and "category".
CkJsonObject_Delete $json "maxResults"
CkJsonObject_UpdateBool $json "regex" 0
CkJsonObject_UpdateString $json "query" "cat"
set success [CkPdf_ExtractText $pdf "search" $json $jsonOut]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    delete_CkJsonObject $json
    delete_CkJsonObject $jsonOut
    exit
}

puts "Occurrences of cat (any): [CkJsonObject_IntOf $jsonOut count]"

CkJsonObject_UpdateBool $json "wholeWord" 1
set success [CkPdf_ExtractText $pdf "search" $json $jsonOut]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    delete_CkJsonObject $json
    delete_CkJsonObject $jsonOut
    exit
}

puts "Occurrences of cat (whole word): [CkJsonObject_IntOf $jsonOut count]"

#  Sample output:

#  Order numbers found: 9
#  ORD-2026-0301
#  ORD-2026-0302
#  ORD-2026-0303
#  ORD-2026-0304
#  ORD-2026-0305
#  ORD-2026-0306
#  ORD-2026-0307
#  ORD-2026-0308
#  ORD-2026-0307
#  First three e-mail addresses:
#  alice.moore@example.com
#  bkumar@example.org
#  carla@example.net
#  Occurrences of cat (any): 3
#  Occurrences of cat (whole word): 1

delete_CkPdf $pdf
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut