Some test text!

Search
Hamburger Icon

Python cos/SDF low-level API to edit PDF files

More languages

More languages
JavaScript
Java (Android)
C++
C#
C# (.NET Core)
Go
Java
Kotlin
Obj-C
JS (Node.js)
PHP
Python
Ruby
Swift
C# (UWP)
VB
C# (Xamarin)

Sample Python code for editing an existing PDF document at the object level by using the PDFTron SDK Cos/SDF low-level API. Learn more about our Python PDF Library and PDF Editing & Manipulation Library.

Get Started Samples Download

To run this sample, get started with a free trial of Apryse SDK.

#---------------------------------------------------------------------------------------
# Copyright (c) 2001-2023 by Apryse Software Inc. All Rights Reserved.
# Consult LICENSE.txt regarding license information.
#---------------------------------------------------------------------------------------

import site
site.addsitedir("../../../PDFNetC/Lib")
import sys
from PDFNetPython import *

sys.path.append("../../LicenseKey/PYTHON")
from LicenseKey import *


# This sample illustrates how to use basic SDF API (also known as Cos) to edit an 
# existing document.

def main():
    PDFNet.Initialize(LicenseKey)
    
    # Relative path to the folder containing the test files.
    input_path = "../../TestFiles/"
    output_path = "../../TestFiles/Output/"
    
    print("Opening the test file...")
    
    # Here we create a SDF/Cos document directly from PDF file. In case you have 
    # PDFDoc you can always access SDF/Cos document using PDFDoc.GetSDFDoc() method.
    doc = SDFDoc(input_path + "fish.pdf")
    doc.InitSecurityHandler()
    
    print("Modifying info dictionary, adding custom properties, embedding a stream...")
    trailer = doc.GetTrailer()  # Get the trailer
    
    # Now we will change PDF document information properties using SDF API
    
    # Get the Info dictionary
    itr = trailer.Find("Info")
    info = Obj()
    if itr.HasNext():
        info = itr.Value()
        # Modify 'Producer' entry
        info.PutString("Producer", "PDFTron PDFNet")
        
        # Read title entry (if it is present)
        itr = info.Find("Author")
        if itr.HasNext():
            oldstr = itr.Value().GetAsPDFTest()
            info.PutText("Author", oldstr + "- Modified")
        else:
            info.PutString("Author", "Me, myself, and I")
    else:
        # Info dict is missing.
        info = trailer.PutDict("Info")
        info.PutString("Producer", "PDFTron PDFNet")
        info.PutString("Title", "My document")
        
    # Create a custom inline dictionary within Info dictionary
    custom_dict = info.PutDict("My Direct Dict")
    custom_dict.PutNumber("My Number", 100)     # Add some key/value pairs
    custom_dict.PutArray("My Array")
    
    # Create a custom indirect array within Info dictionary
    custom_array = doc.CreateIndirectArray()
    info.Put("My Indirect Array", custom_array)    # Add some entries
    
    # Create indirect link to root
    custom_array.PushBack(trailer.Get("Root").Value())
    
    # Embed a custom stream (file mystream.txt).
    embed_file = MappedFile(input_path + "my_stream.txt")
    mystm = FilterReader(embed_file)
    custom_array.PushBack( doc.CreateIndirectStream(mystm) )
    
    # Save the changes.
    print("Saving modified test file...")
    doc.Save(output_path + "sdftest_out.pdf", 0, "%PDF-1.4")
    doc.Close()
    
    PDFNet.Terminate()
    print("Test Completed")
    
if __name__ == '__main__':
    main()