Как искать PDF с помощью PDFkit в Swift

Моя цель - найти строку и затем перейти к ней. У меня есть эти три строки кода, необходимые для его реализации. Я просто знаю, что в моем мыслительном процессе чего-то не хватает. Я не уверен, как использовать .findstring, Я читал, что он возвращает массив PDFSelections. Но я не уверен, как использовать это, чтобы использовать .setCurrentSelection используя массив PDFSelection.

let found = document.findString(selection, withOptions: .caseInsensitive)
let stringSelection = page?.selection(for: NSRange(location:10, length:5))
pdfView.setCurrentSelection(stringSelection, animate: true)

1 ответ

Создать SearchTableViewController ViewController:

import UIKit
import PDFKit

protocol SearchTableViewControllerDelegate: class {
    func searchTableViewController(_ searchTableViewController: SearchTableViewController, didSelectSerchResult selection: PDFSelection)
}

class SearchTableViewController: UITableViewController {

    open var pdfDocument: PDFDocument?
    weak var delegate: SearchTableViewControllerDelegate?

    var searchBar = UISearchBar()
    var searchResults = [PDFSelection]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.rowHeight = 150

        searchBar.delegate = self
        searchBar.showsCancelButton = true
        searchBar.searchBarStyle = .minimal
        navigationItem.titleView = searchBar

        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel,
                                                           target: self,
                                                           action: #selector(closeBtnClick))

        tableView.register(UINib(nibName: "SearchViewCell", bundle: nil), forCellReuseIdentifier: "SearchViewCell")

    }

    @objc func closeBtnClick(sender: UIBarButtonItem) {
        dismiss(animated: false, completion: nil)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        searchBar.becomeFirstResponder()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source
    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return searchResults.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SearchViewCell", for: indexPath) as! SearchViewCell

        let selection = searchResults[indexPath.row]
        let page = selection.pages[0]
        let outline = pdfDocument?.outlineItem(for: selection)

        let outlintstr = outline?.label ?? ""
        let pagestr = page.label ?? ""
        let txt = outlintstr + " 页码:  " + pagestr
        cell.destinationLabel.text = ""

        let extendSelection = selection.copy() as! PDFSelection
        extendSelection.extend(atStart: 10)
        extendSelection.extend(atEnd: 90)
        extendSelection.extendForLineBoundaries()

        let range = (extendSelection.string! as NSString).range(of: selection.string!, options: .caseInsensitive)
        let attrstr = NSMutableAttributedString(string: extendSelection.string!)
        attrstr.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.yellow, range: range)

        cell.resultTextLabel.attributedText = attrstr

        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let selection = searchResults[indexPath.row]
        delegate?.searchTableViewController(self, didSelectSerchResult: selection)
        dismiss(animated: false, completion: nil)
    }

    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        searchBar.resignFirstResponder()
    }
}

extension SearchTableViewController: UISearchBarDelegate {
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchBar.resignFirstResponder()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        pdfDocument?.cancelFindString()
        dismiss(animated: false, completion: nil)
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
//        if searchText.count < 2 {
//            return
//        }

        searchResults.removeAll()
        tableView.reloadData()
        pdfDocument?.cancelFindString()
        pdfDocument?.delegate = self
        pdfDocument?.beginFindString(searchText, withOptions: .caseInsensitive)
    }
}

extension SearchTableViewController: PDFDocumentDelegate {
    func didMatchString(_ instance: PDFSelection) {
        searchResults.append(instance)
        tableView.reloadData()
    }
}

При нажатии кнопки поиска:

let searchViewController = SearchTableViewController()
        searchViewController.pdfDocument = self.pdfdocument
        searchViewController.delegate = self

        let nav = UINavigationController(rootViewController: searchViewController)
        self.present(nav, animated: false, completion:nil)

Вы получите выделенный текст в:

func searchTableViewController(_ searchTableViewController: SearchTableViewController, didSelectSerchResult selection: PDFSelection) {
        selection.color = UIColor.yellow
        self.pdfview.currentSelection = selection
        self.pdfview.go(to: selection)
        calculateStandByMood()
    }

Просто добавьте этот протокол в pdfViewController:

SearchTableViewControllerDelegate

Я думаю, вы можете перейти к текущему выбору, используя

pdfView.go(to selection: pdView.currentSelection)

Согласно этому документу, по PDF можно перемещаться с помощью выбора, назначения и прямоугольника https://developer.apple.com/documentation/pdfkit/pdfview/1505172-go.

Другие вопросы по тегам