Sample code for 30+ languages & platforms
DataFlex 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 DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Handle hoFac
    Variant vJson
    Handle hoJson
    Variant vJsonOut
    Handle hoJsonOut
    Handle hoPdf1
    Handle hoPdf2
    Handle hoPdf3
    String sTemp1
    Integer iTemp1
    Integer iTemp2

    Move False To iSuccess

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

    Get Create (RefClass(cComCkFileAccess)) To hoFac
    If (Not(IsComObjectCreated(hoFac))) Begin
        Send CreateComObject of hoFac
    End
    Get Create (RefClass(cComChilkatJsonObject)) To hoJson
    If (Not(IsComObjectCreated(hoJson))) Begin
        Send CreateComObject of hoJson
    End
    Get Create (RefClass(cComChilkatJsonObject)) To hoJsonOut
    If (Not(IsComObjectCreated(hoJsonOut))) Begin
        Send CreateComObject of hoJsonOut
    End

    //  generate: pack the objects (the default).
    Get Create (RefClass(cComChilkatPdf)) To hoPdf1
    If (Not(IsComObjectCreated(hoPdf1))) Begin
        Send CreateComObject of hoPdf1
    End
    Get ComLoadFile Of hoPdf1 "qa_data/pdf/grand_canyon_hiking_guide.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComUpdateString Of hoJson "objectStreams" "generate" To iSuccess
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoJsonOut to vJsonOut
    Get ComOptimize Of hoPdf1 "optimize" vJson vJsonOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComWriteFile Of hoPdf1 "qa_output/grand_canyon_objstm_generate.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf1 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComFileSize Of hoFac "qa_output/grand_canyon_objstm_generate.pdf" To iTemp1
    Get ComIntOf Of hoJsonOut "actions.objectStreams.count" To iTemp2
    Showln "generate: " iTemp1 " bytes, objects packed: " iTemp2

    //  disable: every object on its own, with a classic cross-reference table.
    Get Create (RefClass(cComChilkatPdf)) To hoPdf2
    If (Not(IsComObjectCreated(hoPdf2))) Begin
        Send CreateComObject of hoPdf2
    End
    Get ComLoadFile Of hoPdf2 "qa_data/pdf/grand_canyon_hiking_guide.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComUpdateString Of hoJson "objectStreams" "disable" To iSuccess
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoJsonOut to vJsonOut
    Get ComOptimize Of hoPdf2 "optimize" vJson vJsonOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComWriteFile Of hoPdf2 "qa_output/grand_canyon_objstm_disable.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf2 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComFileSize Of hoFac "qa_output/grand_canyon_objstm_disable.pdf" To iTemp1
    Showln "disable:  " iTemp1 " bytes"

    //  preserve: leave the file's own structure alone.  Use it when the output must stay readable by
    //  whatever reads the input today.
    Get Create (RefClass(cComChilkatPdf)) To hoPdf3
    If (Not(IsComObjectCreated(hoPdf3))) Begin
        Send CreateComObject of hoPdf3
    End
    Get ComLoadFile Of hoPdf3 "qa_data/pdf/grand_canyon_hiking_guide.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComUpdateString Of hoJson "objectStreams" "preserve" To iSuccess
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoJsonOut to vJsonOut
    Get ComOptimize Of hoPdf3 "optimize" vJson vJsonOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComWriteFile Of hoPdf3 "qa_output/grand_canyon_objstm_preserve.pdf" To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoPdf3 To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComFileSize Of hoFac "qa_output/grand_canyon_objstm_preserve.pdf" To iTemp1
    Showln "preserve: " iTemp1 " bytes"


End_Procedure