[Work Automation] 用R抽取PDF扫描件中的日期
-
前一阵子遇到一个难题,需要用找到所有理赔文件中的理赔日期。一个个手动找太麻烦了,所以在考虑能否用R来找到办法。
这个工作有几个难点:
- 扫描件需要用OCR识别文字(这里的文字是汉字和英文参杂的)
OCR这里用了tesseract这个包。 - 需要用通用表达式找到识别结果中的日期
找到日期用了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")
- 扫描件需要用OCR识别文字(这里的文字是汉字和英文参杂的)