深入学习Python解析并解密PDF文件内容的方法

  前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容方法

  链接如下:https://www.cnblogs.com/wj-1314/p/9429816.html 

  但是最近出现了一个新问题,就是上面使用pdfminer这个库只能解析正常的PDF内容,然而在实际情况中,公司的一些文档可能是加密的,那么如何处理加密的PDF文件,就是本文学习的重点。

  在网上查找资料,发现pypdf2可以实现对pdf文件进行加密,解密,所以就学习了一下这个库,并留下笔记。

  首先说明pypdf2是Python3版本的,在之前的Python2版本有一个对应的pypdf库,但是本文下载了pypdf2这个库,在Python2 运行时没有报错的。

  注意:所有修改操作均无法再原文件中操作,只能将修改的结果写入新文件中。

一:PyPDF2介绍

  PyPDF2是源自pyPdf项目的纯python PDF工具包。它目前由Phaseit,Inc。维护。PyPDF2可以从PDF文件中提取数据,或者操纵现有的PDF来生成新文件。PyPDF2与Python版本2.6,2.7和3.2 - 3.5兼容。

作为PDF工具包构建的Pure-Python库。它能够:

提取文档信息(标题,作者,......)

逐页拆分文档

逐页合并文档

裁剪页面

将多个页面合并为一个页面

加密和解密PDF文件

  通过Pure-Python,它应该在任何Python平台上运行,而不依赖于外部库。它也可以完全在StringIO对象而不是文件流上工作,允许在内存中进行PDF操作。因此,它是管理或操作PDF的网站的有用工具。

  而本文主要学习加密解密PDF文件。

二:PyPDF2安装 2.1 下载

  在https://pypi.org/project/PyPDF2/ 中搜索PyPDF2 1.26.0可以安装包。

2.2  在Linux安装压缩包命令如下:

cd /data && tar -xvf PyPDF2-1.26.0.tar.gz cd PyPDF2-1.26.0 python setup.py install

2.3 直接安装

pip install pypdf2

 2.4   PyPDF的官方文档:https://pythonhosted.org/PyPDF2/ 三:PyPDF 的使用目的

  首先 我这里有一个加密的PDF文件:

  那么我使用上一篇文章的代码(如下):

#coding:utf-8 import importlib import sys import time importlib.reload(sys) time1 = time.time() from pdfminer.pdfparser import PDFParser, PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams from pdfminer.pdfinterp import PDFTextExtractionNotAllowed text_path = r'5b931164edc09a226b3a12c4.pdf' def parse(): '''解析PDF文本,并保存到TXT文件中''' fp = open(text_path, 'rb') # 用文件对象创建一个PDF文档分析器 parser = PDFParser(fp) # 创建一个PDF文档 doc = PDFDocument() # 连接分析器,与文档对象 parser.set_document(doc) doc.set_parser(parser) # 提供初始化密码,如果没有密码,就创建一个空的字符串 doc.initialize() # 检测文档是否提供txt转换,不提供就忽略 if not doc.is_extractable: raise PDFTextExtractionNotAllowed else: # 创建PDF,资源管理器,来共享资源 rsrcmgr = PDFResourceManager() # 创建一个PDF设备对象 laparams = LAParams() device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 创建一个PDF解释其对象 interpreter = PDFPageInterpreter(rsrcmgr, device) # 循环遍历列表,每次处理一个page内容 # doc.get_pages() 获取page列表 for page in doc.get_pages(): interpreter.process_page(page) # 接受该页面的LTPage对象 layout = device.get_result() # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 # 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 # 想要获取文本就获得对象的text属性, for x in layout: if (isinstance(x, LTTextBoxHorizontal)): with open(r'2.txt', 'a') as f: results = x.get_text() print(results) f.write(results + "\n") if __name__ == '__main__': parse() time2 = time.time() print("总共消耗时间为:", time2 - time1)

  解析的时候,会主动触发异常(如下):

  那么,打开文件,我们会发现,实际情况是这样的:

  既然文件已经加密,那么正常渠道解析,肯定会触发异常,所以此时的重中之重就是解密PDF文件,然后再去解析即可。

  如何解密呢?  话不多说,直接看代码。

如果不知道密码,最好设置为空,这样的话 大多数就可以解析,代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/326c69ad83386fe7634601de1c129360.html