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

Visual FoxPro
LOCAL lnSuccess
LOCAL loFac
LOCAL loJson
LOCAL loJsonOut
LOCAL loPdf1
LOCAL loPdf2
LOCAL loPdf3

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

loFac = CreateObject('Chilkat.FileAccess')
loJson = CreateObject('Chilkat.JsonObject')
loJsonOut = CreateObject('Chilkat.JsonObject')

*  generate: pack the objects (the default).
loPdf1 = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf1.LoadFile("qa_data/pdf/grand_canyon_hiking_guide.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    CANCEL
ENDIF

loJson.UpdateString("objectStreams","generate")
lnSuccess = loPdf1.Optimize("optimize",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    CANCEL
ENDIF

lnSuccess = loPdf1.WriteFile("qa_output/grand_canyon_objstm_generate.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf1.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    CANCEL
ENDIF

? "generate: " + STR(loFac.FileSize("qa_output/grand_canyon_objstm_generate.pdf")) + " bytes, objects packed: " + STR(loJsonOut.IntOf("actions.objectStreams.count"))

*  disable: every object on its own, with a classic cross-reference table.
loPdf2 = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf2.LoadFile("qa_data/pdf/grand_canyon_hiking_guide.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

loJson.UpdateString("objectStreams","disable")
lnSuccess = loPdf2.Optimize("optimize",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

lnSuccess = loPdf2.WriteFile("qa_output/grand_canyon_objstm_disable.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf2.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    RELEASE loPdf2
    CANCEL
ENDIF

? "disable:  " + STR(loFac.FileSize("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.
loPdf3 = CreateObject('Chilkat.Pdf')
lnSuccess = loPdf3.LoadFile("qa_data/pdf/grand_canyon_hiking_guide.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

loJson.UpdateString("objectStreams","preserve")
lnSuccess = loPdf3.Optimize("optimize",loJson,loJsonOut)
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

lnSuccess = loPdf3.WriteFile("qa_output/grand_canyon_objstm_preserve.pdf")
IF (lnSuccess = 0) THEN
    ? loPdf3.LastErrorText
    RELEASE loFac
    RELEASE loJson
    RELEASE loJsonOut
    RELEASE loPdf1
    RELEASE loPdf2
    RELEASE loPdf3
    CANCEL
ENDIF

? "preserve: " + STR(loFac.FileSize("qa_output/grand_canyon_objstm_preserve.pdf")) + " bytes"

RELEASE loFac
RELEASE loJson
RELEASE loJsonOut
RELEASE loPdf1
RELEASE loPdf2
RELEASE loPdf3