前面学习了解析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文件,然后再去解析即可。
如何解密呢? 话不多说,直接看代码。
如果不知道密码,最好设置为空,这样的话 大多数就可以解析,代码如下: