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