Python让繁琐工作自动化——chapter13 处理PDF和Word文档

1 基础语法

1.1 PDF模块

(1)导入模块
import PyPDF2
(2)读取PDF文件
pdffile = open('pdf2.pdf','rb')              
pdfreader = PyPDF2.PdfFileReader(pdffile)              #创建PdfFileReader 对象
(3)写入文件
#一般用于从一个PDF复制内容写入到另一个PDF中
pdfwriter = PyPDF2.PdfFileWriter()
pdfwriter.addPage(pageobj)   #pageobj为从原PDF得到的某一页的page对象
pdfoutput = open('PDF-Merge.pdf','wb')
pdfwriter.write(pdfoutput)   #将writer对象写到output文件中
pdfoutput.close()
(4)常用函数

a. 解密函数

pdfreader.decrypt(password)

b. 加密函数&判断是否加密

pdfreader.isEncrypted ==True   #被加密
pdfwriter.encrypt(password)    #加密(密码)

c. 拷贝页面

pageobj = pdfreader.getPage(pagenum)    #获取当前页面作为page对象
pdfwriter.addPage(pageobj)              #将页面对象写入到writer中

d. 旋转页面

page.rotateClockwise(90)             #旋转90度
(5)经典实例

a. PDF文字提取

import PyPDF2

pdffile = open('pdf2.pdf','rb')
pdfreader = PyPDF2.PdfFileReader(pdffile)

page0 = pdfreader.getPage(0)
text = page0.extractText()
print(text)

b. 多个pdf合并

#多个pdf合并 并去除第一页
import PyPDF2,os

pdffiles = []
pdfwriter = PyPDF2.PdfFileWriter()
#找到当前目录下所有pdf文件
for file in os.listdir('.'):
    if file.endswith('.pdf'):
        pdffiles.append(file)

#将每一页添加到writer中
for pdf in pdffiles:
    pdfobj = open(pdf,'rb')
    pdfreader = PyPDF2.PdfFileReader(pdfobj)
    for pagenum in range(1,pdfreader.numPages):   #从第2页开始
        pageobj = pdfreader.getPage(pagenum)
        pdfwriter.addPage(pageobj)

#保存
pdfoutput = open('PDF-Merge.pdf','wb')
pdfwriter.write(pdfoutput)   #将writer对象写到output文件中
pdfoutput.close()

1.2 Word模块

(1)导入模块
import docx      #注意用pip安装时  pip install python-docx
(2)读取word文档

doc = docx.Document('demo.docx')

word文档有很多结构,具体分支如下:


所以,根据一个word文档的结构,可以根据一下来读取文字内容

doc.paragraphs[0].text
doc.paragraphs[0].runs[0].text
(3)写入文档
para1 = doc.add_paragraph('April 1st')  #添加新的段落
para2 = doc.add_paragraph('April 2st')  #添加新的段落
para1.add_run('这一段存在于para1的段尾')
doc.add_heading('Header',0)  #最高级0级标题
(4)常用函数

a. 对象格式

doc.paragraphs[1].runs[0].style = 'Normal'   #设置正常样式
doc.paragraphs[1].runs[0].underline = True   #设置下划线样式

b. 添加图像

doc.add_picture('picture.png',width = docx.shared.Inches(1),height = docx.shared.Cm(4)) #设置宽度为1英寸,高度为4厘米

c. 添加换行符和换页符

doc.add_page_break()    #换页符
doc.add_break()         #换行符

2 课后习题

2.1 PDF偏执狂

    遍历当前文件夹中所有PDF,用输入的口令对这些PDF加密,用原来文件名加上_encrpted.pdf后缀,保存每个加密的PDF,在尝试读取并解密该文件,确保被正确的加密

    然后在编写一个程序,找到当前文件夹中所有加密的PDF,利用提供的口令,创建PDF的解密拷贝,如果口令不对,程序应打印一条信息,并继续处理

import os
import PyPDF2
#第一个功能 PDF加密部分
pdffiles = []
#os.walk遍历pycharm文件夹
for folder , sub , file in os.walk('C:\\pycharm\\project\\chapter13 PDFandWord'):  #主文件夹,子文件夹,文件
    for pdffile in file:    #文件中的每一个文件
        if pdffile.endswith('.pdf'):
            pdffiles.append(pdffile)

password = input('请输入加密口令: ')
for originpdf in pdffiles:

    pdf = open(originpdf,'rb')
    pdfreader = PyPDF2.PdfFileReader(pdf)
    if pdfreader.isEncrypted !=True:    #同之前操作加密的PDF区分开
        pdfwriter = PyPDF2.PdfFileWriter()
        for pagenum in range(0,pdfreader.numPages):   #PDF复制
            pdfwriter.addPage(pdfreader.getPage(pagenum))

        pdfwriter.encrypt(password)
        resultpdf = open(originpdf.split('.')[0]+'_encrypted.pdf','wb')
        pdfwriter.write(resultpdf)
        resultpdf.close()
    if pdfreader.isEncrypted:   #判断加密文件是否被加密
        if pdfreader.decrypt(password):
            print('%s被成功加密!'%pdfreader)

import os
import PyPDF2
#第二个功能 PDF解密部分
pdffiles = []
#os.walk遍历pycharm文件夹
for folder , sub , file in os.walk('C:\\pycharm\\project\\chapter13 PDFandWord'):
    for pdffile in file:
        if pdffile.endswith('.pdf'):
            pdffiles.append(pdffile)

password = input('请输入解密口令: ')
for originpdf in pdffiles:

    pdf = open(originpdf,'rb')
    pdfreader = PyPDF2.PdfFileReader(pdf)

    if pdfreader.isEncrypted:   #判断加密文件是否被加密
        if pdfreader.decrypt(password):

            print('%s解密成功!'%pdfreader)
            pdfwriter = PyPDF2.PdfFileWriter()
            for pagenum in range(0, pdfreader.numPages):  # PDF复制
                pdfwriter.addPage(pdfreader.getPage(pagenum))

            resultpdf = open(originpdf.split('.')[0] + '_decrypted.pdf', 'wb')  #写入到结果文件中
            pdfwriter.write(resultpdf)
            resultpdf.close()
        else:
            print('解密口令不对!')
2.2定制邀请函,保存为word文档

    有一个txt文件中,每行有一个客人名单,要求写一个程序,定制要求航,每个客人的邀请函占一页(调用分页符)

import docx
from docx.enum.text import WD_ALIGN_PARAGRAPH

guesttxt = open('guests.txt','r')
doc = docx.Document()
name = []
for guestname in guesttxt.readlines():
    if guestname != '\n':
        name.append(guestname)

for guest in name:
    guestname = guest.split('\n')[0]

    para1 = doc.add_paragraph('It would be a pleasure to have the company of')
    para1.style = 'Quote'
    para2 = doc.add_paragraph(guest)
    para3 = doc.add_paragraph('at 11010 Memory Lake on the Evening of')
    para2.style = 'Caption'
    para4 = doc.add_paragraph('April 1st')
    para3.style = 'List'
    para5 = doc.add_paragraph("at 7 o'clock")

    doc.add_page_break()

len = len(doc.paragraphs)
for i in range(0,30):
    doc.paragraphs[i].alignment = WD_ALIGN_PARAGRAPH.CENTER  #全部居中
for j in range(0,30,2):
    doc.paragraphs[j].runs[0].bold = True
doc.save('guests-invatation.docx')

2.3 暴力PDF口令破解程序

    根据提供的dictionary.txt作为字典(全部为大写),要求尝试每个单词的大小写形式(.lower()函数),打印出破解的口令

(这个程序性能时好时坏,不一定能破解出来)

import PyPDF2

f=open('full-dict.txt','w')
dictionary = open('dictionary.txt','r')
list = []
for line in dictionary.readlines():
    if line !='\n':
        line.strip('\n')
        list.append(line)
        list.append(line.lower())
        f.write(line)
        f.write(line.lower())   #将带有大小写的写到一个文件
f.close()
dict = open('full-dict.txt','r')
len = len(list)
i = 1
#打开pdf解密
pdf = open('pdf1.pdf_encrypted.pdf','rb')
pdfreader = PyPDF2.PdfFileReader(pdf)

while True:
    for line in list:
        print("已查询到第%f%%"%(i/len*100))          #打印破解查询进度
        i +=1
        line = line.strip('\n')
        if pdfreader.decrypt(line):
            print("PDF被解密成功,密码为:%s"%line)
            quit()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值