我是一名纯数学专业的毕业生,只学过基础编程课程。我正在实习,并有一个内部数据分析项目。我必须分析去年的内部PDF文件。这些PDF文件是“安全的”,也就是加密的。我们没有密码,而且我们不确定是否存在密码。但是,我们拥有所有这些文档,我们可以手动阅读它们。我们也可以打印它们。目标是使用Python读取它们,因为那是我们了解的编程语言。
首先,我尝试使用一些Python库来读取PDF文件。然而,我找到的Python库无法读取加密的PDF文件。那时,我也无法使用Adobe Reader导出信息。
其次,我决定解密PDF文件。我使用了Python库pykepdf成功地解密了PDF文件。Pykepdf非常好用!然而,使用前面提到的Python库(PyPDF2和Tabula)仍然无法读取已经解密的PDF文件。此时,我们已经有所进步,因为使用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,它是一个Python库,于2018年11月发布。Pdfminer.six包括一个名为pycryptodome的库。根据他们的文档“PyCryptodome是一种自包含的低级密码基元的Python软件包。”
代码在堆栈交换问题中:
如果您愿意重复我的实验,我会很高兴。以下是描述:
1)使用任何从未加密过的PDF运行此问题中提到的代码。
2)对于一个“安全”的PDF(这是Adobe使用的术语),我称之为加密PDF。使用您可以在Google上找到的通用表格。下载后,您需要填写字段。否则,您将仅检查标签而不是字段。数据在字段中。
3)使用Pykepdf解密加密的PDF。这将是已解密的PDF。
4)再次使用已解密的PDF运行代码。
更新于2019年10月4日 骆驼(版本为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从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)
更新于2019年10月7日
我找到了一个技巧。如果我使用Adobe Reader打开安全的PDF文件,然后使用Microsoft打印成PDF格式,并将其保存为PDF文件,我可以提取其中的数据。我还可以将PDF文件转换为JSON、Excel、SQLite、CSV、HTML和其他格式。这是解决我的问题的可能方法。然而,我仍在寻找一种不需要该技巧的选项,因为目标是只使用Python解决问题。我也担心,如果使用更好的加密方法,这个技巧可能不起作用。有时你需要多次使用Adobe Reader才能获得可提取的副本。
更新于2019年10月8日。第三个问题。 我现在有第三个问题。所有安全/加密的PDF文件都受密码保护吗?为什么pikepdf无法工作?我猜测当前版本的pikepdf可以破解某些类型的加密,但不是所有类型。 @constt提到PyPDF2可以破解某些类型的保护。然而,我回复他说,我发现一篇文章说PyPDF2可以破解使用Adobe Acrobat Pro 6.0进行加密的文件,但不能破解使用后续版本进行加密的文件。
PyPDF2
重现这些问题,一切都正常。我使用了pdftk
以及在线服务来加密文件。你能否发布“有问题”的pdf文件的链接? - constt