Проблема Swift при добавлении аннотаций с регулярным выражением на страницу pdf

#ios #swift #xcode #ios-pdfkit

#iOS #swift #xcode #ios-pdfkit

Вопрос:

Я хочу выполнить поиск регулярного выражения в PDF и добавить к нему аннотации в соответствии с результатами регулярного выражения. Я создал простую функцию, которая делает это. Как сообщило удивительное сообщество (действительно удивительные люди, которые потратили свое время, помогая мне), я могу использовать decomposedStringWithCompatibilityMapping для правильного поиска нужного выражения в PDF, но впоследствии, когда я выполняю выбор pdf, чтобы найти его границы, я сталкиваюсь с различием. Я отправляю вам свой код и несколько картинок.

 func performRegex(regex:String, on pdfPage:PDFPage)  {
    guard let pdfString = pdfPage.string?.precomposedStringWithCanonicalMapping else { return }
    guard let safeRegex = try? NSRegularExpression(pattern: regex, options: .caseInsensitive) else { return }
    let results = safeRegex.matches(in: pdfString, options: .withoutAnchoringBounds, range: NSRange(pdfString.startIndex..., in: pdfString))
    pdfPage.annotations.forEach { pdfPage.removeAnnotation($0)}
    results.forEach { result in
        let bbox = pdfPage.selection(for: result.range)?.bounds(for: pdfPage)
        let annotation = PDFAnnotation(bounds: bbox!, forType: .highlight, withProperties: nil)
        annotation.color = .yellow
        annotation.contents = String(pdfString[Range(result.range, in:pdfString)!])
        pdfPage.addAnnotation(annotation)
    }
}
  

Проблема в том, что когда я делаю это и ввожу это выражение [0-9], все мои результаты сдвигаются:
сдвинутые результаты

Хотя, если я не использую precomposedStringWithCanonicalMapping, все мои результаты не сдвигаются, но я столкнусь с ошибкой, когда получу специальный символ. результаты не сдвинуты

Проблема (я подозреваю) заключается в этой строке кода.

 let bbox = pdfPage.selection(for: result.range)?.bounds(for: pdfPage)
  

Но я не знаю никакой работы для этого.

Пожалуйста, если кто-нибудь может мне помочь!

Большое спасибо

Комментарии:

1. Проблема в том, что вы используете диапазон decomposedStringWithCompatibilityMapping. Вам нужно будет найти способ преобразовать этот диапазон.

2. Есть ли способ заменить исходную строку pdf на строку decomposedStringWithCompatibilityMapping? Я думаю, что это было бы самым простым решением.

3. Я видел, что свойства string и attributed string доступны только

4. Единственная альтернатива, которую я могу представить сейчас, — это использовать исходную строку и исправить искаженные диапазоны.

5. проверьте мой пост ниже

Ответ №1:

Единственная альтернатива, о которой я могу думать прямо сейчас, — это использовать исходную строку и исправить искаженные диапазоны. Попробуйте вот так:

 var str = """
circular para poder realizar sus tareas laborales correspondientes a las actividades de comercialización de alimentos
"""
do {
    let regex = try NSRegularExpression(pattern: ".", options: .caseInsensitive)
    let results = regex.matches(in: str, options: .withoutAnchoringBounds, range: NSRange(location: 0, length: str.utf16.count))
    var badrange: NSRange?
    results.forEach { result in
        guard let range = Range(result.range, in: str) else {
            if badrange != nil {
                badrange!.length  = 1
                if let range = Range(badrange!, in: str) {
                    let newStr = str[range]
                    print(newStr)
                }
            } else {
                badrange = result.range
            }
            return
        }
        let newStr = str[range]
        print(newStr)
        badrange = nil
    }
} catch {
    print(error)
}