SQL Server Requires Chilkat v11.7.0+
SQL Server
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 SQL Server Downloads
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
DECLARE @iTmp1 int
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @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
DECLARE @fac int
EXEC @hr = sp_OACreate 'Chilkat.FileAccess', @fac OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
DECLARE @json int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT
DECLARE @jsonOut int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonOut OUT
-- generate: pack the objects (the default).
DECLARE @pdf1 int
EXEC @hr = sp_OACreate 'Chilkat.Pdf', @pdf1 OUT
EXEC sp_OAMethod @pdf1, 'LoadFile', @success OUT, 'qa_data/pdf/grand_canyon_hiking_guide.pdf'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf1, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
RETURN
END
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'objectStreams', 'generate'
EXEC sp_OAMethod @pdf1, 'Optimize', @success OUT, 'optimize', @json, @jsonOut
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf1, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
RETURN
END
EXEC sp_OAMethod @pdf1, 'WriteFile', @success OUT, 'qa_output/grand_canyon_objstm_generate.pdf'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf1, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
RETURN
END
EXEC sp_OAMethod @fac, 'FileSize', @iTmp0 OUT, 'qa_output/grand_canyon_objstm_generate.pdf'
EXEC sp_OAMethod @jsonOut, 'IntOf', @iTmp1 OUT, 'actions.objectStreams.count'
PRINT 'generate: ' + @iTmp0 + ' bytes, objects packed: ' + @iTmp1
-- disable: every object on its own, with a classic cross-reference table.
DECLARE @pdf2 int
EXEC @hr = sp_OACreate 'Chilkat.Pdf', @pdf2 OUT
EXEC sp_OAMethod @pdf2, 'LoadFile', @success OUT, 'qa_data/pdf/grand_canyon_hiking_guide.pdf'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf2, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
RETURN
END
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'objectStreams', 'disable'
EXEC sp_OAMethod @pdf2, 'Optimize', @success OUT, 'optimize', @json, @jsonOut
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf2, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
RETURN
END
EXEC sp_OAMethod @pdf2, 'WriteFile', @success OUT, 'qa_output/grand_canyon_objstm_disable.pdf'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf2, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
RETURN
END
EXEC sp_OAMethod @fac, 'FileSize', @iTmp0 OUT, 'qa_output/grand_canyon_objstm_disable.pdf'
PRINT 'disable: ' + @iTmp0 + ' bytes'
-- preserve: leave the file's own structure alone. Use it when the output must stay readable by
-- whatever reads the input today.
DECLARE @pdf3 int
EXEC @hr = sp_OACreate 'Chilkat.Pdf', @pdf3 OUT
EXEC sp_OAMethod @pdf3, 'LoadFile', @success OUT, 'qa_data/pdf/grand_canyon_hiking_guide.pdf'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf3, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
EXEC @hr = sp_OADestroy @pdf3
RETURN
END
EXEC sp_OAMethod @json, 'UpdateString', @success OUT, 'objectStreams', 'preserve'
EXEC sp_OAMethod @pdf3, 'Optimize', @success OUT, 'optimize', @json, @jsonOut
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf3, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
EXEC @hr = sp_OADestroy @pdf3
RETURN
END
EXEC sp_OAMethod @pdf3, 'WriteFile', @success OUT, 'qa_output/grand_canyon_objstm_preserve.pdf'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @pdf3, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
EXEC @hr = sp_OADestroy @pdf3
RETURN
END
EXEC sp_OAMethod @fac, 'FileSize', @iTmp0 OUT, 'qa_output/grand_canyon_objstm_preserve.pdf'
PRINT 'preserve: ' + @iTmp0 + ' bytes'
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @jsonOut
EXEC @hr = sp_OADestroy @pdf1
EXEC @hr = sp_OADestroy @pdf2
EXEC @hr = sp_OADestroy @pdf3
END
GO