1. 创建pdf(复制页面)
PyPDF2不允许直接编辑PDF,必须创建一个新的PDF,然后从已有的文档复制内容
import PyPDF2
"""
创建pdf的步骤,PyPDF2不允许直接编辑PDF,必须创建一个新的PDF,然后从已有的文档复制内容
1. 打开或创建1个或多个已有的PDF(源PDF),得到PdfFileReader对象
2. 创建一个新的PdfFileWriter对象
3. 将页面从PdfFileReader对象复制到PdfFileWriter对象中。
4. 利用PdfFileReader对象写入输出的pdf.
创建一个PdfFileWriter对象,只是在Python中创建了一个代表PDF文档的值,这并没有创建实际的PDF文件,
要生成实际的PDF文件,必须调用PdfFileWriter对象的writer()方法。
"""
pdf1File = open('./report1.pdf', 'rb')
pdf2File = open('./report2.pdf', 'rb')
pdf1Reader = PyPDF2.PdfFileReader(pdf1File)
pdf2Reader = PyPDF2.PdfFileReader(pdf2File)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdf1Reader.numPages):
pageObj = pdf1Reader.getPage(pageNum)
pdfWriter.addPage(pageObj)
for pageNum in range(pdf2Reader.numPages):
pageObj = pdf2Reader.getPage(pageNum)
pdfWriter.addPage(pageObj)
pdfOutputFile = open('combinedminutes.pdf', 'wb')
pdfWriter.write(pdfOutputFile)
pdfOutputFile.close()
pdf1File.close()
pdf2File.close()
2. 旋转页面
import PyPDF2
# 旋转页面
pdffile = open('./combinedminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdffile)
page = pdfReader.getPage(0).rotateCounterClockwise(90)
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(page)
resultPdfFile = open('rotatedPage.pdf', 'wb')
pdfWriter.write(resultPdfFile)
resultPdfFile.close()
pdffile.close()
3. 叠加页面(水印)
import PyPDF2
'''
PyPDF2也可以将一页的内容叠加到另一页,这可以用来在页面上添加公司标志、时间戳或水印,
可以很容易为多个文件添加水印,并且只针对程序指定的页面添加
'''
pdffile = open('./combinedminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdffile)
pdfWatermarkReader = PyPDF2.PdfFileReader(open('./watermark.pdf', 'rb'))
pdfWriter = PyPDF2.PdfFileWriter()
for pagenum in range(0,pdfReader.numPages):
pageobj = pdfReader.getPage(pagenum)
pageobj.mergePage(pdfWatermarkReader.getPage(0))
pdfWriter.addPage(pageobj)
resultPdfFile = open('watermarkCover.pdf', 'wb')
pdfWriter.write(resultPdfFile)
pdffile.close()
resultPdfFile.close()
4. pdf的加密与解密
import PyPDF2
# # 加密pdf
pdffile = open('./combinedminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdffile)
pdfWriter = PyPDF2.PdfFileWriter()
for pagenum in range(pdfReader.numPages):
pdfWriter.addPage(pdfReader.getPage(0))
pdfWriter.encrypt('xyz123')
resultPdf = open('entryptedfile.pdf', 'wb')
pdfWriter.write(resultPdf)
resultPdf.close()
pdffile.close()
import PyPDF2
# 解密pdf
pdfReader = PyPDF2.PdfFileReader(open('entryptedfile.pdf', 'rb'))
# 如果PDF是加密的返回true,否则返回false
print(pdfReader.isEncrypted)
# 在文件用正确的口令之前解密之前,尝试调用函数来读取文件将会导致错误
# 要读取加密的PDF,需调用decrypt()函数 ;口令正确返回1,否则返回0
# pdfReader.decrypt('xyz123')
print(pdfReader.decrypt('xyz123'))
pageobj = pdfReader.getPage(0)
# print(pageobj.extractText()) # 提取页面内容
resultPdfFile = open('解密后的文件.pdf', 'wb')
pdfWriter.write(resultPdfFile)
resultPdfFile.close()
注意:decrypt函数只解密了PdfFileReader对象,而不是实际的PDF文档。在程序终止后,硬盘上的文件仍然是加密的。在程序下次运行时,任然需要再次调用decrypt()
5 使用密码本对加密的pdf文件进行暴力破解
# -*- coding: utf-8 -*-
import time
from PyPDF2 import PdfFileReader, PdfFileWriter
# 1 穷举法:生成6位数字+字母密码本,极为耗时!!!!不建议采用
# string='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'#这里加上你想要的字符
# stm=time.time()
# with open('password.txt','a') as dic:#在当前目录生成password.txt文件
# for a in range(len(string)):
# for b in range(len(string)):
# for c in range(len(string)):
# for d in range(len(string)):
# for e in range(len(string)):
# for f in range(len(string)):
# pwd=string[a]+string[b]+string[c]+string[d]+string[e]+string[f]#生成6位数字字母密码
# dic.write(pwd)
# dic.write('\n')
# print('密码正在写入文件:', pwd)
# ent=time.time()
# print('成功生成密码本!用时%f分'%((ent-stm)/60))
pdf_reader = PdfFileReader('entryptedfile.pdf')
pdf_writer = PdfFileWriter()
stm=time.time()
# 2 读取密码字典文件里的密码,进行暴力破解
i = 0
with open('password0.txt', 'r', encoding='gb18030', errors='ignore') as f:
for passwrd in f.readlines():
print('第{}次破解:{}'.format(i, passwrd.strip()))
i += 1
try:
if pdf_reader.decrypt(passwrd.strip()):
print(f'文件已破解!!! 密码为{passwrd.strip()}')
pages = pdf_reader.getNumPages()
for i in range(pages):
content = pdf_reader.getPage(i)
pdf_writer.addPage(content)
with open('new_file.pdf', 'wb') as pdf:
pdf_writer.write(pdf)
break
except Exception as e:
print(e)
continue
ent = time.time()
print('暴力破解共用时%f分'%((ent-stm)/60))
使用网络上下载的密码本进行暴力破解时,若密码本中不包含正确密码则会解密失败,因此建议小伙伴们在对文件进行加密时不要设置弱密码!!!
密码本及本文源程序下载地址为: