Python编程快速上手13章处理PDF和Word文档(下)

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值