top of page

Pacote: pdftools

O primeiro contato que tive com o pacote pdftools foi no desespero do proletariado que precisa resolver um problema para ontem. A demanda era a seguinte,


Fê, os arquivos de dados estão em PDF, o que você vai fazer para nos entregar tabulado?

E para bom entendedor, um meme basta:



Nesse momento entreguei para as deusas estatísticas e acabei conhecendo pacote tabulizer, mas infelizmente me deparei com a mensagem abaixo do CRAN.

Desanimei?

Sim! Nesse momento bateu aquela desanimada porquê eu não tinha acesso de administrador para fazer instalação via terminal e ia dar um baita trabalho. Na época, falei com a equipe de TI e eles compraram a minha ideia, mas não conseguimos instalar devido a algumas dependências relacionadas a java. Portanto, se você conseguir instalar, seja feliz com esse pacote que parece ser mais tranquilo do que o pdftools, mas atente-se a questão de que ele não está disponível no CRAN devido a não correção de problemas reportados por usuários.


E o que eu fiz?


Procurei outras formas de fazer esse trabalho um tanto desafiador. Foi aí que encontrei a opção de utilizar o pacote pdftools. Não esquece e já vai instalando ele aí.


install.packages("pdftools")

Esse pacote tem como objetivo extração de textos, renderização e conversão de documentos no formato PDF. Ele também oferece suporte à renderização de documentos em formato PNG, JPEG, TIFF ou em vetores bitmap brutos para processamento posterior em R. O pdftools se sobrepõe ligeiramente ao pacote Rpoppler de Kurt Hornik. A principal motivação por trás do desenvolvimento do pdftools foi que o Rpoppler depende do glib, que não funciona bem no Mac e no Windows. O pacote pdftools usa a interface poppler c++ juntamente com o Rcpp, o que resulta em uma implementação mais leve e portável.



Ele é sensacional né?

Para o formato PDF podemos usufruir de sete funções, mas aqui vou abordar somente a função pdf_text, que é a função mais importante do pacote. Essa função renderiza todas as caixas de texto em uma tela de texto e retorna um vetor de caracteres de tamanho igual ao número de páginas do arquivo PDF e, nesse momento, identifiquei que os arquivos que eu havia recebido dispunham somente de uma página e isso facilitaria muito o meu trabalho. Nessa função que é tão importante, há somente dois parâmetros a serem 'setados', o opw e o upw. Elas são senhas de acesso do proprietário ou plataforma e do usuário.


Lembra de quando recebemos um boleto que é em PDF e para abrir precisa de uma senha?

Então, esse seria o caso de usar o parâmetro upw. É uma mão na roda e, dependendo da ocasião, você também vai ter que usar a senha da plataforma para ter acesso aos arquivos. Já temos duas mãos na roda (rs).


Outra facilidade é se você tiver interesse em fazer a leitura somente de uma página específica, você pode utilizar a função pdf_render_page.


files<- pdftools::pdf_render_page("arquivo1.pdf", page = 1)

Outra preocupação que eu tinha era a forma que se faz a leitura de arquivos PDF no R. Até certo ponto da minha carreira trabalhei com dados em diversos formatos, mas não em PDF, afinal dados em PDF não é o ideal. Porém, como boa rzeira' e por costume, no dia a dia eu usava somente o Import Dataset ou conexões com API.



Foi aí que conheci a função list.files do pacote base do R. Essa função produz um vetor de caracteres dos nomes de arquivos ou diretórios no diretório nomeado. Errei muito até conseguir chegar no objetivo da leitura desses arquivos. O código se encontra abaixo.


files <- base::list.files(path = "caminhodasuapastadearquivo",
                          pattern = ".pdf$")

Usei .pdf$ com o intuito da leitura ser feita somente nos arquivos que tivessem como nomeação final .pdf, já que ali na pasta poderíamos ter qualquer tipo de arquivo.


E tive sucesso na leitura?

Sim! Consegui com que todos os aquivos fossem projetados para apenas uma lista e, assim o trabalho começou. A função pdf_text entra exatamente nessa etapa e o código que utilizei se encontra abaixo.


file  <- base::lapply(files, pdf_text) %>% 
         base::unlist() %>% 
         base::as.data.frame()

E a partir desse momento eu tinha como resulta uma coluna do tipo character com o número de linhas igual ao número de arquivos da pasta. Cada linha era referente ao arquivo que estava naquela posição.


A coluna não está nomeada e isso deve ser feito posteriormente. Veja também que o produto da função pdf_text foi uma lista e foi necessário aplicar a função unlist. Neste exemplo utilizei data.frame, mas você pode utilizar tibble ou qualquer outro formato que seja de seu interesse. Essa tarefa te poupa tempo e é muito eficaz.





Bem tranquilo né?

Agora o pacote pdftools fez o seu trabalho com maestria e entra em cena o pacote stringr e seu companheiro e melhor amigo regex. Manipular as strings de muitos arquivos em PDF é uma tarefa fácil se existir um padrão, caso contrário é dor de cabeça, mas não é impossível. Há outras funções do pacote como o pdf_toc que mostra o sumário, ou seja, os cabeçalhos das seções que os leitores de PDF geralmente exibem em um menu à esquerda ou a função pdf_info que fornece informações sobre fontes, anexos e metadados, como autor, data de criação e tags.


E tabelas?

Para nós, estatísticos ou cientistas de dados, na maioria das vezes é de nosso interesse extrair tabelas, mas, infelizmente, o formato .pdf não tem noção de tabela, diferente de por exemplo um HTML e, por isso, essa tarefa não é trivial. O interessante é que a partir do texto simples extraído pelo pdftools a porta de um novo mundo é acessada.


O que a gente não faz com uma string né?

Um exemplo básico é que através da string você pode encontrar artigos discutindo um determinado medicamento ou nome de espécie, sem ter que depender de editores fornecendo metadados ou mecanismos de pesquisa pagos. Nesse caso você encomiza dinheiro e muito do seu tempo. Outra opção é automatizar diversas tarefas como extrair resultado de exames de forma rápida e concisa. Encare a não leitura "perfeita" de uma tabela como um desafio para aprender um pouco mais sobre strings, afinal você não tinha nem essa chance antes de conhecer o pacote pdftools.


Vai me dizer que não é verdade?

Se divirta com esse pacote eautomatize tarefas manuais. Perde tempo não. Infelizmente não se tem muito material ou vídeos em português que abordam o tema, mas o que não falta é gente interessada no tema. E ó, você pode encontrar mais informações do pacote pdftools e seus criadores aqui e através deles encontre mais materiais de aplicação do seu interesse.


Até mais!


Fernanda Kelly R. Silva | Estatística

Posts recentes

Ver tudo

Comments


bottom of page