Tcl Requires Chilkat v11.7.0+
Tcl
PDF Object Streams: generate, preserve or disable
See more PDF Optimization Examples
Demonstrates the objectStreams option. An object stream packs many small objects (dictionaries, not stream data) into one compressed stream, which is usually a worthwhile saving in a document with many pages or tags. "generate" (the default) packs them and writes a cross-reference stream; "preserve" keeps the file as it is -- packed if it already was, not packed if it was not; "disable" writes every object on its own with a classic cross-reference table, which is what a PDF 1.4 reader needs. Object streams require PDF 1.5 and are skipped for PDF/A-1.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 grand_canyon_hiking_guide.pdf
set fac [new_CkFileAccess]
set json [new_CkJsonObject]
set jsonOut [new_CkJsonObject]
# generate: pack the objects (the default).
set pdf1 [new_CkPdf]
set success [CkPdf_LoadFile $pdf1 "qa_data/pdf/grand_canyon_hiking_guide.pdf"]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf1]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
exit
}
CkJsonObject_UpdateString $json "objectStreams" "generate"
set success [CkPdf_Optimize $pdf1 "optimize" $json $jsonOut]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf1]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
exit
}
set success [CkPdf_WriteFile $pdf1 "qa_output/grand_canyon_objstm_generate.pdf"]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf1]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
exit
}
puts "generate: [CkFileAccess_FileSize $fac qa_output/grand_canyon_objstm_generate.pdf] bytes, objects packed: [CkJsonObject_IntOf $jsonOut actions.objectStreams.count]"
# disable: every object on its own, with a classic cross-reference table.
set pdf2 [new_CkPdf]
set success [CkPdf_LoadFile $pdf2 "qa_data/pdf/grand_canyon_hiking_guide.pdf"]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf2]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
exit
}
CkJsonObject_UpdateString $json "objectStreams" "disable"
set success [CkPdf_Optimize $pdf2 "optimize" $json $jsonOut]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf2]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
exit
}
set success [CkPdf_WriteFile $pdf2 "qa_output/grand_canyon_objstm_disable.pdf"]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf2]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
exit
}
puts "disable: [CkFileAccess_FileSize $fac qa_output/grand_canyon_objstm_disable.pdf] bytes"
# preserve: leave the file's own structure alone. Use it when the output must stay readable by
# whatever reads the input today.
set pdf3 [new_CkPdf]
set success [CkPdf_LoadFile $pdf3 "qa_data/pdf/grand_canyon_hiking_guide.pdf"]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf3]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
delete_CkPdf $pdf3
exit
}
CkJsonObject_UpdateString $json "objectStreams" "preserve"
set success [CkPdf_Optimize $pdf3 "optimize" $json $jsonOut]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf3]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
delete_CkPdf $pdf3
exit
}
set success [CkPdf_WriteFile $pdf3 "qa_output/grand_canyon_objstm_preserve.pdf"]
if {$success == 0} then {
puts [CkPdf_lastErrorText $pdf3]
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
delete_CkPdf $pdf3
exit
}
puts "preserve: [CkFileAccess_FileSize $fac qa_output/grand_canyon_objstm_preserve.pdf] bytes"
delete_CkFileAccess $fac
delete_CkJsonObject $json
delete_CkJsonObject $jsonOut
delete_CkPdf $pdf1
delete_CkPdf $pdf2
delete_CkPdf $pdf3