Utilizando o R para ler tabelas em PDF

Rstudio Git GitHub rstats

É possível trazer para o R dados/tabelas vindos de um arquivo em PDF? Neste post eu compartilho minha experiência com o pacote tabulizer, que nos ajudará a extrair tabelas em PDF e importá-las como datasets no R.

Carlos Trucíos https://ctruciosm.github.io
07-24-2021

Introdução

Recentemente, alguns alun@s me perguntaram se era possível importar no R dados vindos de um arquivo PDF. Honestamente, nunca tive a necessidade de fazer isso, mas sabia que certamente existia algum pacote para isso no R.

Pesquisando pela internet encontrei algumas opções, entre elas, o pacote tabulizer (Leeper 2018).

Configuração

O processo de extração será feito com o pacote tabulizer, que precisa do pacote rJava, que por sua vez, precisa ter o JDK (Java Developer Kit) instalado.

Para instalar o necessário, siga os seguintes passos:

  1. Instalar o Java Developer Kit (Link para baixar aqui)
  2. Para usuários do Mac, digitar no terminal sudo R CMD javareconf (se você utilizar windos, talvez este post ajude)
  3. Instalar no R os pacotes rJava, tabulizerjars e tabulizer,
install.packages("rJava")
install.packages("tabulizerjars")
install.packages("tabulizer")

Extraindo a tabela do PDF

Após a configuração, carregamos os pacotes rJava, tabulizerjars e tabulizer no R. Se a configuração anterior foi bem sucedida, os pacotes carregarão sem nenhum problema.

Para extrair as tabelas, utilizaremos a função extract_tables(). Por padrão, esta função tem o argumento guess = TRUE o que significa que a função vai adivinhar a localização da tabela no PDF (mas se quisermos ser mais específicos, teremos que mudar alguns dos parâmetros. Para mais detalhes ver help(extract_tables)).

A maneira de exemplo, utilizaremos o seguinte PDF e para importar os dados contidos nas tabelas, utilizaremos os seguintes comandos.

endereco_arquivo <- "https://www.math.arizona.edu/~jwatkins/normal-table.pdf"
tabelas <- extract_tables(file   = endereco_arquivo, output = "data.frame")

Note que o objeto tabelas é uma lista com dois elementos, um por cada tabela.

class(tabelas)
[1] "list"
length(tabelas)
[1] 2

Se quisermos acessar a alguma das tabelas, basta fazer

library(dplyr)
library(purrr)
tabelas %>% pluck(1) %>% as_tibble()  # Primeira tabela
# A tibble: 35 x 11
       z  X0.00  X0.01  X0.02  X0.03  X0.04  X0.05  X0.06  X0.07
   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
 1  -3.4 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003
 2  -3.3 0.0005 0.0005 0.0005 0.0004 0.0004 0.0004 0.0004 0.0004
 3  -3.2 0.0007 0.0007 0.0006 0.0006 0.0006 0.0006 0.0006 0.0005
 4  -3.1 0.001  0.0009 0.0009 0.0009 0.0008 0.0008 0.0008 0.0008
 5  -3   0.0013 0.0013 0.0013 0.0012 0.0012 0.0011 0.0011 0.0011
 6  -2.9 0.0019 0.0018 0.0018 0.0017 0.0016 0.0016 0.0015 0.0015
 7  -2.8 0.0026 0.0025 0.0024 0.0023 0.0023 0.0022 0.0021 0.0021
 8  -2.7 0.0035 0.0034 0.0033 0.0032 0.0031 0.003  0.0029 0.0028
 9  -2.6 0.0047 0.0045 0.0044 0.0043 0.0041 0.004  0.0039 0.0038
10  -2.5 0.0062 0.006  0.0059 0.0057 0.0055 0.0054 0.0052 0.0051
# … with 25 more rows, and 2 more variables: X0.08 <dbl>, X0.09 <dbl>
tabelas %>% pluck(2) %>% as_tibble()  # Segunda tabela
# A tibble: 35 x 11
       z X0.00 X0.01 X0.02 X0.03 X0.04 X0.05 X0.06 X0.07 X0.08 X0.09
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1   0   0.5   0.504 0.508 0.512 0.516 0.520 0.524 0.528 0.532 0.536
 2   0.1 0.540 0.544 0.548 0.552 0.556 0.560 0.564 0.568 0.571 0.575
 3   0.2 0.579 0.583 0.587 0.591 0.595 0.599 0.603 0.606 0.610 0.614
 4   0.3 0.618 0.622 0.626 0.629 0.633 0.637 0.641 0.644 0.648 0.652
 5   0.4 0.655 0.659 0.663 0.666 0.67  0.674 0.677 0.681 0.684 0.688
 6   0.5 0.692 0.695 0.698 0.702 0.705 0.709 0.712 0.716 0.719 0.722
 7   0.6 0.726 0.729 0.732 0.736 0.739 0.742 0.745 0.749 0.752 0.755
 8   0.7 0.758 0.761 0.764 0.767 0.770 0.773 0.776 0.779 0.782 0.785
 9   0.8 0.788 0.791 0.794 0.797 0.800 0.802 0.805 0.808 0.811 0.813
10   0.9 0.816 0.819 0.821 0.824 0.826 0.829 0.832 0.834 0.836 0.839
# … with 25 more rows

ou equivalentemente (sem utilizar o tidyway)

tabelas[[1]]   # Primeira tabela
      z  X0.00  X0.01  X0.02  X0.03  X0.04  X0.05  X0.06  X0.07
1  -3.4 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003
2  -3.3 0.0005 0.0005 0.0005 0.0004 0.0004 0.0004 0.0004 0.0004
3  -3.2 0.0007 0.0007 0.0006 0.0006 0.0006 0.0006 0.0006 0.0005
4  -3.1 0.0010 0.0009 0.0009 0.0009 0.0008 0.0008 0.0008 0.0008
5  -3.0 0.0013 0.0013 0.0013 0.0012 0.0012 0.0011 0.0011 0.0011
6  -2.9 0.0019 0.0018 0.0018 0.0017 0.0016 0.0016 0.0015 0.0015
7  -2.8 0.0026 0.0025 0.0024 0.0023 0.0023 0.0022 0.0021 0.0021
8  -2.7 0.0035 0.0034 0.0033 0.0032 0.0031 0.0030 0.0029 0.0028
9  -2.6 0.0047 0.0045 0.0044 0.0043 0.0041 0.0040 0.0039 0.0038
10 -2.5 0.0062 0.0060 0.0059 0.0057 0.0055 0.0054 0.0052 0.0051
11 -2.4 0.0082 0.0080 0.0078 0.0075 0.0073 0.0071 0.0069 0.0068
12 -2.3 0.0107 0.0104 0.0102 0.0099 0.0096 0.0094 0.0091 0.0089
13 -2.2 0.0139 0.0136 0.0132 0.0129 0.0125 0.0122 0.0119 0.0116
14 -2.1 0.0179 0.0174 0.0170 0.0166 0.0162 0.0158 0.0154 0.0150
15 -2.0 0.0228 0.0222 0.0217 0.0212 0.0207 0.0202 0.0197 0.0192
16 -1.9 0.0287 0.0281 0.0274 0.0268 0.0262 0.0256 0.0250 0.0244
17 -1.8 0.0359 0.0351 0.0344 0.0336 0.0329 0.0322 0.0314 0.0307
18 -1.7 0.0446 0.0436 0.0427 0.0418 0.0409 0.0401 0.0392 0.0384
19 -1.6 0.0548 0.0537 0.0526 0.0516 0.0505 0.0495 0.0485 0.0475
20 -1.5 0.0668 0.0655 0.0643 0.0630 0.0618 0.0606 0.0594 0.0582
21 -1.4 0.0808 0.0793 0.0778 0.0764 0.0749 0.0735 0.0721 0.0708
22 -1.3 0.0968 0.0951 0.0934 0.0918 0.0901 0.0885 0.0869 0.0853
23 -1.2 0.1151 0.1131 0.1112 0.1093 0.1075 0.1056 0.1038 0.1020
24 -1.1 0.1357 0.1335 0.1314 0.1292 0.1271 0.1251 0.1230 0.1210
25 -1.0 0.1587 0.1562 0.1539 0.1515 0.1492 0.1469 0.1446 0.1423
26 -0.9 0.1841 0.1814 0.1788 0.1762 0.1736 0.1711 0.1685 0.1660
27 -0.8 0.2119 0.2090 0.2061 0.2033 0.2005 0.1977 0.1949 0.1922
28 -0.7 0.2420 0.2389 0.2358 0.2327 0.2296 0.2266 0.2236 0.2206
29 -0.6 0.2743 0.2709 0.2676 0.2643 0.2611 0.2578 0.2546 0.2514
30 -0.5 0.3085 0.3050 0.3015 0.2981 0.2946 0.2912 0.2877 0.2843
31 -0.4 0.3446 0.3409 0.3372 0.3336 0.3300 0.3264 0.3228 0.3192
32 -0.3 0.3821 0.3783 0.3745 0.3707 0.3669 0.3632 0.3594 0.3557
33 -0.2 0.4207 0.4168 0.4129 0.4090 0.4052 0.4013 0.3974 0.3936
34 -0.1 0.4602 0.4562 0.4522 0.4483 0.4443 0.4404 0.4364 0.4325
35  0.0 0.5000 0.4960 0.4920 0.4880 0.4840 0.4801 0.4761 0.4721
    X0.08  X0.09
1  0.0003 0.0002
2  0.0004 0.0003
3  0.0005 0.0005
4  0.0007 0.0007
5  0.0010 0.0010
6  0.0014 0.0014
7  0.0020 0.0019
8  0.0027 0.0026
9  0.0037 0.0036
10 0.0049 0.0048
11 0.0066 0.0064
12 0.0087 0.0084
13 0.0113 0.0110
14 0.0146 0.0143
15 0.0188 0.0183
16 0.0239 0.0233
17 0.0301 0.0294
18 0.0375 0.0367
19 0.0465 0.0455
20 0.0571 0.0559
21 0.0694 0.0681
22 0.0838 0.0823
23 0.1003 0.0985
24 0.1190 0.1170
25 0.1401 0.1379
26 0.1635 0.1611
27 0.1894 0.1867
28 0.2177 0.2148
29 0.2483 0.2451
30 0.2810 0.2776
31 0.3156 0.3121
32 0.3520 0.3483
33 0.3897 0.3859
34 0.4286 0.4247
35 0.4681 0.4641
tabelas[[1]]   # Segunda tabela
      z  X0.00  X0.01  X0.02  X0.03  X0.04  X0.05  X0.06  X0.07
1  -3.4 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003 0.0003
2  -3.3 0.0005 0.0005 0.0005 0.0004 0.0004 0.0004 0.0004 0.0004
3  -3.2 0.0007 0.0007 0.0006 0.0006 0.0006 0.0006 0.0006 0.0005
4  -3.1 0.0010 0.0009 0.0009 0.0009 0.0008 0.0008 0.0008 0.0008
5  -3.0 0.0013 0.0013 0.0013 0.0012 0.0012 0.0011 0.0011 0.0011
6  -2.9 0.0019 0.0018 0.0018 0.0017 0.0016 0.0016 0.0015 0.0015
7  -2.8 0.0026 0.0025 0.0024 0.0023 0.0023 0.0022 0.0021 0.0021
8  -2.7 0.0035 0.0034 0.0033 0.0032 0.0031 0.0030 0.0029 0.0028
9  -2.6 0.0047 0.0045 0.0044 0.0043 0.0041 0.0040 0.0039 0.0038
10 -2.5 0.0062 0.0060 0.0059 0.0057 0.0055 0.0054 0.0052 0.0051
11 -2.4 0.0082 0.0080 0.0078 0.0075 0.0073 0.0071 0.0069 0.0068
12 -2.3 0.0107 0.0104 0.0102 0.0099 0.0096 0.0094 0.0091 0.0089
13 -2.2 0.0139 0.0136 0.0132 0.0129 0.0125 0.0122 0.0119 0.0116
14 -2.1 0.0179 0.0174 0.0170 0.0166 0.0162 0.0158 0.0154 0.0150
15 -2.0 0.0228 0.0222 0.0217 0.0212 0.0207 0.0202 0.0197 0.0192
16 -1.9 0.0287 0.0281 0.0274 0.0268 0.0262 0.0256 0.0250 0.0244
17 -1.8 0.0359 0.0351 0.0344 0.0336 0.0329 0.0322 0.0314 0.0307
18 -1.7 0.0446 0.0436 0.0427 0.0418 0.0409 0.0401 0.0392 0.0384
19 -1.6 0.0548 0.0537 0.0526 0.0516 0.0505 0.0495 0.0485 0.0475
20 -1.5 0.0668 0.0655 0.0643 0.0630 0.0618 0.0606 0.0594 0.0582
21 -1.4 0.0808 0.0793 0.0778 0.0764 0.0749 0.0735 0.0721 0.0708
22 -1.3 0.0968 0.0951 0.0934 0.0918 0.0901 0.0885 0.0869 0.0853
23 -1.2 0.1151 0.1131 0.1112 0.1093 0.1075 0.1056 0.1038 0.1020
24 -1.1 0.1357 0.1335 0.1314 0.1292 0.1271 0.1251 0.1230 0.1210
25 -1.0 0.1587 0.1562 0.1539 0.1515 0.1492 0.1469 0.1446 0.1423
26 -0.9 0.1841 0.1814 0.1788 0.1762 0.1736 0.1711 0.1685 0.1660
27 -0.8 0.2119 0.2090 0.2061 0.2033 0.2005 0.1977 0.1949 0.1922
28 -0.7 0.2420 0.2389 0.2358 0.2327 0.2296 0.2266 0.2236 0.2206
29 -0.6 0.2743 0.2709 0.2676 0.2643 0.2611 0.2578 0.2546 0.2514
30 -0.5 0.3085 0.3050 0.3015 0.2981 0.2946 0.2912 0.2877 0.2843
31 -0.4 0.3446 0.3409 0.3372 0.3336 0.3300 0.3264 0.3228 0.3192
32 -0.3 0.3821 0.3783 0.3745 0.3707 0.3669 0.3632 0.3594 0.3557
33 -0.2 0.4207 0.4168 0.4129 0.4090 0.4052 0.4013 0.3974 0.3936
34 -0.1 0.4602 0.4562 0.4522 0.4483 0.4443 0.4404 0.4364 0.4325
35  0.0 0.5000 0.4960 0.4920 0.4880 0.4840 0.4801 0.4761 0.4721
    X0.08  X0.09
1  0.0003 0.0002
2  0.0004 0.0003
3  0.0005 0.0005
4  0.0007 0.0007
5  0.0010 0.0010
6  0.0014 0.0014
7  0.0020 0.0019
8  0.0027 0.0026
9  0.0037 0.0036
10 0.0049 0.0048
11 0.0066 0.0064
12 0.0087 0.0084
13 0.0113 0.0110
14 0.0146 0.0143
15 0.0188 0.0183
16 0.0239 0.0233
17 0.0301 0.0294
18 0.0375 0.0367
19 0.0465 0.0455
20 0.0571 0.0559
21 0.0694 0.0681
22 0.0838 0.0823
23 0.1003 0.0985
24 0.1190 0.1170
25 0.1401 0.1379
26 0.1635 0.1611
27 0.1894 0.1867
28 0.2177 0.2148
29 0.2483 0.2451
30 0.2810 0.2776
31 0.3156 0.3121
32 0.3520 0.3483
33 0.3897 0.3859
34 0.4286 0.4247
35 0.4681 0.4641

e pronto!, nossos dados do PDF estão agora no R!.

Comentários finais

Sys.setenv(JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.12.jdk/Contents/Home')

em que /Library/Java/JavaVirtualMachines/jdk-11.0.12.jdk é o endereço onde a versão 11.0.12 foi instalada.

Nota: Ainda não testei a função com outras tabelas, então não sei que tão bem funciona com tabelas mais complexas.

Happy Coding!

Leeper, Thomas J. 2018. Tabulizer: Bindings for Tabula PDF Table Extractor Library.

References

Citation

For attribution, please cite this work as

Trucíos (2021, July 24). Carlos Trucíos: Utilizando o R para ler tabelas em PDF. Retrieved from https://ctruciosm.github.io/posts/2021-07-24-utilizando-o-r-para-ler-tabelas-em-pdf/

BibTeX citation

@misc{trucíos2021utilizando,
  author = {Trucíos, Carlos},
  title = {Carlos Trucíos: Utilizando o R para ler tabelas em PDF},
  url = {https://ctruciosm.github.io/posts/2021-07-24-utilizando-o-r-para-ler-tabelas-em-pdf/},
  year = {2021}
}