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()