Swift 使用正则表达式向 pdf 页面添加注释时出现问题
Swift problem when adding annotations with regex to pdf page
我想在 pdf 中搜索正则表达式,并根据正则表达式的结果为其添加注释。我已经构建了一个简单的函数来执行此操作。正如令人惊叹的社区(非常了不起的人,他们花时间帮助我)发布的那样,我可以使用 decomposedStringWithCompatibilityMapping 在 pdf 中正确搜索所需的表达式,但之后当我执行pdf selection 找到它的边界,我遇到了一个差异。我把我的代码和一些图片发给你。
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([=11=])}
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)
但我不知道有什么工作可以解决。
如果有人能帮帮我,请多多指教!
非常感谢
我现在能想到的唯一选择是使用原始字符串并修复格式错误的范围。像这样尝试:
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)
}
我想在 pdf 中搜索正则表达式,并根据正则表达式的结果为其添加注释。我已经构建了一个简单的函数来执行此操作。正如令人惊叹的社区(非常了不起的人,他们花时间帮助我)发布的那样,我可以使用 decomposedStringWithCompatibilityMapping 在 pdf 中正确搜索所需的表达式,但之后当我执行pdf selection 找到它的边界,我遇到了一个差异。我把我的代码和一些图片发给你。
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([=11=])}
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)
但我不知道有什么工作可以解决。
如果有人能帮帮我,请多多指教!
非常感谢
我现在能想到的唯一选择是使用原始字符串并修复格式错误的范围。像这样尝试:
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)
}