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.
knitr::include_graphics("/images/posts/conteudo/tabulizer/pag153.webp")
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!