Imports ComPDFKit.Import
Imports ComPDFKit.PDFAnnotation
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.PDFPage
Imports System.IO
Imports System.Windows

Module TextSearchTest
    Private parentPath As String =
        Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory())))
    Private outputPath As String = Path.Combine(parentPath, "Output", "VB")

    Sub Main(args As String())
        ' Preparation work
        Console.WriteLine("Running text search test sample..." & vbCrLf)

        If Not Directory.Exists(outputPath) Then
            Directory.CreateDirectory(outputPath)
        End If
        SDKLicenseHelper.LicenseVerify()

        ' Sample 1: Search text
        Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("Text.pdf")

        SearchText(document)
        document.Release()
        Console.WriteLine("--------------------")

        Console.WriteLine("Done")
        Console.WriteLine("--------------------")
        Console.ReadLine()
    End Sub

    ' Search for keywords in the current page and record the search results.
    Private Sub SearchForPage(page As CPDFPage, searchKeywords As String, options As C_Search_Options, ByRef rects As List(Of Rect), ByRef strings As List(Of String))
        rects = New List(Of Rect)()
        strings = New List(Of String)()
        Dim findIndex As Integer = 0

        Dim textPage As CPDFTextPage = page.GetTextPage()
        Dim searcher As New CPDFTextSearcher()

        If searcher.FindStart(textPage, searchKeywords, options, 0) Then
            Dim textRect As New CRect()
            Dim textContent As String = ""
            While searcher.FindNext(page, textPage, textRect, textContent, findIndex)
                strings.Add(textContent)
                rects.Add(New Rect(textRect.left, textRect.top, textRect.width(), textRect.height()))
            End While
        End If
    End Sub

    ' Highlight the first result
    Private Function HighlightTheFirstResult(page As CPDFPage, rect As Rect) As Boolean
        Dim cRectList As New List(Of CRect)()
        cRectList.Add(New CRect(CSng(rect.Left), CSng(rect.Bottom), CSng(rect.Right), CSng(rect.Top)))

        Dim annotation As CPDFHighlightAnnotation = CType(page.CreateAnnot(C_ANNOTATION_TYPE.C_ANNOTATION_HIGHLIGHT), CPDFHighlightAnnotation)
        Dim color As Byte() = {0, 255, 0}
        annotation.SetColor(color)
        annotation.SetTransparency(120)
        annotation.SetQuardRects(cRectList)
        annotation.UpdateAp()
        Return True
    End Function

    ' Search PDF keywords on the first page of the article,
    ' after the search is completed,
    ' highlight the first searched keyword and save it
    Private Function SearchText(document As CPDFDocument) As Boolean
        Dim page As CPDFPage = document.PageAtIndex(0)
        'rects: The collection of locales where keywords are located.
        Dim rects As New List(Of Rect)()
        'strings: The full text of the keyword's area
        Dim strings As New List(Of String)()

        'Search for single page
        SearchForPage(page, "PDF", C_Search_Options.Search_Case_Insensitive, rects, strings)

        Console.WriteLine("The pdf have {0} results", rects.Count)

        Console.WriteLine("Search finished, now highlight the first result. ")

        'Highlight the first result
        HighlightTheFirstResult(page, rects(0))

        Dim filePath As String = Path.Combine(outputPath, "HighlightFirstTest.pdf")
        If Not document.WriteToFilePath(filePath) Then
            Return False
        End If
        Console.WriteLine("Browse the changed file in " & filePath)
        Return True
    End Function
End Module