Tcl Requires Chilkat v11.7.0+
Tcl
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
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