使用正则表达式向 pdf 页面添加注释时出现 Swift 问题

Posted

技术标签:

【中文标题】使用正则表达式向 pdf 页面添加注释时出现 Swift 问题【英文标题】:Swift problem when adding annotations with regex to pdf page 【发布时间】:2020-09-11 21:09:50 【问题描述】:

我想在 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)

但我不知道有什么工作要做。

如果有人可以帮助我,请给我一些帮助!

非常感谢

【问题讨论】:

问题是您使用的是 decomposedStringWithCompatibilityMapping 范围。您需要找到一种方法来转换该范围。 有没有办法将pdf原始字符串替换为decomposedStringWithCompatibilityMapping字符串?我认为这将是最简单的解决方案。 我看到字符串和属性字符串属性都是get only 我现在能想到的唯一选择是使用原始字符串并修复格式错误的范围。 在下面查看我的帖子 【参考方案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)

【讨论】:

以上是关于使用正则表达式向 pdf 页面添加注释时出现 Swift 问题的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 2008 - 导出为 pdf 时出现多个报告页面差异

在 JavaScript 正则表达式中使用 1+ 所有格量词时出现正则表达式错误

PatternSyntaxException:在 Java 中使用正则表达式时出现非法重复

如何在正则表达式值或值内添加注释? [复制]

使用纯 C/C++ 向 PDF 添加注释 [关闭]

加载 excel 文件且未显示缺失值并尝试使用正则表达式清除手机号码中的值时出现问题