我是一名刚毕业的纯数学专业的毕业生,只上过很少的基础编程课程。我正在实习,并且有一个内部数据分析项目。我必须分析过去几年的内部 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在他的书“用 Python 自动化无聊的东西”中编写的,我强烈推荐这本书。我还检查了代码是否工作正常,具有我之前解释的限制。
第一个问题,如果程序使用从未加密的文件,为什么我无法读取解密的文件?
第二个问题,我们可以用 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'
更新 2019 年 10 月 3 日 Pdfminer.six(2018 年 11 月版本)
使用DuckPuncher发布的解决方案,我得到了更好的结果。对于解密的文件,我得到了标签,但没有得到数据。加密文件也是如此。对于从未加密过的文件来说,它是完美的。由于我需要加密或解密文件的数据和标签,因此此代码对我不起作用。对于该分析,我使用了 pdfminer.six,它是 2018 年 11 月发布的 Python 库。Pdfminer.six 包含一个库 pycryptodome。根据他们的文档“ PyCryptodome是一个自包含的 Python 低级加密原语包..”
代码在堆栈交换问题中: Extracting text from a PDF file using PDFMiner in python?
如果你想重复我的实验,我会很高兴。这是描述:
1) 使用任何从未加密的 PDF 运行此问题中提到的代码。
2) 对 PDF“安全”(这是 Adobe 使用的术语)执行相同操作,我将其称为加密 PDF。使用可通过 Google 找到的通用表单。下载后,您需要填写字段。否则,您将检查标签,而不是字段。数据在字段中。
3) 使用 Pykepdf 解密加密的 PDF。这将是解密的 PDF。
4) 使用解密的 PDF 再次运行代码。
更新 2019 年 10 月 4 日 Camelot(2019 年 7 月版)
我找到了 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 我发现了一个技巧。如果我使用 Adobe Reader 打开受保护的 pdf,然后使用 Microsoft 将其打印为 PDF,并将其另存为 PDF,则可以使用该副本提取数据。我还可以将 PDF 文件转换为 JSON、Excel、SQLite、CSV、HTML 和其他格式。这是我的问题的可能解决方案。但是,我仍然在寻找一种不使用该技巧的选项,因为目标是 100% 使用 Python 来完成。我还担心,如果使用更好的加密方法,这个技巧可能不会奏效。有时您需要多次使用 Adobe Reader 才能获得可提取的副本。
2019 年 10 月 8 日更新。第三个问题。 我现在有第三个问题。所有安全/加密的 pdf 都受密码保护吗?为什么 pikepdf 不起作用?我的猜测是当前版本的 pikepdf 可以破坏某些类型的加密,但不是全部。@constt 提到 PyPDF2 可以破坏某种类型的保护。但是,我回复他说,我发现一篇文章说 PyPDF2 可以破解使用 Adobe Acrobat Pro 6.0 进行的加密,但不能破解后期版本。