使用R从双列PDF中提取文本

15

我有很多采用双列格式的PDF文件。我在使用R语言中的pdftools包。有没有一种方法可以按照双列格式读取每个PDF,而无需对每个PDF进行裁剪?

每个PDF都包含可选文本,并且pdf_text函数可以轻松读取文本,唯一的问题是它会先读取第一列的第一行,然后继续到下一列,而不是向下移动第一列。

非常感谢您提前的帮助。


1
我不知道有一个函数可以读取两列的PDF文件。我认为你必须编写自己的程序,读取每一行,分离每一行的每一列,使用rbind()将每一行按列绑定在一起,然后使用rbind()将每一列绑定在一起,最后使用rbind()将每一页绑定在一起,以便得到一个完整的数据集,按照书写顺序进行读取。 - Ryan Morton
这很有道理,唯一的问题是R会沿着列直接读取,并在相邻单词之间只放置一个空格。无法区分该空格与普通空格。 - tsouchlarakis
请参考以下网页,了解另一种类似的方法:http://blog.agileactors.com/blog/2017/9/5/how-to-extract-and-clean-data-from-pdf-files-in-r - Rich Pauloo
2个回答

13

使用 tabulizer::extract_text(file) 函数可以更轻松地完成此操作。

该函数适用于单列中包含的PDF文本以及2列或更多列中包含的PDF文本。是的,就是这么简单!


1
非常好用,这是一个很棒的 R 包,感谢您的回答! - tsouchlarakis
总是很高兴看到有人决定以最简单的方式处理挑战,只设计必要的软件包! - Anders Jørgensen
3
2021年12月:tabulizer已不再在CRAN上提供。 - G5W
https://github.com/ropensci/tabulizer - Paul

11

我曾经遇到同样的问题。我的解决方法是获取每个PDF页面最频繁的空格值,并将其存储在一个向量中。然后使用该值对页面进行切片。

library(pdftools)
src <- ""
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

QTD_COLUMNS <- 2
read_text <- function(text) {
  result <- ''
  #Get all index of " " from page.
  lstops <- gregexpr(pattern =" ",text)
  #Puts the index of the most frequents ' ' in a vector.
  stops <- as.integer(names(sort(table(unlist(lstops)),decreasing=TRUE)[1:2]))
  #Slice based in the specified number of colums (this can be improved)
  for(i in seq(1, QTD_COLUMNS, by=1))
  {
    temp_result <- sapply(text, function(x){
      start <- 1
      stop <-stops[i] 
      if(i > 1)            
        start <- stops[i-1] + 1
      if(i == QTD_COLUMNS)#last column, read until end.
        stop <- nchar(x)+1
      substr(x, start=start, stop=stop)
    }, USE.NAMES=FALSE)
    temp_result <- trim(temp_result)
    result <- append(result, temp_result)
  }
  result
}

txt <- pdf_text(src)
result <- ''
for (i in 1:length(txt)) { 
  page <- txt[i]
  t1 <- unlist(strsplit(page, "\n"))      
  maxSize <- max(nchar(t1))
  t1 <- paste0(t1,strrep(" ", maxSize-nchar(t1)))
  result = append(result,read_text(t1))
}
result

感谢您的评论。我在“stops <- as.integer(names(sort(table(unlist(lstops)),decreasing=TRUE)[1:2])))”这一行中遇到了一个错误。错误报告显示“lstops”未找到,它在此之前未被定义过。 - tsouchlarakis
抱歉,昨晚我发布时已经很晚了。我已经测试并修复了它。请再试一次。 - Felipe Santiago
太好了!我在互联网上找不到类似的东西。我希望这能帮助人们向前迈进。有一个小改动,需要将for循环中的i <- 2这一行删除。否则,它只会打印第二页,重复length(txt)次。 - tsouchlarakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接