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

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

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 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