Some test text!

menu
search

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

Sample Kotlin 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 PDF Editing & Manipulation Library.

Get StartedSamplesDownload

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

//---------------------------------------------------------------------------------------
// Copyright (c) 2001-2019 by PDFTron Systems Inc. All Rights Reserved.
// Consult legal.txt regarding legal and license information.
//---------------------------------------------------------------------------------------

package com.pdftron.android.pdfnetsdksamples.samples

import com.pdftron.android.pdfnetsdksamples.OutputListener
import com.pdftron.android.pdfnetsdksamples.PDFNetSample
import com.pdftron.android.pdfnetsdksamples.R
import com.pdftron.android.pdfnetsdksamples.util.Utils
import com.pdftron.filters.FilterReader
import com.pdftron.filters.MappedFile
import com.pdftron.sdf.Obj
import com.pdftron.sdf.SDFDoc
import java.util.*

class SDFTest : PDFNetSample() {
    init {
        setTitle(R.string.sample_sdf_title)
        setDescription(R.string.sample_sdf_description)
    }

    override fun run(outputListener: OutputListener?) {
        super.run(outputListener)
        mOutputListener = outputListener
        mFileList.clear()
        printHeader(outputListener!!)

        try {
            mOutputListener!!.println("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.
            val doc = SDFDoc(Utils.getAssetTempFile(PDFNetSample.INPUT_PATH + "fish.pdf")!!.absolutePath)
            doc.initSecurityHandler()

            mOutputListener!!.println("Modifying info dictionary, adding custom properties, embedding a stream...")
            val trailer = doc.trailer            // Get the trailer

            // Now we will change PDF document information properties using SDF API

            // Get the Info dictionary.
            var itr = trailer.find("Info")
            val 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()) {
                    val oldstr = itr.value().asPDFText

                    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
            val custom_dict = info.putDict("My Direct Dict")
            custom_dict.putNumber("My Number", 100.0)     // Add some key/value pairs
            custom_dict.putArray("My Array")

            // Create a custom indirect array within Info dictionary
            val 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).
            val embed_file = MappedFile(Utils.getAssetTempFile(PDFNetSample.INPUT_PATH + "my_stream.txt")!!.absolutePath)
            val mystm = FilterReader(embed_file)
            custom_array.pushBack(doc.createIndirectStream(mystm))

            // Save the changes.
            mOutputListener!!.println("Saving modified test file...")
            doc.save(Utils.createExternalFile("sdftest_out.pdf", mFileList).absolutePath, SDFDoc.SaveMode.NO_FLAGS, null, "%PDF-1.4")
            doc.close()

            mOutputListener!!.println("Test completed.")
        } catch (e: Exception) {
            mOutputListener!!.printError(e.stackTrace)
        }

        for (file in mFileList) {
            addToFileList(file)
        }
        printFooter(outputListener)
    }

    companion object {

        private var mOutputListener: OutputListener? = null

        private val mFileList = ArrayList<String>()
    }

}
close

Free Trial

Get unlimited trial usage of PDFTron SDK to bring accurate, reliable, and fast document processing capabilities to any application or workflow.

Select a platform to get started with your free trial.

Unlimited usage. No email address required.

PDFTron Receives USD$71 Million Growth Investment Led By Silversmith Capital Partners

Learn More
close