Распознать таблицу PDF с помощью R

Я пытаюсь извлечь данные из таблиц внутри некоторых отчетов в формате PDF.

Я видел несколько примеров с использованием pdftools и подобных пакетов. Мне удалось получить текст, однако я просто хочу извлечь таблицы.

Есть ли способ использовать R для распознавания и извлечения только таблиц?


person RCS    schedule 23.05.2017    source источник
comment
Пакет pdftables: cran.r-project.org/web/packages/pdftables /pdftables.pdf   -  person Marco Sandri    schedule 23.05.2017
comment
табулайзер (ropensci github)   -  person hrbrmstr    schedule 23.05.2017


Ответы (2)


Удивительный вопрос, я недавно задавался тем же вопросом, спасибо!

Я сделал это с помощью tabulizer ‘0.2.2’, как также предлагает @hrbrmstr. Если вы используете R › 3.5.x, я предлагаю следующее решение. Установите три пакета в определенном порядке:

# 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)

## load report
l <- "https://sedl.org/afterschool/toolkits/science/pdf/ast_sci_data_tables_sample.pdf" 
m <- extract_tables(l, encoding="UTF-8")[[2]]  ## comes as a character matrix
## Note: peep into `?extract_tables` for further specs (page, location etc.)!

## use first row as column names
dat <- setnames(type.convert(as.data.frame(m[-1, ]), as.is=TRUE), m[1, ])
## example-specific date conversion
dat$Date <- as.POSIXlt(dat$Date, format="%m/%d/%y")
dat <- within(dat, Date$year <- ifelse(Date$year > 120, Date$year - 100, Date$year))

dat ## voilà
#    Speed (mph)          Driver                        Car    Engine       Date
# 1      407.447 Craig Breedlove          Spirit of America    GE J47 1963-08-05
# 2      413.199       Tom Green           Wingfoot Express    WE J46 1964-10-02
# 3      434.220      Art Arfons              Green Monster    GE J79 1964-10-05
# 4      468.719 Craig Breedlove          Spirit of America    GE J79 1964-10-13
# 5      526.277 Craig Breedlove          Spirit of America    GE J79 1965-10-15
# 6      536.712      Art Arfons              Green Monster    GE J79 1965-10-27
# 7      555.127 Craig Breedlove Spirit of America, Sonic 1    GE J79 1965-11-02
# 8      576.553      Art Arfons              Green Monster    GE J79 1965-11-07
# 9      600.601 Craig Breedlove Spirit of America, Sonic 1    GE J79 1965-11-15
# 10     622.407   Gary Gabelich                 Blue Flame    Rocket 1970-10-23
# 11     633.468   Richard Noble                   Thrust 2 RR RG 146 1983-10-04
# 12     763.035      Andy Green                 Thrust SSC   RR Spey 1997-10-15

Надеюсь, это сработает для вас.

Ограничения. Конечно, таблица в этом примере довольно проста, и, возможно, вам придется возиться с gsub и подобными вещами.

person jay.sf    schedule 24.05.2017
comment
tabulizer может быть смехотворно сложным в установке. У меня никогда не работало это на моем Mac. - person Nettle; 03.09.2018
comment
.@jaySf - Проблема, с которой я столкнулся, заключается в том, что tabulizer() читает все таблицы, но только заголовок таблицы, а не ее содержимое. Любое предложение, как решить эту проблему? - person Chetan Arvind Patil; 17.10.2018
comment
@ChetanArvindPatil Трудно сказать без каких-либо примеров. Я предполагаю, что от программного обеспечения, создавшего PDF-файл, зависит, работает табулятор или нет. - person jay.sf; 18.10.2018
comment
Я нашел это полезным, но все еще не работал полностью... stackoverflow.com/questions/43884603/ дал альтернативные шаги, которые сработали для меня. (Победа 10) - person Marcus D; 31.12.2019

Я бы тоже хотел знать ответ на этот вопрос. Но по моему опыту, вам нужно использовать регулярные выражения, чтобы получить данные в нужном вам формате. В качестве примера вы можете увидеть следующее:

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-файл — это не только таблица.

person Charl Francois Marais    schedule 23.05.2017