深⼊学习Python解析并解密PDF⽂件内容的⽅法
前⾯学习了解析PDF⽂档,并写⼊⽂档的知识,那篇⽂章的名字为深⼊学习Python解析并读取PDF⽂件内容的⽅法。
链接如下:
但是最近出现了⼀个新问题,就是上⾯使⽤pdfminer这个库只能解析正常的PDF内容,然⽽在实际情况中,公司的⼀些⽂档可能是加密的,那么如何处理加密的PDF⽂件,就是本⽂学习的重点。
在⽹上查资料,发现pypdf2可以实现对pdf⽂件进⾏加密,解密,所以就学习了⼀下这个库,并留下笔记。
⾸先说明pypdf2是Python3版本的,在之前的Python2版本有⼀个对应的pypdf库,但是本⽂下载了pypdf2这个库,在Python2 运⾏时没有报错的。
注意:所有修改操作均⽆法再原⽂件中操作,只能将修改的结果写⼊新⽂件中。python解析json文件
⼀:PyPDF2介绍
PyPDF2是源⾃pyPdf项⽬的纯python PDF⼯具包。它⽬前由。维护。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 下载
在/project/PyPDF2/ 中搜索PyPDF2 1.26.0可以安装包。
2.2 在Linux安装压缩包命令如下:
cd /data && tar -xvf PyPDF2-1.26.
plc入门基础知识及讲解cd PyPDF2-1.26.0
python setup.py install
2.3 直接安装
pip install pypdf2
2.4 PyPDF的官⽅⽂档:
三:PyPDF 的使⽤⽬的
⾸先我这⾥有⼀个加密的PDF⽂件:
那么我使⽤上⼀篇⽂章的代码(如下):
#coding:utf-8
import importlib
import sys
import time
time1 = time.time()
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter verter 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内容
# _pages() 获取page列表
for page _pages():
interpreter.process_page(page)
# 接受该页⾯的LTPage对象
layout = _result()
# 这⾥layout是⼀个LTPage对象⾥⾯存放着这个page解析出的各种对象 # ⼀般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 # 想要获取⽂本就获得对象的text属性,
for x in layout:
if (isinstance(x, LTTextBoxHorizontal)):
with open(', 'a') as f:
results = x.get_text()
print(results)
f.write(results + "\n")
if __name__ == '__main__':
parse()
time2 = time.time()
print("总共消耗时间为:", time2 - time1)
解析的时候,会主动触发异常(如下):
那么,打开⽂件,我们会发现,实际情况是这样的:
既然⽂件已经加密,那么正常渠道解析,肯定会触发异常,所以此时的重中之重就是解密PDF⽂件,然后再去解析即可。 如何解密呢?话不多说,直接看代码。
如果不知道密码,最好设置为空,这样的话⼤多数就可以解析,代码如下:
# coding:utf-8
import os
from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter
def get_reader(filename, password):
try:
old_file = open(filename, 'rb')
print('run jiemi1')
except Exception as err:
print('⽂件打开失败!' + str(err))
return None
# 创建读实例
pdf_reader = PdfFileReader(old_file, strict=False)
# 解密操作
if pdf_reader.isEncrypted:
if password is None:
print('%s⽂件被加密,需要密码!' % filename)
return None
else:
if pdf_reader.decrypt(password) != 1:
print('%s密码不正确!' % filename)
return None
if old_file in locals():
old_file.close()
return pdf_reader
def decrypt_pdf(filename, password, decrypted_filename=None):
"""
将加密的⽂件及逆⾏解密,并⽣成⼀个⽆需密码pdf⽂件
:param filename: 原先加密的pdf⽂件
:param password: 对应的密码
:param decrypted_filename: 解密之后的⽂件名
:
return:
"""
# ⽣成⼀个Reader和Writer
print('run jiemi')
pdf_reader = get_reader(filename, password)
if pdf_reader is None:
return
if not pdf_reader.isEncrypted:
print('⽂件没有被加密,⽆需操作!')
return
c专家编程怎么样pdf_writer = PdfFileWriter()
pdf_writer.appendPagesFromReader(pdf_reader)
if decrypted_filename is None:
decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + 'decrypted' + '.pdf'
# 写⼊新⽂件
pdf_writer.write(open(decrypted_filename, 'wb'))
decrypt_pdf(r'5b931164edc09a226b3a12c4.pdf', '')
运⾏结果如下:
新⽣成的⽂件如下:
打开是这样的:
所以,这样的话就可以打开了,也可以解析了,下⾯继续使⽤PDF解析⽂件解析,代码是上⾯的,结果如下:
解析成功,那么会保存为txt格式。
但是这⾥要注意,我给解密的代码,把密码设置为abc,如下:
那么会触发异常,代码结果表⽰如下:
代码如下:
# coding:utf-8
import os
from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter
def get_reader(filename, password):
try:
old_file = open(filename, 'rb')
print('run jiemi1')
except Exception as err:
print('⽂件打开失败!' + str(err))
return None
# 创建读实例
pdf_reader = PdfFileReader(old_file, strict=False)
# 解密操作
if pdf_reader.isEncrypted:
if password is None:
print('%s⽂件被加密,需要密码!' % filename)
return None
else:
if pdf_reader.decrypt(password) != 1:
print('%s密码不正确!' % filename)
return None
if old_file in locals():
old_file.close()
return pdf_reader
def decrypt_pdf(filename, password, decrypted_filename=None):
"""
将加密的⽂件及逆⾏解密,并⽣成⼀个⽆需密码pdf⽂件
:param filename: 原先加密的pdf⽂件
:param password: 对应的密码
:param decrypted_filename: 解密之后的⽂件名
:return:
"""
# ⽣成⼀个Reader和Writer
print('run jiemi')
pdf_reader = get_reader(filename, password)
if pdf_reader is None:
return
if not pdf_reader.isEncrypted:
print('⽂件没有被加密,⽆需操作!')
return
pdf_writer = PdfFileWriter()
pdf_writer.appendPagesFromReader(pdf_reader)
if decrypted_filename is None:
decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + 'decrypted' + '.pdf'
# 写⼊新⽂件
pdf_writer.write(open(decrypted_filename, 'wb'))
简述全局变量与局部变量的作用域lazyload
decrypt_pdf(r'5b931164edc09a226b3a12c4.pdf', 'abc')
四:PyPDF2的理论介绍
PyPDF2 包含了 PdfFileReader PdfFileMerger PageObject PdfFileWriter 四个常⽤的主要 Class。具体分析:
PyPDF2 将读与写分成两个类来操作:
from PyPDF2 import PdfFileWriter, PdfFileReader
writer = PdfFileWriter()
reader = PdfFileReader(open("document1.pdf", "rb"))
官⽅实例:
from PyPDF2 import PdfFileWriter, PdfFileReader
output = PdfFileWriter()
input1 = PdfFileReader(open("document1.pdf", "rb"))
# print how many pages input1 has:
print "document1.pdf has %d pages." % NumPages()
# add page 1 from input1 to output document, unchanged
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论