Sou recém-formado em matemática pura e cursou apenas alguns cursos básicos de programação. Estou fazendo um estágio e tenho um projeto interno de análise de dados. Eu tenho que analisar os PDFs internos dos últimos anos. Os PDFs são "protegidos". Em outras palavras, eles são criptografados. Não temos senhas em PDF, mais ainda, não temos certeza se existem senhas. Mas, temos todos esses documentos e podemos lê-los manualmente. Também podemos imprimi-los. O objetivo é lê-los com Python, porque é a linguagem que temos alguma idéia.
Primeiro, tentei ler os PDFs com algumas bibliotecas Python. No entanto, as bibliotecas Python que encontrei não leem PDFs criptografados. Naquele momento, também não era possível exportar as informações usando o Adobe Reader.
Segundo, decidi decifrar os PDFs. Eu tive sucesso usando a biblioteca Python pykepdf. Pykepdf funciona muito bem! No entanto, os PDFs descriptografados também não podem ser lidos com as bibliotecas Python do ponto anterior ( PyPDF2 e Tabula ). No momento, fizemos algumas melhorias porque, usando o Adobe Reader I, posso exportar as informações dos PDFs descriptografados, mas o objetivo é fazer tudo com o Python.
O código que estou mostrando funciona perfeitamente com PDFs não criptografados, mas não com PDFs criptografados. Ele não está funcionando com os PDFs descriptografados que foram obtidos com o pykepdf também.
Eu não escrevi o código. Encontrei-o na documentação das bibliotecas Python Pykepdf e Tabula . A solução PyPDF2 foi escrita por Al Sweigart em seu livro " Automatize o material chato com o Python ", que eu recomendo. Também verifiquei se o código está funcionando bem, com as limitações que expliquei antes.
Primeira pergunta, por que não consigo ler os arquivos descriptografados, se os programas funcionam com arquivos que nunca foram criptografados?
Segunda pergunta: Podemos ler com Python os arquivos descriptografados de alguma forma? Qual biblioteca pode fazer isso ou é impossível? Todos os PDFs descriptografados são extraíveis?
Obrigado pelo seu tempo e ajuda!!!
Encontrei esses resultados usando Python 3.7, Windows 10, Jupiter Notebooks e Anaconda 2019.07.
Python
import pikepdf
with pikepdf.open("encrypted.pdf") as pdf:
num_pages = len(pdf.pages)
del pdf.pages[-1]
pdf.save("decrypted.pdf")
import tabula
tabula.read_pdf("decrypted.pdf", stream=True)
import PyPDF2
pdfFileObj=open("decrypted.pdf", "rb")
pdfReader=PyPDF2.PdfFileReader(pdfFileObj)
pdfReader.numPages
pageObj=pdfReader.getPage(0)
pageObj.extractText()
Com o Tabula, estou recebendo a mensagem "o arquivo de saída está vazio".
Com PyPDF2, estou recebendo apenas '/ n'
ATUALIZAÇÃO 10/03/2019 Pdfminer.six (versão novembro de 2018)
Eu obtive melhores resultados usando a solução postada pelo DuckPuncher . Para o arquivo descriptografado, obtive os rótulos, mas não os dados. O mesmo acontece com o arquivo criptografado. Para o arquivo que nunca foi criptografado funciona perfeitamente. Como preciso dos dados e dos rótulos dos arquivos criptografados ou descriptografados, esse código não funciona para mim. Para essa análise, usei o pdfminer.six, que é a biblioteca Python, lançada em novembro de 2018. O pdfminer.six inclui um pycryptodome da biblioteca. De acordo com a documentação " PyCryptodome é um pacote Python independente de primitivas criptográficas de baixo nível .."
O código está na pergunta de troca de pilhas: Extraindo texto de um arquivo PDF usando o PDFMiner em python?
Eu adoraria se você quiser repetir meu experimento. Aqui está a descrição:
1) Execute os códigos mencionados nesta pergunta com qualquer PDF que nunca tenha sido criptografado.
2) Faça o mesmo com um PDF "Seguro" (este é o termo usado pela Adobe), estou chamando de PDF criptografado. Use um formulário genérico que você pode encontrar usando o Google. Depois de fazer o download, você precisa preencher os campos. Caso contrário, você estaria verificando rótulos, mas não campos. Os dados estão nos campos.
3) Descriptografe o PDF criptografado usando Pykepdf. Este será o PDF descriptografado.
4) Execute os códigos novamente usando o PDF descriptografado.
ATUALIZAÇÃO 10/4/2019 Camelot (versão julho de 2019)
Eu encontrei a biblioteca Python Camelot. Cuidado para precisar do camelot-py 0.7.3.
É muito poderoso e funciona com o Python 3.7. Além disso, é muito fácil de usar. Primeiro, você também precisa instalar o Ghostscript . Caso contrário, não funcionará. Você também precisa instalar o Pandas . Não use pip install camelot-py . Em vez disso, use pip install camelot-py [cv]
O autor do programa é Vinayak Mehta. Frank Du compartilha esse código em um vídeo do YouTube "Extrair dados tabulares do PDF com o Camelot Using Python".
Eu verifiquei o código e ele está funcionando com arquivos não criptografados. No entanto, ele não funciona com arquivos criptografados e descriptografados, e esse é o meu objetivo .
Camelot é orientado a obter tabelas de PDFs.
Aqui está o código:
Python
import camelot
import pandas
name_table = camelot.read_pdf("uncrypted.pdf")
type(name_table)
#This is a Pandas dataframe
name_table[0]
first_table = name_table[0]
#Translate camelot table object to a pandas dataframe
first_table.df
first_table.to_excel("unencrypted.xlsx")
#This creates an excel file.
#Same can be done with csv, json, html, or sqlite.
#To get all the tables of the pdf you need to use this code.
for table in name_table:
print(table.df)
ATUALIZAÇÃO 10/7/2019 Encontrei um truque. Se eu abrir o PDF protegido com o Adobe Reader e imprimi-lo usando o Microsoft para PDF, e salvá-lo como PDF, posso extrair os dados usando essa cópia. Também posso converter o arquivo PDF em JSON, Excel, SQLite, CSV, HTML e outros formatos. Esta é uma solução possível para minha pergunta. No entanto, ainda estou procurando uma opção para fazer isso sem esse truque, porque o objetivo é fazê-lo 100% com Python. Também estou preocupado que, se um método melhor de criptografia for usado, o truque talvez não funcione. Às vezes, você precisa usar o Adobe Reader várias vezes para obter uma cópia extraível.
ATUALIZAÇÃO 10/08/2019. Terceira pergunta. Agora tenho uma terceira pergunta. Todos os PDFs protegidos / criptografados são protegidos por senha? Por que pikepdf não está funcionando? Meu palpite é que a versão atual do pikepdf pode quebrar algum tipo de criptografia, mas não todas. O @constt mencionou que o PyPDF2 pode quebrar algum tipo de proteção. No entanto, respondi que encontrei um artigo em que o PyPDF2 pode quebrar as criptografias feitas com o Adobe Acrobat Pro 6.0, mas não nas versões posteriores.
qpdf
para descriptografar seus arquivos? Caso funcione, você pode chamá-lo do seu script usando o subprocess
módulo para descriptografar arquivos antes de analisá-los.
PyPDF2
, tudo funciona muito bem. Eu useipdftk
, assim como serviços online, para criptografar arquivos. Você pode postar links para arquivos pdf "problemáticos"?