Je suis un récent diplômé en mathématiques pures qui n'a suivi que quelques cours de programmation de base. Je fais un stage et j'ai un projet d'analyse de données interne. Je dois analyser les PDF internes des dernières années. Les PDF sont "sécurisés". En d'autres termes, ils sont cryptés. Nous n'avons pas de mots de passe PDF, encore plus, nous ne savons pas si des mots de passe existent. Mais, nous avons tous ces documents et nous pouvons les lire manuellement. Nous pouvons également les imprimer. Le but est de les lire avec Python car c'est le langage que nous avons une idée.
Tout d'abord, j'ai essayé de lire les fichiers PDF avec certaines bibliothèques Python. Cependant, les bibliothèques Python que j'ai trouvées ne lisent pas les fichiers PDF chiffrés. À ce moment-là, je ne pouvais pas non plus exporter les informations à l'aide d'Adobe Reader.
Deuxièmement, j'ai décidé de décrypter les PDF. J'ai réussi à utiliser la bibliothèque Python pykepdf. Pykepdf fonctionne très bien! Cependant, les fichiers PDF déchiffrés ne peuvent pas être lus aussi bien avec les bibliothèques Python du point précédent ( PyPDF2 et Tabula ). Pour le moment, nous avons fait quelques améliorations car en utilisant Adobe Reader, je peux exporter les informations des PDF décryptés, mais le but est de tout faire avec Python.
Le code que je montre fonctionne parfaitement avec les PDF non cryptés, mais pas avec les PDF cryptés. Il ne fonctionne pas avec les fichiers PDF déchiffrés qui ont également été obtenus avec pykepdf.
Je n'ai pas écrit le code. Je l'ai trouvé dans la documentation des bibliothèques Python Pykepdf et Tabula . La solution PyPDF2 a été écrite par Al Sweigart dans son livre, " Automatisez les trucs ennuyeux avec Python ", que je recommande fortement. J'ai également vérifié que le code fonctionne correctement, avec les limitations que j'ai expliquées auparavant.
Première question, pourquoi je ne peux pas lire les fichiers décryptés, si les programmes fonctionnent avec des fichiers qui n'ont jamais été cryptés?
Deuxième question, pouvons-nous lire avec Python les fichiers décryptés d'une manière ou d'une autre? Quelle bibliothèque peut le faire ou est impossible? Tous les PDF déchiffrés sont-ils extractibles?
Merci pour votre temps et votre aide!!!
J'ai trouvé ces résultats en utilisant Python 3.7, Windows 10, les ordinateurs portables Jupiter et 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()
Avec Tabula, je reçois le message "le fichier de sortie est vide".
Avec PyPDF2, je reçois seulement '/ n'
MISE À JOUR 10/3/2019 Pdfminer.six (Version novembre 2018)
J'ai obtenu de meilleurs résultats en utilisant la solution publiée par DuckPuncher . Pour le fichier décrypté, j'ai obtenu les étiquettes, mais pas les données. La même chose se produit avec le fichier crypté. Pour le fichier qui n'a jamais été chiffré fonctionne parfaitement. Comme j'ai besoin des données et des étiquettes des fichiers cryptés ou décryptés, ce code ne fonctionne pas pour moi. Pour cette analyse, j'ai utilisé pdfminer.six qui est la bibliothèque Python qui a été publiée en novembre 2018. Pdfminer.six comprend une bibliothèque pycryptodome. Selon leur documentation, " PyCryptodome est un package Python autonome de primitives cryptographiques de bas niveau .."
Le code est dans la question d'échange de pile: Extraire du texte d'un fichier PDF en utilisant PDFMiner en python?
J'aimerais si vous voulez répéter mon expérience. Voici la description:
1) Exécutez les codes mentionnés dans cette question avec n'importe quel PDF qui n'a jamais été chiffré.
2) Faites de même avec un PDF "sécurisé" (c'est un terme qu'Adobe utilise), je l'appelle le PDF crypté. Utilisez un formulaire générique que vous pouvez trouver en utilisant Google. Après l'avoir téléchargé, vous devez remplir les champs. Sinon, vous vérifieriez les étiquettes, mais pas les champs. Les données sont dans les champs.
3) Déchiffrez le PDF chiffré à l'aide de Pykepdf. Ce sera le PDF décrypté.
4) Exécutez à nouveau les codes à l'aide du PDF déchiffré.
MISE À JOUR 10/4/2019 Camelot (Version juillet 2019)
J'ai trouvé la bibliothèque Python Camelot. Attention, vous avez besoin de camelot-py 0.7.3.
Il est très puissant et fonctionne avec Python 3.7. De plus, il est très simple à utiliser. Tout d'abord, vous devez également installer Ghostscript . Sinon, cela ne fonctionnera pas. Vous devez également installer Pandas . N'utilisez pas pip install camelot-py . Utilisez plutôt pip install camelot-py [cv]
L'auteur du programme est Vinayak Mehta. Frank Du partage ce code dans une vidéo YouTube "Extraire des données tabulaires du PDF avec Camelot en utilisant Python."
J'ai vérifié le code et il fonctionne avec des fichiers non cryptés. Cependant, cela ne fonctionne pas avec les fichiers cryptés et décryptés, et c'est mon objectif .
Camelot est orienté pour obtenir des tableaux à partir de fichiers PDF.
Voici le code:
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)
MISE À JOUR 10/7/2019 J'ai trouvé une astuce. Si j'ouvre le fichier PDF sécurisé avec Adobe Reader, que je l'imprime à l'aide de Microsoft to PDF et que je l'enregistre au format PDF, je peux extraire les données à l'aide de cette copie. Je peux également convertir le fichier PDF en JSON, Excel, SQLite, CSV, HTML et d'autres formats. C'est une solution possible à ma question. Cependant, je cherche toujours une option pour le faire sans cette astuce car l'objectif est de le faire à 100% avec Python. Je crains également que si une meilleure méthode de cryptage est utilisée, l'astuce ne fonctionnera peut-être pas. Parfois, vous devez utiliser Adobe Reader plusieurs fois pour obtenir une copie extractible.
MISE À JOUR 10/8/2019. Troisième question. J'ai maintenant une troisième question. Tous les pdf sécurisés / cryptés sont-ils protégés par mot de passe? Pourquoi pikepdf ne fonctionne pas? Je suppose que la version actuelle de pikepdf peut briser certains types de cryptages, mais pas tous. @constt a mentionné que PyPDF2 peut briser un certain type de protection. Cependant, je lui ai répondu que j'avais trouvé un article selon lequel PyPDF2 peut briser les cryptages effectués avec Adobe Acrobat Pro 6.0, mais pas avec les versions postérieures.
qpdf
pour décrypter vos fichiers? Dans le cas où il fera l'affaire, vous pouvez l'appeler depuis votre script en utilisant le subprocess
module pour décrypter les fichiers avant de les analyser.
PyPDF2
, tout fonctionne très bien. J'ai utilisépdftk
ainsi que des services en ligne pour crypter des fichiers. Pouvez-vous publier des liens vers des fichiers pdf "gênants"?