{tabulizer}: Tabela do PDF para data.frame em segundos

Por Athos em 08/01/2021

Resumo

tabulizer::extract_tables("caminho/do/arquivo.pdf", pages = 153)

Isso é tudo!! Eu resolvi escrever esse post porque fiquei contente por ter tido grande facilidade em conseguir trazer uma tabela do PDF para o R depois do CTLR+C/CTRL+V falhar miseravelmente.

Um potencial obstáculo pode ser o famigerado {rJava} do qual o {tabulizer} depende. Mas, no linux, eu rodei sudo apt install default-jdk default-jre e funcionou pra mim! No windows não testei, mas tem esse tutorial aqui.

Tarefa

Extrair uma tabela de uma página de um arquivo pdf. No url_pdf está o endereço de um PDF da internet.

url_pdf <- "https://curso-r.github.io/main-regressao-linear/referencias/Ci%C3%AAncia%20de%20Dados.%20Fundamentos%20e%20Aplica%C3%A7%C3%B5es.%20Vers%C3%A3o%20parcial%20preliminar.%20maio%20Pedro%20A.%20Morettin%20Julio%20M.%20Singer.pdf"

Olhada na página de PDF

# tira print da pagina 153 e salva como imagem PNG.
pdftools::pdf_convert(url_pdf, pages = 153, filenames = "pag153.png")
## Converting page 153 to pag153.png... done!
## [1] "pag153.png"

# mostra a imagem PNG.
magick::image_read("pag153.png")

Extração da tabela PDF -> R

# extrai a tabela do PDF (e não do PNG!)
tabela_extrida_do_pdf <- tabulizer::extract_tables(url_pdf, pages = 153)
tabela_extrida_do_pdf[[1]]
##       [,1]    [,2]     [,3]        [,4]    [,5]     [,6]       
##  [1,] ""      "Idade"  "Distância" ""      "Idade"  "Distância"
##  [2,] "Ident" "(anos)" "(m)"       "Ident" "(anos)" "(m)"      
##  [3,] "1"     "18"     "170"       "16"    "55"     "140"      
##  [4,] "2"     "20"     "197"       "17"    "63"     "117"      
##  [5,] "3"     "22"     "187"       "18"    "65"     "140"      
##  [6,] "4"     "23"     "170"       "19"    "66"     "100"      
##  [7,] "5"     "23"     "153"       "20"    "67"     "137"      
##  [8,] "6"     "25"     "163"       "21"    "68"     "100"      
##  [9,] "7"     "27"     "187"       "22"    "70"     "130"      
## [10,] "8"     "28"     "170"       "23"    "71"     "107"      
## [11,] "9"     "29"     "153"       "24"    "72"     "123"      
## [12,] "10"    "32"     "137"       "25"    "73"     "93"       
## [13,] "11"    "37"     "140"       "26"    "74"     "140"      
## [14,] "12"    "41"     "153"       "27"    "75"     "153"      
## [15,] "13"    "46"     "150"       "28"    "77"     "120"      
## [16,] "14"    "49"     "127"       "29"    "79"     "103"      
## [17,] "15"    "53"     "153"       "30"    "82"     "120"

CQD! ⬛

Bônus: Faxina na tabela

Uma vez dentro do R, agora é jogo. Bora faxinar que é o que a gente sabe fazer de melhor. O desafio é empilhar de 3 em 3 colunas, Ident, (anos), (m). Temos dois indivíduos por linha, precisamos empilhá-los para no fim termos uma linha para cada indivíduo como manda o manual. O herói aqui é o pivot_longer().

library(tidyverse)
library(janitor)

tabela_extrida_do_pdf[[1]] %>%
  as_tibble(.name_repair = "unique") %>%
  row_to_names(2) %>%
  clean_names() %>%
  pivot_longer(everything(), names_to = c(".value", "conjunto"), names_sep = "_") %>%
  select(-conjunto) %>%
  head() %>%
  kableExtra::kable()
ident anos m
1 18 170
16 55 140
2 20 197
17 63 117
3 22 187
18 65 140

Leituras relacionadas

Sugiro a leitura do post PDF e OCR do Julio Trecenti para funcionalidades mais avançadas do {pdftools}, do {tesseract} e do {tabulizer}.

Comentário aleatório

Aproveitem para conhecer o livro Ciência de dados: Fundamentos e Prática de 2020 dos Professores Julio Singer e Renato Morettin.

Valeu!

comments powered by Disqus

Nossa Newsletter

Uma vez por semana enviamos um e-mail para você não perder nenhum post da Curso-R. Avisamos também sempre que abrimos uma nova turma.