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

Remove PDF Objects Nothing Refers To

See more PDF Optimization Examples

Demonstrates removeUnreferenced. When a page, an image or a whole section is replaced in an editor, the objects it used often stay in the file with nothing pointing at them any more. They are not old revisions -- they are in the current revision, simply unreachable -- so only a reachability walk from the document catalog finds them. In a publication assembled over several editing passes this is frequently the largest single saving.

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

set pdf [new_CkPdf]

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

set json [new_CkJsonObject]

set jsonOut [new_CkJsonObject]

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

puts "fileSize: [CkJsonObject_IntOf $jsonOut fileSize]"
puts "removeUnreferenced would save: [CkJsonObject_IntOf $jsonOut estimatedSavings.removeUnreferenced]"

#  Optimize with the defaults and see how many objects were actually dropped.
set success [CkPdf_Optimize $pdf "optimize" $json $jsonOut]
if {$success == 0} then {
    puts [CkPdf_lastErrorText $pdf]
    delete_CkPdf $pdf
    delete_CkJsonObject $json
    delete_CkJsonObject $jsonOut
    exit
}

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

puts "objects removed: [CkJsonObject_IntOf $jsonOut actions.removeUnreferenced.count]"
puts "bytes saved:     [CkJsonObject_IntOf $jsonOut actions.removeUnreferenced.bytesSaved]"

#  Nothing a page needs is ever removed: the walk starts at the document catalog and follows every
#  reference, including the ones in annotations, the structure tree, named destinations and the
#  optional-content configuration.
puts "pages after: [CkPdf_get_NumPages $pdf]"

delete_CkPdf $pdf
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut