[Work Automation] 用R抽取PDF扫描件中的日期



  • 前一阵子遇到一个难题,需要用找到所有理赔文件中的理赔日期。一个个手动找太麻烦了,所以在考虑能否用R来找到办法。

    这个工作有几个难点:

    1. 扫描件需要用OCR识别文字(这里的文字是汉字和英文参杂的)
      OCR这里用了tesseract这个包。
    2. 需要用通用表达式找到识别结果中的日期
      找到日期用了stringr这个包。
    #定义包含所有pdf的路径为path
    path = "your path"
    
    library(tesseract)
    library(anytime)
    library(stringr)
    
    lookfordatePDF = function(path){
      # 只抽取PDF的第一页
      orig <- pdftools::pdf_text(path_pdf)[1]
      
      # 把PDF文件变成png图片
      img_file <- pdftools::pdf_convert(path, format = 'tiff', pages = 1, dpi = 400)
      
      # 从png图片中抽取文字
      text <- ocr(img_file)
      unlink(img_file)
      # 从文字中抽取符合“四个数字/两个数字/两个数字”这个Pattern的字符, 这里的通用表达式应该理解为\\\d是数字d是digital的意思,\\\d{4}就是4个数字。
      return (str_extract_all(text, "\\\d{4}/\\\d{2}/\\\d{2}+"))
    }
    
    patStr = function(a){
      return(paste0(path,a))
    }
    # 把Path下的所有pdf的路径名转成一个DataFrame
    result = data.frame(fileName = unlist(lapply(list.files(path), patStr)))
    # 找到日期
    result\$date = lapply(result\$fileName, lookfordatePDF)
    # 由于result\$date的数据格式是List,不能直接转成csv文件,需要做如下处理,变成Character,再输出成csv
    convertListString = function(li){
      return(unlist(sapply(li, paste, collapse = " ")))
    }
    result\$final = lapply(result\$date,convertListString)
    df = result[c('fileName','final')]
    df <- apply(df,2,as.character)
    write.csv(df,"data.csv")
    

登录后回复