Some test text!

Search
Hamburger Icon

Add or edit PDF annotations in Kotlin

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 Kotlin code to use PDFTron SDK for adding or editing PDF annotations. The annotation types included in this sample are: hyperlink, intra-document link, stamp, rubber stamp, file attachment, sound, text, free-text, line, circle, square, polygon, polyline, highlight, squiggly, caret, and ink. Learn more about our Kotlin PDF Library and PDF Annotation Library.

Get Started Samples Download

To run this sample, get started with a free trial of Apryse 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.common.PDFNetException
import com.pdftron.pdf.Action
import com.pdftron.pdf.Annot
import com.pdftron.pdf.Annot.BorderStyle
import com.pdftron.pdf.ColorPt
import com.pdftron.pdf.Destination
import com.pdftron.pdf.Element
import com.pdftron.pdf.ElementBuilder
import com.pdftron.pdf.ElementWriter
import com.pdftron.pdf.FileSpec
import com.pdftron.pdf.Font
import com.pdftron.pdf.PDFDoc
import com.pdftron.pdf.Page
import com.pdftron.pdf.PageIterator
import com.pdftron.pdf.Point
import com.pdftron.pdf.QuadPoint
import com.pdftron.pdf.Rect
import com.pdftron.pdf.annots.Caret
import com.pdftron.pdf.annots.Circle
import com.pdftron.pdf.annots.FreeText
import com.pdftron.pdf.annots.Highlight
import com.pdftron.pdf.annots.Ink
import com.pdftron.pdf.annots.Line
import com.pdftron.pdf.annots.Link
import com.pdftron.pdf.annots.PolyLine
import com.pdftron.pdf.annots.Polygon
import com.pdftron.pdf.annots.RubberStamp
import com.pdftron.pdf.annots.Sound
import com.pdftron.pdf.annots.Square
import com.pdftron.pdf.annots.Squiggly
import com.pdftron.pdf.annots.Text
import com.pdftron.sdf.Obj
import com.pdftron.sdf.SDFDoc

import java.text.DecimalFormat
import java.util.ArrayList

class AnnotationTest : PDFNetSample() {
    init {
        setTitle(R.string.sample_annotation_title)
        setDescription(R.string.sample_annotation_description)
    }

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

        try {
            val doc = PDFDoc(Utils.getAssetTempFile(PDFNetSample.INPUT_PATH + "numbered.pdf")!!.absolutePath)
            doc.initSecurityHandler()

            // An example of using SDF/Cos API to add any type of annotations.
            AnnotationLowLevelAPI(doc)
            doc.save(Utils.createExternalFile("annotation_test1.pdf", mFileList).absolutePath, SDFDoc.SaveMode.LINEARIZED, null)
            mOutputListener!!.println("Done. Results saved in annotation_test1.pdf")

            // An example of using the high-level PDFNet API to read existing annotations,
            // to edit existing annotations, and to create new annotation from scratch.
            AnnotationHighLevelAPI(doc)
            doc.save(Utils.createExternalFile("annotation_test2.pdf", mFileList).absolutePath, SDFDoc.SaveMode.LINEARIZED, null)
            mOutputListener!!.println("Done. Results saved in annotation_test2.pdf")

            // an example of creating various annotations in a brand new document
            val doc1 = PDFDoc()
            CreateTestAnnots(doc1)
            doc1.save(Utils.createExternalFile("new_annot_test_api.pdf", mFileList).absolutePath, SDFDoc.SaveMode.LINEARIZED, null)
            mOutputListener!!.println("Saved new_annot_test_api.pdf")
        } 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>()

        val format = DecimalFormat("0.#")

        @Throws(PDFNetException::class)
        internal fun AnnotationHighLevelAPI(doc: PDFDoc) {
            // The following code snippet traverses all annotations in the document
            mOutputListener!!.println("Traversing all annotations in the document...")

            var page_num = 1
            val itr = doc.pageIterator
            while (itr.hasNext()) {
                mOutputListener!!.println("Page " + page_num++ + ": ")

                val page = itr.next()
                val num_annots = page!!.getNumAnnots()
                loop@ for (i in 0 until num_annots) {
                    val annot = page.getAnnot(i)
                    if (annot.isValid == false) continue
                    mOutputListener!!.println("Annot Type: " + annot.sdfObj.get("Subtype").value().name)

                    val bbox = annot.rect.get()
                    mOutputListener!!.println("  Position: " + format.format(bbox[0])
                            + ", " + format.format(bbox[1])
                            + ", " + format.format(bbox[2])
                            + ", " + format.format(bbox[3]))

                    when (annot.type) {
                        Annot.e_Link -> {
                            val link = com.pdftron.pdf.annots.Link(annot)
                            val action = link.action
                            if (action.isValid == false) continue@loop
                            if (action.type == Action.e_GoTo) {
                                val dest = action.dest
                                if (dest.isValid == false) {
                                    mOutputListener!!.println("  Destination is not valid.")
                                } else {
                                    val page_link = dest.page.index
                                    mOutputListener!!.println("  Links to: page number $page_link in this document")
                                }
                            } else if (action.type == Action.e_URI) {
                                val uri = action.sdfObj.get("URI").value().asPDFText
                                mOutputListener!!.println("  Links to: $uri")
                            }
                            // ...
                        }
                        Annot.e_Widget -> {
                        }
                        Annot.e_FileAttachment -> {
                        }
                        // ...
                        else -> {
                        }
                    }
                }
            }

            // Use the high-level API to create new annotations.
            val first_page = doc.getPage(1)

            // Create a hyperlink...
            val hyperlink = com.pdftron.pdf.annots.Link.create(doc, Rect(85.0, 570.0, 503.0, 524.0), Action.createURI(doc, "http://www.pdftron.com"))
            first_page.annotPushBack(hyperlink)

            // Create an intra-document link...
            val goto_page_3 = Action.createGoto(Destination.createFitH(doc.getPage(3), 0.0))
            val link = com.pdftron.pdf.annots.Link.create(doc.sdfDoc,
                    Rect(85.0, 458.0, 503.0, 502.0),
                    goto_page_3)
            link.setColor(ColorPt(1.0, 0.0, 0.0), 3)

            // Add the new annotation to the first page
            first_page.annotPushBack(link)

            // Create a stamp annotation ...
            val stamp = com.pdftron.pdf.annots.RubberStamp.create(doc, Rect(30.0, 30.0, 300.0, 200.0))
            stamp.setIcon("Draft")
            first_page.annotPushBack(stamp)

            // Create a file attachment annotation (embed the 'peppers.jpg').
            val file_attach = com.pdftron.pdf.annots.FileAttachment.create(doc, Rect(80.0, 280.0, 108.0, 320.0), Utils.getAssetTempFile(PDFNetSample.INPUT_PATH + "peppers.jpg")!!.absolutePath)
            first_page.annotPushBack(file_attach)

            val ink = com.pdftron.pdf.annots.Ink.create(doc, Rect(110.0, 10.0, 300.0, 200.0))
            val pt3 = Point(110.0, 10.0)
            //pt3.x = 110; pt3.y = 10;
            ink.setPoint(0, 0, pt3)
            pt3.x = 150.0
            pt3.y = 50.0
            ink.setPoint(0, 1, pt3)
            pt3.x = 190.0
            pt3.y = 60.0
            ink.setPoint(0, 2, pt3)
            pt3.x = 180.0
            pt3.y = 90.0
            ink.setPoint(1, 0, pt3)
            pt3.x = 190.0
            pt3.y = 95.0
            ink.setPoint(1, 1, pt3)
            pt3.x = 200.0
            pt3.y = 100.0
            ink.setPoint(1, 2, pt3)
            pt3.x = 166.0
            pt3.y = 86.0
            ink.setPoint(2, 0, pt3)
            pt3.x = 196.0
            pt3.y = 96.0
            ink.setPoint(2, 1, pt3)
            pt3.x = 221.0
            pt3.y = 121.0
            ink.setPoint(2, 2, pt3)
            pt3.x = 288.0
            pt3.y = 188.0
            ink.setPoint(2, 3, pt3)
            ink.setColor(ColorPt(0.0, 1.0, 1.0), 3)
            first_page.annotPushBack(ink)

        }

        @Throws(PDFNetException::class)
        internal fun AnnotationLowLevelAPI(doc: PDFDoc) {
            val page = doc.pageIterator.next()

            var annots: Obj? = page!!.getAnnots()

            if (annots == null) {
                // If there are no annotations, create a new annotation
                // array for the page.
                annots = doc.createIndirectArray()
                page.getSDFObj().put("Annots", annots!!)
            }

            // Create a Text annotation
            val annot = doc.createIndirectDict()
            annot.putName("Subtype", "Text")
            annot.putBool("Open", true)
            annot.putString("Contents", "The quick brown fox ate the lazy mouse.")
            annot.putRect("Rect", 266.0, 116.0, 430.0, 204.0)

            // Insert the annotation in the page annotation array
            annots.pushBack(annot)

            // Create a Link annotation
            val link1 = doc.createIndirectDict()
            link1.putName("Subtype", "Link")
            val dest = Destination.createFit(doc.getPage(2))
            link1.put("Dest", dest.sdfObj)
            link1.putRect("Rect", 85.0, 705.0, 503.0, 661.0)
            annots.pushBack(link1)

            // Create another Link annotation
            val link2 = doc.createIndirectDict()
            link2.putName("Subtype", "Link")
            val dest2 = Destination.createFit(doc.getPage(3))
            link2.put("Dest", dest2.sdfObj)
            link2.putRect("Rect", 85.0, 638.0, 503.0, 594.0)
            annots.pushBack(link2)

            // Note that PDFNet APi can be used to modify existing annotations.
            // In the following example we will modify the second link annotation
            // (link2) so that it points to the 10th page. We also use a different
            // destination page fit type.

            // link2 = annots.GetAt(annots.Size()-1);
            link2.put("Dest",
                    Destination.createXYZ(doc.getPage(10), 100.0, (792 - 70).toDouble(), 10.0).sdfObj)

            // Create a third link annotation with a hyperlink action (all other
            // annotation types can be created in a similar way)
            val link3 = doc.createIndirectDict()
            link3.putName("Subtype", "Link")
            link3.putRect("Rect", 85.0, 570.0, 503.0, 524.0)

            // Create a URI action
            val action = link3.putDict("A")
            action.putName("S", "URI")
            action.putString("URI", "http://www.pdftron.com")

            annots.pushBack(link3)
        }

        @Throws(PDFNetException::class)
        internal fun CreateTestAnnots(doc: PDFDoc) {
            val ew = ElementWriter()
            val eb = ElementBuilder()
            var element: Element

            val first_page = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            doc.pagePushBack(first_page)
            ew.begin(first_page, ElementWriter.e_overlay, false)    // begin writing to this page
            ew.end()  // save changes to the current page

            //
            // Test of a free text annotation.
            //
            run {
                val txtannot = FreeText.create(doc, Rect(10.0, 400.0, 160.0, 570.0))
                txtannot.contents = "\n\nSome swift brown fox snatched a gray hare out of the air by freezing it with an angry glare." + "\n\nAha!\n\nAnd there was much rejoicing!"
                txtannot.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_solid, 1, 10, 20)
                txtannot.quaddingFormat = 0
                first_page.annotPushBack(txtannot)
                txtannot.refreshAppearance()
            }
            run {
                val txtannot = FreeText.create(doc, Rect(100.0, 100.0, 350.0, 500.0))
                txtannot.contentRect = Rect(200.0, 200.0, 350.0, 500.0)
                txtannot.contents = "\n\nSome swift brown fox snatched a gray hare out of the air by freezing it with an angry glare." + "\n\nAha!\n\nAnd there was much rejoicing!"
                txtannot.setCalloutLinePoints(Point(200.0, 300.0), Point(150.0, 290.0), Point(110.0, 110.0))
                txtannot.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_solid, 1, 10, 20)
                txtannot.endingStyle = Line.e_ClosedArrow
                txtannot.setColor(ColorPt(0.0, 1.0, 0.0))
                txtannot.quaddingFormat = 1
                first_page.annotPushBack(txtannot)
                txtannot.refreshAppearance()
            }
            run {
                val txtannot = FreeText.create(doc, Rect(400.0, 10.0, 550.0, 400.0))
                txtannot.contents = "\n\nSome swift brown fox snatched a gray hare out of the air by freezing it with an angry glare." + "\n\nAha!\n\nAnd there was much rejoicing!"
                txtannot.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_solid, 1, 10, 20)
                txtannot.setColor(ColorPt(0.0, 0.0, 1.0))
                txtannot.opacity = 0.2
                txtannot.quaddingFormat = 2
                first_page.annotPushBack(txtannot)
                txtannot.refreshAppearance()
            }

            val page = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            doc.pagePushBack(page)
            ew.begin(page, ElementWriter.e_overlay, false)    // begin writing to this page
            eb.reset()            // Reset the GState to default
            ew.end()  // save changes to the current page

            run {
                //Create a Line annotation...
                val line = Line.create(doc, Rect(250.0, 250.0, 400.0, 400.0))
                line.startPoint = Point(350.0, 270.0)
                line.endPoint = Point(260.0, 370.0)
                line.startStyle = Line.e_Square
                line.endStyle = Line.e_Circle
                line.setColor(ColorPt(.3, .5, 0.0), 3)
                line.contents = "Dashed Captioned"
                line.showCaption = true
                line.captionPosition = Line.e_Top
                val dash = doubleArrayOf(2.0, 2.0)
                line.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_dashed, 2, 0, 0, dash)
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(347.0, 377.0, 600.0, 600.0))
                line.startPoint = Point(385.0, 410.0)
                line.endPoint = Point(540.0, 555.0)
                line.startStyle = Line.e_Circle
                line.endStyle = Line.e_OpenArrow
                line.setColor(ColorPt(1.0, 0.0, 0.0), 3)
                line.setInteriorColor(ColorPt(0.0, 1.0, 0.0), 3)
                line.contents = "Inline Caption"
                line.showCaption = true
                line.captionPosition = Line.e_Inline
                line.leaderLineExtensionLength = -4.0
                line.leaderLineLength = -12.0
                line.leaderLineOffset = 2.0
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(10.0, 400.0, 200.0, 600.0))
                line.startPoint = Point(25.0, 426.0)
                line.endPoint = Point(180.0, 555.0)
                line.startStyle = Line.e_Circle
                line.endStyle = Line.e_Square
                line.setColor(ColorPt(0.0, 0.0, 1.0), 3)
                line.setInteriorColor(ColorPt(1.0, 0.0, 0.0), 3)
                line.contents = "Offset Caption"
                line.showCaption = true
                line.captionPosition = Line.e_Top
                line.textHOffset = -60.0
                line.textVOffset = 10.0
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(200.0, 10.0, 400.0, 70.0))
                line.startPoint = Point(220.0, 25.0)
                line.endPoint = Point(370.0, 60.0)
                line.startStyle = Line.e_Butt
                line.endStyle = Line.e_OpenArrow
                line.setColor(ColorPt(0.0, 0.0, 1.0), 3)
                line.contents = "Regular Caption"
                line.showCaption = true
                line.captionPosition = Line.e_Top
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(200.0, 70.0, 400.0, 130.0))
                line.startPoint = Point(220.0, 111.0)
                line.endPoint = Point(370.0, 78.0)
                line.startStyle = Line.e_Circle
                line.endStyle = Line.e_Diamond
                line.contents = "Circle to Diamond"
                line.setColor(ColorPt(0.0, 0.0, 1.0), 3)
                line.setInteriorColor(ColorPt(0.0, 1.0, 0.0), 3)
                line.showCaption = true
                line.captionPosition = Line.e_Top
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(10.0, 100.0, 160.0, 200.0))
                line.startPoint = Point(15.0, 110.0)
                line.endPoint = Point(150.0, 190.0)
                line.startStyle = Line.e_Slash
                line.endStyle = Line.e_ClosedArrow
                line.contents = "Slash to CArrow"
                line.setColor(ColorPt(1.0, 0.0, 0.0), 3)
                line.setInteriorColor(ColorPt(0.0, 1.0, 1.0), 3)
                line.showCaption = true
                line.captionPosition = Line.e_Top
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(270.0, 270.0, 570.0, 433.0))
                line.startPoint = Point(300.0, 400.0)
                line.endPoint = Point(550.0, 300.0)
                line.startStyle = Line.e_RClosedArrow
                line.endStyle = Line.e_ROpenArrow
                line.contents = "ROpen & RClosed arrows"
                line.setColor(ColorPt(0.0, 0.0, 1.0), 3)
                line.setInteriorColor(ColorPt(0.0, 1.0, 0.0), 3)
                line.showCaption = true
                line.captionPosition = Line.e_Top
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(195.0, 395.0, 205.0, 505.0))
                line.startPoint = Point(200.0, 400.0)
                line.endPoint = Point(200.0, 500.0)
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(55.0, 299.0, 150.0, 301.0))
                line.startPoint = Point(55.0, 300.0)
                line.endPoint = Point(155.0, 300.0)
                line.startStyle = Line.e_Circle
                line.endStyle = Line.e_Circle
                line.contents = "Caption that's longer than its line."
                line.setColor(ColorPt(1.0, 0.0, 1.0), 3)
                line.setInteriorColor(ColorPt(0.0, 1.0, 0.0), 3)
                line.showCaption = true
                line.captionPosition = Line.e_Top
                line.refreshAppearance()
                page.annotPushBack(line)
            }
            run {
                val line = Line.create(doc, Rect(300.0, 200.0, 390.0, 234.0))
                line.startPoint = Point(310.0, 210.0)
                line.endPoint = Point(380.0, 220.0)
                line.setColor(ColorPt(0.0, 0.0, 0.0), 3)
                line.refreshAppearance()
                page.annotPushBack(line)
            }

            val page3 = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            ew.begin(page3)    // begin writing to the page
            ew.end()  // save changes to the current page
            doc.pagePushBack(page3)
            run {
                val circle = Circle.create(doc, Rect(300.0, 300.0, 390.0, 350.0))
                circle.setColor(ColorPt(0.0, 0.0, 0.0), 3)
                circle.refreshAppearance()
                page3.annotPushBack(circle)
            }
            run {
                val circle = Circle.create(doc, Rect(100.0, 100.0, 200.0, 200.0))
                circle.setColor(ColorPt(0.0, 1.0, 0.0), 3)
                circle.setInteriorColor(ColorPt(0.0, 0.0, 1.0), 3)
                val dash = doubleArrayOf(2.0, 4.0)
                circle.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_dashed, 3, 0, 0, dash)
                circle.setPadding(2.0)
                circle.refreshAppearance()
                page3.annotPushBack(circle)
            }
            run {
                val sq = Square.create(doc, Rect(10.0, 200.0, 80.0, 300.0))
                sq.setColor(ColorPt(0.0, 0.0, 0.0), 3)
                sq.refreshAppearance()
                page3.annotPushBack(sq)
            }
            run {
                val sq = Square.create(doc, Rect(500.0, 200.0, 580.0, 300.0))
                sq.setColor(ColorPt(1.0, 0.0, 0.0), 3)
                sq.setInteriorColor(ColorPt(0.0, 1.0, 1.0), 3)
                val dash = doubleArrayOf(4.0, 2.0)
                sq.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_dashed, 6, 0, 0, dash)
                sq.setPadding(4.0)
                sq.refreshAppearance()
                page3.annotPushBack(sq)
            }
            run {
                val poly = Polygon.create(doc, Rect(5.0, 500.0, 125.0, 590.0))
                poly.setColor(ColorPt(1.0, 0.0, 0.0), 3)
                poly.setInteriorColor(ColorPt(1.0, 1.0, 0.0), 3)
                poly.setVertex(0, Point(12.0, 510.0))
                poly.setVertex(1, Point(100.0, 510.0))
                poly.setVertex(2, Point(100.0, 555.0))
                poly.setVertex(3, Point(35.0, 544.0))
                poly.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_solid, 4, 0, 0)
                poly.setPadding(4.0)
                poly.refreshAppearance()
                page3.annotPushBack(poly)
            }
            run {
                val poly = PolyLine.create(doc, Rect(400.0, 10.0, 500.0, 90.0))
                poly.setColor(ColorPt(1.0, 0.0, 0.0), 3)
                poly.setInteriorColor(ColorPt(0.0, 1.0, 0.0), 3)
                poly.setVertex(0, Point(405.0, 20.0))
                poly.setVertex(1, Point(440.0, 40.0))
                poly.setVertex(2, Point(410.0, 60.0))
                poly.setVertex(3, Point(470.0, 80.0))
                poly.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_solid, 2, 0, 0)
                poly.setPadding(4.0)
                poly.startStyle = Line.e_RClosedArrow
                poly.endStyle = Line.e_ClosedArrow
                poly.refreshAppearance()
                page3.annotPushBack(poly)
            }
            run {
                val lk = Link.create(doc, Rect(5.0, 5.0, 55.0, 24.0))
                lk.refreshAppearance()
                page3.annotPushBack(lk)
            }

            val page4 = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            ew.begin(page4)    // begin writing to the page
            ew.end()  // save changes to the current page
            doc.pagePushBack(page4)

            run {
                ew.begin(page4)
                val font = Font.create(doc, Font.e_helvetica)
                element = eb.createTextBegin(font, 16.0)
                element.setPathFill(true)
                ew.writeElement(element)
                element = eb.createTextRun("Some random text on the page", font, 16.0)
                element.setTextMatrix(1.0, 0.0, 0.0, 1.0, 100.0, 500.0)
                ew.writeElement(element)
                ew.writeElement(eb.createTextEnd())
                ew.end()
            }
            run {
                val hl = Highlight.create(doc, Rect(100.0, 490.0, 150.0, 515.0))
                hl.setColor(ColorPt(0.0, 1.0, 0.0), 3)
                hl.refreshAppearance()
                page4.annotPushBack(hl)
            }
            run {
                val sq = Squiggly.create(doc, Rect(100.0, 450.0, 250.0, 600.0))
                sq.setQuadPoint(0, QuadPoint(Point(122.0, 455.0), Point(240.0, 545.0), Point(230.0, 595.0), Point(101.0, 500.0)))
                sq.refreshAppearance()
                page4.annotPushBack(sq)
            }
            run {
                val cr = Caret.create(doc, Rect(100.0, 40.0, 129.0, 69.0))
                cr.setColor(ColorPt(0.0, 0.0, 1.0), 3)
                cr.symbol = "P"
                cr.refreshAppearance()
                page4.annotPushBack(cr)
            }

            val page5 = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            ew.begin(page5)    // begin writing to the page
            ew.end()  // save changes to the current page
            doc.pagePushBack(page5)
            val fs = FileSpec.create(doc, Utils.getAssetTempFile(PDFNetSample.INPUT_PATH + "butterfly.png")!!.absolutePath, false)
            val page6 = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            ew.begin(page6)    // begin writing to the page
            ew.end()  // save changes to the current page
            doc.pagePushBack(page6)

            run {
                val txt = Text.create(doc, Point(10.0, 20.0))
                txt.setIcon("UserIcon")
                txt.contents = "User defined icon, unrecognized by appearance generator"
                txt.setColor(ColorPt(0.0, 1.0, 0.0))
                txt.refreshAppearance()
                page6.annotPushBack(txt)
            }
            run {
                val ink = Ink.create(doc, Rect(100.0, 400.0, 200.0, 550.0))
                ink.setColor(ColorPt(0.0, 0.0, 1.0))
                ink.setPoint(1, 3, Point(220.0, 505.0))
                ink.setPoint(1, 0, Point(100.0, 490.0))
                ink.setPoint(0, 1, Point(120.0, 410.0))
                ink.setPoint(0, 0, Point(100.0, 400.0))
                ink.setPoint(1, 2, Point(180.0, 490.0))
                ink.setPoint(1, 1, Point(140.0, 440.0))
                ink.borderStyle = Annot.BorderStyle(Annot.BorderStyle.e_solid, 3, 0, 0)
                ink.refreshAppearance()
                page6.annotPushBack(ink)
            }

            val page7 = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            ew.begin(page7)    // begin writing to the page
            ew.end()  // save changes to the current page
            doc.pagePushBack(page7)

            run {
                val snd = Sound.create(doc, Rect(100.0, 500.0, 120.0, 520.0))
                snd.setColor(ColorPt(1.0, 1.0, 0.0))
                snd.icon = Sound.e_Speaker
                snd.refreshAppearance()
                page7.annotPushBack(snd)
            }
            run {
                val snd = Sound.create(doc, Rect(200.0, 500.0, 220.0, 520.0))
                snd.setColor(ColorPt(1.0, 1.0, 0.0))
                snd.icon = Sound.e_Mic
                snd.refreshAppearance()
                page7.annotPushBack(snd)
            }

            val page8 = doc.pageCreate(Rect(0.0, 0.0, 600.0, 600.0))
            ew.begin(page8)    // begin writing to the page
            ew.end()  // save changes to the current page
            doc.pagePushBack(page8)

            for (ipage in 0..1) {
                var px = 5.0
                var py = 520.0
                for (istamp in 0..RubberStamp.e_Draft) {
                    val st = RubberStamp.create(doc, Rect(1.0, 1.0, 100.0, 100.0))
                    st.SetIcon(istamp)
                    st.contents = st.iconName
                    st.rect = Rect(px, py, px + 100, py + 25)
                    py -= 100.0
                    if (py < 0) {
                        py = 520.0
                        px += 200.0
                    }
                    if (ipage == 0)
                    else {
                        page8.annotPushBack(st)
                        st.refreshAppearance()
                    }//page7.AnnotPushBack( st );
                }
            }
            val st = RubberStamp.create(doc, Rect(400.0, 5.0, 550.0, 45.0))
            st.setIcon("UserStamp")
            st.contents = "User defined stamp"
            page8.annotPushBack(st)
            st.refreshAppearance()
        }
    }

}