私は純粋な数学の最近の卒業生で、基本的なプログラミングコースをほとんど履修していません。私はインターンシップを行っており、内部データ分析プロジェクトがあります。ここ数年の内部PDFを分析する必要があります。PDFは「保護されています」。つまり、暗号化されます。PDFパスワードはありません。さらに、パスワードが存在するかどうかは不明です。しかし、これらのドキュメントはすべて揃っており、手動で読むことができます。印刷することもできます。目標は、私たちがいくつかのアイデアを持っている言語であるPythonで読むことです。
まず、いくつかのPythonライブラリでPDFを読み込もうとしました。しかし、私が見つけたPythonライブラリは暗号化されたPDFを読みません。当時は、Adobe Readerでもエクスポートできませんでした。
次に、PDFを復号化することにしました。Pythonライブラリーpykepdfを使用して成功しました。Pykepdfは非常にうまく機能します!ただし、復号化されたPDFは、前のポイントのPythonライブラリ(PyPDF2およびTabula)でも読み取ることができません。現時点では、Adobe Readerを使用して復号化されたPDFから情報をエクスポートできるため、多少の改善がありましたが、目的はすべてをPythonで行うことです。
私が示しているコードは、暗号化されていないPDFでは完全に機能しますが、暗号化されたPDFでは機能しません。pykepdfで取得した復号化されたPDFでも機能しません。
私はコードを書きませんでした。PythonライブラリPykepdfとTabulaのドキュメントで見つけました。PyPDF2ソリューションは、Al Sweigartの著書「Automate the Boring Stuff with Python」で私が強く推奨しています。また、前に説明した制限付きで、コードが正常に機能していることも確認しました。
最初の質問、プログラムが暗号化されたことのないファイルで動作する場合、なぜ復号化されたファイルを読み取れないのですか?
2番目の質問、復号化されたファイルをPythonで何らかの方法で読み取ることができますか?どのライブラリがそれを実行できるか、または不可能ですか?復号化されたPDFはすべて抽出可能ですか?
あなたの時間と助けてくれてありがとう!!!
これらの結果は、Python 3.7、Windows 10、Jupiter Notebooks、および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()
Tabulaを使用すると、「出力ファイルが空です」というメッセージが表示されます。
PyPDF2では、「/ n」のみが表示されます
UPDATE 10/3/2019 Pdfminer.six(バージョン2018年11月)
DuckPuncherによって投稿されたソリューションを使用して、より良い結果を得ました。復号化されたファイルの場合、ラベルは取得しましたが、データは取得しませんでした。暗号化されたファイルでも同じことが起こります。暗号化されていないファイルは完璧に機能します。暗号化または復号化されたファイルのデータとラベルが必要なので、このコードは機能しません。その分析には、2018年11月にリリースされたPythonライブラリであるpdfminer.sixを使用しました。Pdfminer.sixには、pycryptodomeライブラリが含まれています。彼らのドキュメントによると「PyCryptodomeは低レベルの暗号化プリミティブの自己完結型Pythonパッケージです。」
コードはスタック交換の質問にあります: PythonでPDFMinerを使用してPDFファイルからテキストを抽出しますか?
私の実験を繰り返したいと思います。ここに説明があります:
1)暗号化されていないPDFを使用して、この質問で言及されているコードを実行します。
2)PDF "Secure"(これはAdobeが使用する用語です)でも同じことを行います。私はそれを暗号化PDFと呼んでいます。Googleを使用して見つけることができる一般的なフォームを使用します。ダウンロードした後、フィールドに入力する必要があります。それ以外の場合は、ラベルではなくフィールドをチェックします。データはフィールドにあります。
3)Pykepdfを使用して暗号化されたPDFを復号化します。これが復号化されたPDFになります。
4)復号化されたPDFを使用してコードを再度実行します。
UPDATE 10/4/2019 Camelot(バージョンJuly 2019)
PythonライブラリCamelotを見つけました。camelot-py 0.7.3が必要になることに注意してください。
これは非常に強力で、Python 3.7で動作します。また、非常に使いやすいです。まず、Ghostscriptもインストールする必要があります。それ以外の場合は機能しません。Pandasもインストールする必要があります。 pip install camelot-pyは使用しないでください。代わりにpip install camelot-py [cv]を使用してください
プログラムの作成者はVinayak Mehtaです。Frank DuがこのコードをYouTubeビデオ「Pythonを使用したCamelotでPDFから表形式のデータを抽出する」で共有しています。
コードを確認したところ、暗号化されていないファイルで動作しています。ただし、暗号化および復号化されたファイルでは機能しません。それが私の目標です。
Camelotは、PDFからテーブルを取得するように設計されています。
これがコードです:
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)
更新10/7/2019 1つのトリックを見つけました。保護されたPDFをAdobe Readerで開き、Microsoftを使用してPDFに印刷し、PDFとして保存すると、そのコピーを使用してデータを抽出できます。PDFファイルをJSON、Excel、SQLite、CSV、HTML、その他の形式に変換することもできます。これは私の質問に対する可能な解決策です。ただし、目標はPythonで100%実行することなので、そのトリックなしでそれを実行するオプションをまだ探しています。また、暗号化のより良い方法が使用された場合、トリックが機能しない可能性があることも心配しています。抽出可能なコピーを取得するために、Adobe Readerを数回使用する必要がある場合があります。
2019年10月8日更新。3番目の質問。 3つ目の質問です。保護/暗号化されたPDFはすべてパスワードで保護されていますか?なぜpikepdfが機能しないのですか?私の推測では、pikepdfの現在のバージョンでは、一部の種類の暗号化は解読できますが、すべてが解読できるわけではありません。@consttは、PyPDF2がある種の保護を破ることができると述べました。しかし、PyPDF2はAdobe Acrobat Pro 6.0で作成された暗号化を破ることができるが、後のバージョンでは破られないという記事を見つけたと彼に返信しました。
qpdf
してファイルを復号化しようとしましたか?それがうまくいく場合は、subprocess
モジュールを使用してスクリプトから呼び出し、ファイルを解析する前にファイルを復号化できます。
PyPDF2
で再現できませんでした、すべてうまくいきます。私が使用しpdftk
暗号化ファイルへのオンラインサービスと同様。「厄介な」PDFファイルへのリンクを投稿できますか?