Some test text!

menu
search

PDF redaction in Kotlin

Sample Kotlin code for using PDFTron SDK to remove potentially sensitive content within PDF documents. Using 'pdftron.PDF.Redactor' makes sure that if a portion of an image, text, or vector graphics is contained in a redaction region, that portion is destroyed and is not simply hidden with clipping or image masks.

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.pdf.PDFDoc
import com.pdftron.pdf.Rect
import com.pdftron.pdf.Redactor
import com.pdftron.sdf.SDFDoc
import java.util.*

/**
 * PDF Redactor is a separately licensable Add-on that offers options to remove
 * (not just covering or obscuring) content within a region of PDF.
 * With printed pages, redaction involves blacking-out or cutting-out areas of
 * the printed page. With electronic documents that use formats such as PDF,
 * redaction typically involves removing sensitive content within documents for
 * safe distribution to courts, patent and government institutions, the media,
 * customers, vendors or any other audience with restricted access to the content.
 *
 *
 * The redaction process in PDFNet consists of two steps:
 *
 *
 * a) Content identification: A user applies redact annotations that specify the
 * pieces or regions of content that should be removed. The content for redaction
 * can be identified either interactively (e.g. using 'com.pdftron.pdf.PDFViewCtrl'
 * as shown in PDFView sample) or programmatically (e.g. using 'com.pdftron.pdf.TextSearch'
 * or 'com.pdftron.pdf.TextExtractor'). Up until the next step is performed, the user
 * can see, move and redefine these annotations.
 * b) Content removal: Using 'com.pdftron.pdf.Redactor.Redact()' the user instructs
 * PDFNet to apply the redact regions, after which the content in the area specified
 * by the redact annotations is removed. The redaction function includes number of
 * options to control the style of the redaction overlay (including color, text,
 * font, border, transparency, etc.).
 *
 *
 * PDFTron Redactor makes sure that if a portion of an image, text, or vector graphics
 * is contained in a redaction region, that portion of the image or path data is
 * destroyed and is not simply hidden with clipping or image masks. PDFNet API can also
 * be used to review and remove metadata and other content that can exist in a PDF
 * document, including XML Forms Architecture (XFA) content and Extensible Metadata
 * Platform (XMP) content.
 */

class PDFRedactTest : PDFNetSample() {
    init {
        setTitle(R.string.sample_pdfredact_title)
        setDescription(R.string.sample_pdfredact_description)

        // The standard library does not include the Redaction feature.
        // If using the full library, please comment out the following
        // call.
        // DisableRun();
    }

    override fun run(outputListener: OutputListener?) {
        super.run(outputListener)
        mOutputListener = outputListener
        mFileList.clear()
        printHeader(outputListener!!)
        // Relative paths to folders containing test files.

        try {
            val vec = arrayOfNulls<Redactor.Redaction>(7)
            vec[0] = Redactor.Redaction(1, Rect(100.0, 100.0, 550.0, 600.0), false, "Top Secret")
            vec[1] = Redactor.Redaction(2, Rect(30.0, 30.0, 450.0, 450.0), true, "Negative Redaction")
            vec[2] = Redactor.Redaction(2, Rect(0.0, 0.0, 100.0, 100.0), false, "Positive")
            vec[3] = Redactor.Redaction(2, Rect(100.0, 100.0, 200.0, 200.0), false, "Positive")
            vec[4] = Redactor.Redaction(2, Rect(300.0, 300.0, 400.0, 400.0), false, "")
            vec[5] = Redactor.Redaction(2, Rect(500.0, 500.0, 600.0, 600.0), false, "")
            vec[6] = Redactor.Redaction(3, Rect(0.0, 0.0, 700.0, 20.0), false, "")

            val app = Redactor.Appearance()
            app.redactionOverlay = true
            app.border = false
            app.showRedactedContentRegions = true

            redact(Utils.getAssetTempFile(PDFNetSample.INPUT_PATH + "newsletter.pdf")!!.absolutePath, Utils.createExternalFile("redacted.pdf", mFileList).absolutePath, vec, app)

            mOutputListener!!.println("Done...")
        } 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>()

        fun redact(input: String, output: String, vec: Array<Redactor.Redaction?>, app: Redactor.Appearance) {
            try {
                val doc = PDFDoc(input)
                if (doc.initSecurityHandler()) {
                    Redactor.redact(doc, vec, app, false, true)
                    doc.save(output, SDFDoc.SaveMode.REMOVE_UNUSED, null)
                    doc.close()
                }
            } catch (e: Exception) {
                mOutputListener!!.printError(e.stackTrace)
            }

        }
    }

}
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