使用R识别PDF表

问题描述 投票:17回答:2

我正在尝试从一些pdf报告中的表中提取数据。

我已经看到一些使用pdftools和类似软件包的例子我成功获取了文本,但是,我只是想提取表格。

有没有办法使用R来识别和提取表格?

r text-mining pdf-scraping
2个回答
14
投票

很棒的问题,我最近想知道同样的事情,谢谢!

我做了它,使用tabulizer ‘0.2.2’,@ hrbrmstr也表示。如果您使用的是R版3.5.2,我将提供以下解决方案。按特定顺序安装三个包:

# install.packages("rJava")
# library(rJava) # load and attach 'rJava' now
# install.packages("devtools")
# devtools::install_github("ropensci/tabulizer", args="--no-multiarch")

更新:再次测试该方法后,现在看起来就足以让install.packages(tabulizer)了。 rJava将作为依赖项自动安装。

现在,您已准备好从PDF报告中提取表格。

library(tabulizer)

# specify an example and load it into your workspace
report <- "http://www.stat.ufl.edu/~athienit/Tables/Ztable.pdf" 
lst <- extract_tables(report, encoding="UTF-8") 
# peep into the doc for further specs (page, location etc.)!

# after examing the list you want to do some tidying
# 1st delete blank columns
lst[[1]] <- lst[[1]][, -3]
lst[[2]] <- lst[[2]][, -4]

# 2nd bind the list elements, if you want and create a df...
table <- do.call(rbind, lst)
table <- as.data.frame(table[c(2:37, 40:nrow(table)), ],
                       stringsAsFactors=FALSE) # ...w/o obsolete rows

# 3rd take over colnames, cache rownames to vector
colnames(table) <- table[1, ]
rn <- table[2:71, 1]
table <- table[-1,-1] # and bounce them out of the table

# 4th I'm sure you want coerce to numeric 
table <- as.data.frame(apply(table[1:70,1:10], 2, 
                             function(x) as.numeric(as.character(x))))
rownames(table) <- rn # bring back rownames 

table # voilà

希望对你有效。

局限性:当然这个例子中的表格非常简单,也许你不得不乱用gsubstringr tidyr和这种东西。


5
投票

我也想知道答案。但根据我的经验,您需要使用正则表达式以您想要的格式获取数据。您可以看到以下示例:

library(pdftools)
dat <- pdftools::pdf_text("https://s3-eu-central-1.amazonaws.com/de-hrzg-khl/kh-ffe/public/artikel-pdfs/Free_PDF/BF_LISTE_20016.pdf")
dat <- paste0(dat, collapse = " ")
pattern <- "Berufsfeuerwehr\\s+Straße(.)*02366.39258"
extract <- regmatches(dat, regexpr(pattern, dat))
extract <- gsub('\n', "  ", extract)
strsplit(extract, "\\s{2,}")

然后,可以从此处循环数据以根据需要创建表。但正如您在链接中看到的那样,PDF不仅仅是一个表格。

© www.soinside.com 2019 - 2024. All rights reserved.