PDF 偏执狂
利用第 9 章的 os.walk()函数编写一个脚本,遍历文件夹中的所有 PDF(包含子
文件夹),用命令行提供的口令对这些 PDF 加密。用原来的文件名加上_encrypted.pdf
后缀,保存每个加密的 PDF。在删除原来的文件之前,尝试用一个程序读取并解密
该文件,确保它被正确的加密。
然后编写一个程序,找到文件夹中所有加密的 PDF 文件(包括它的子文件夹),
利用提供的口令,创建 PDF 的解密拷贝。如果口令不对,程序应该打印一条消息,
并继续处理下一个 PDF 文件。
加密程序
#把路径内的pdf文件加密,并重命名,另存为d:\\encrypted文件
#把encypted内pdf解密,保存至d:\\dencypted
import PyPDF2,os
os.makedirs('d:\\encrypted',exist_ok=True)
print(os.getcwd())
dir = os.getcwd()
for folderName,subfolders,filenames in os.walk(dir):
for filename in filenames:
if not filename.endswith('.pdf'):#过滤不是pdf文件
continue
#把要加密的文件创建对象
oldName = os.path.join(folderName,filename)
print(oldName)
pdfFile = open(oldName,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
if pdfReader.isEncrypted == 1:#不是加密文件才向下执行,是就跳过
continue
#把pdf文件拷贝至新文件
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdfReader.numPages):
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
#新加密文件放另存为一个文件夹,
newName = os.path.join('d:','encrypted', filename.split('.')[0] + '_encrypted.pdf')
outputFile = open(newName,'wb')
pdfWriter.encrypt('123456')
pdfWriter.write(outputFile)
outputFile.close()
print(newName)
解密程序
import PyPDF2,os
os.makedirs('d:\\decrypted',exist_ok=True)
for filename in os.listdir('d:\\encrypted'):
if not filename.endswith('_encrypted.pdf'):
continue
tempName = os.path.join('d:\\encrypted',filename)
pdfReader = PyPDF2.PdfFileReader(open(tempName,'rb'))
pdfWriter2 = PyPDF2.PdfFileWriter()
if pdfReader.decrypt('123456') == True:
print('yes!')
for pageNum in range(pdfReader.numPages):
pdfWriter2.addPage(pdfReader.getPage(pageNum))
outputFile2=open('d:\\decrypted\\'+filename.split('_')[0]+'.pdf','wb')
print(outputFile2)
pdfWriter2.write(outputFile2)
outputFile2.close()
else:
print('passwd error.')
定制邀请函,保存为 Word 文档
假设你有一个客人名单。guest = [‘Prof. Plum’,‘Miss Scarlet’,‘Col. Mustard’,‘Al Sweigart’,‘RoboCop’]
因为 python-docx 只能使用 Word 文档中已经存在的样式,所以你必须先将这些
样式添加到一个空白 Word 文件中,然后用 python-docx 打开该文件。在生成的 Word
文档中,每份邀请函应该占据一页,所以在每份邀请函的最后一段调用 add_break(),
添加分页符。这样,你只需要打开一份 Word 文档,就能打印所有的邀请函。
import docx#导入模块
guest = ['Prof. Plum','Miss Scarlet','Col. Mustard','Al Sweigart','RoboCop']
doc=docx.Document()#创建空白WORD文档
for i in range(len(guest)):#将内容添加到word
doc.add_paragraph('It would be a pleasure to have the company to')
paraobj1 = doc.add_paragraph(guest[i])
paraobj1.style = 'Title'
doc.add_paragraph('at 11010 Memary Lane on the Euening to')
doc.add_paragraph('April 1st')
paraobj2 = doc.add_paragraph("at 7 o'clock")
paraobj2.runs[0].add_break(docx.enum.text.WD_BREAK.PAGE)
doc.save('newWord.docx')#保存文件
暴力 PDF 口令破解程序
假定有一个加密的 PDF 文件,你忘记了口令,但记得它是一个数字。假如是6位密码,从000000到200000。
利用第 8 章学过的文件读取技巧来读取这个文件,创建一个单词字符串的列表。
然后循环遍历这个列表中的每个单词,将它传递给 decrypt()方法,如果这个方法返
回整数 0,口令就是错的,程序应该继续尝试下一个口令。如果 decrypt()返回 1,
程序就应该终止循环,打印出破解的口令。
import PyPDF2,datetime
pdfReader = PyPDF2.PdfFileReader(open('passwdStrong.pdf','rb'))
print(pdfReader.isEncrypted)
#passwd = '123456'
print('Start!')
dt1 = datetime.datetime.now()
for num in range(123450,130000):
if pdfReader.decrypt(str(num)):
print('yes!!!%s'%(num))
break
else:
print('No!!!')
dt2 = datetime.datetime.now()
print('Done---->%s'%(dt2-dt1).microseconds)