Python自学笔记(六)——处理pdf和word文档_PyPDF2&python-docx
PDF文档
1.从PDF里提取文本
import PyPDF2
pdfflieobj = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\rinex_4.00.pdf','rb') # 使用二进制打开文件,并且保存在pdfflieobj中
pdfReader = PyPDF2.PdfFileReader(pdfflieobj) # 调用该函数,创建pdf的对象
page_number = pdfReader.numPages # 总页数,有返回值
print(page_number) # 120
pageobj_1 = pdfReader.getPage(0) # 第一页,返回一个pageobj_1对象
text_0 = pageobj_1.extractText() # 调用pageobj_1对象的方法,返回该页的字符串
print(text_0)
pdfflieobj.close()
2.解密PDF
import PyPDF2
pdfflieobj = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\误差理论与测量平差基础第3版(武汉大学,密码1498).pdf','rb') # 使用二进制打开文件,并且保存在pdfflieobj中
pdfReader = PyPDF2.PdfFileReader(pdfflieobj) # 调用该函数,创建pdf的对象
print(pdfReader.isEncrypted) # 调用这个函数看一看加密没,结果是True
pdfReader.decrypt('1498') # 输入密码后就可以用了
print(pdfReader.numPages) # 267
3.创建和处理PDF—复制、旋转、叠加、加密
PyPDF2不能将任意文本写进PDF中,仅限于将其他PDF的页面复制、旋转、重叠或者加密。
PyPDF2不允许直接编辑原有的PDF,必须创建一个新的,然后复制过来。
基本的操作流程是:
1.打开一个PDF,获得它的PdfFileReader对象
2.创建一个新的PdfFileWriter对象
3.将页面从PdfFileReader对象复制到PdfFileWriter对象中
4.利用PdfFileWriter对象写入输出的PDF(对象到文件)
对象!=真的文件,要实际生成真的文件,要使用PdfFileWriter对象的write()方法,该方法接受一个普通的file对象,以二进制写的模式打开(‘wb’)。
复制页面
import PyPDF2
pdfflieobj1 = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\误差理论与测量平差基础第3版(武汉大学,密码1498).pdf','rb') # 使用二进制打开文件,并且保存在pdfflieobj中
pdfReader1 = PyPDF2.PdfFileReader(pdfflieobj1) # 调用该函数,创建pdf1的对象
pdfReader1.decrypt('1498') # 输入密码后就可以用了
pdfflieobj2 = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\rinex_4.00.pdf','rb')
pdfReader2 = PyPDF2.PdfFileReader(pdfflieobj2)# 调用该函数,创建pdf2的对象
pdfWriter = PyPDF2.PdfFileWriter()# 调用该函数,创建新的pdf的对象
new_pdf_page_1 = pdfReader2.getPage(0) # 调用该函数,将pdf2的第一页的对象赋给new_pdf_page_1
new_pdf_page_2 = pdfReader2.getPage(0) # 调用该函数,将pdf2的第一页的对象赋给new_pdf_page_2
pdfWriter.addPage(new_pdf_page_1) # 调用该函数,添加相应的页数的对象
pdfWriter.addPage(new_pdf_page_1)
new_pdf_file = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\new_pdf_file.pdf','wb') # 打开一个文件的对象,用二进制方法写入打开
pdfWriter.write(new_pdf_file)
new_pdf_file = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\new_pdf_file.pdf','rb')
new_pdf_file_e = PyPDF2.PdfFileReader(new_pdf_file)
new_pdf_file_page_1 = new_pdf_file_e.getPage(1)
print(new_pdf_file_page_1.extractText())
一些疑问:
1.为啥pdf里有中文是会报错,原因是没什么算法?
2.new_pdf_file_e = PyPDF2.PdfFileReader(new_pdf_file)会提示直接传入Path也可以,还有必要创建new_pdf_file = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\new_pdf_file.pdf','rb')这个对象吗?
旋转页面
import PyPDF2
pdfflieobj2 = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\rinex_4.00.pdf','rb')
pdfReader2 = PyPDF2.PdfFileReader(pdfflieobj2)# 调用该函数,创建pdf2的对象
pdfWriter = PyPDF2.PdfFileWriter()# 调用该函数,创建新的pdf的对象
new_pdf_page_1 = pdfReader2.getPage(0) # 调用该函数,将pdf2的第一页的对象赋给new_pdf_page_1
new_pdf_page_2 = pdfReader2.getPage(1) # 调用该函数,将pdf2的第一页的对象赋给new_pdf_page_2
pdfWriter.addPage(new_pdf_page_1) # 调用该函数,添加相应的页数的对象
pdfWriter.addPage(new_pdf_page_2.rotateClockwise(90)) # 调用该函数,将new_pdf_page_2对象顺时针旋转90度,当然也可以是90度的倍数,rotateCounterClockwise(90)表示逆时针
new_pdf_file = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\new_pdf_file.pdf','wb') # 打开一个文件的对象,用二进制方法写入打开
pdfWriter.write(new_pdf_file)
叠加页面
import PyPDF2
pdfflieobj2 = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\rinex_4.00.pdf','rb')
pdfReader2 = PyPDF2.PdfFileReader(pdfflieobj2)# 调用该函数,创建pdf2的对象
pdfWriter = PyPDF2.PdfFileWriter()# 调用该函数,创建新的pdf的对象
new_pdf_page_1 = pdfReader2.getPage(2) # 调用该函数,将pdf2的第一页的对象赋给new_pdf_page_1
new_pdf_page_1.mergePage(pdfReader2.getPage(31)) # 叠加,返回new_pdf_page_1这个对象
pdfWriter.addPage(new_pdf_page_1) # 调用该函数,添加相应的页数的对象
new_pdf_file = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\new_pdf_file.pdf','wb') # 打开一个文件的对象,用二进制方法写入打开
pdfWriter.write(new_pdf_file)
加密
import PyPDF2
pdfflieobj2 = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\rinex_4.00.pdf','rb')
pdfReader2 = PyPDF2.PdfFileReader(pdfflieobj2)# 调用该函数,创建pdf2的对象
pdfWriter = PyPDF2.PdfFileWriter()# 调用该函数,创建新的pdf的对象
new_pdf_page_1 = pdfReader2.getPage(2) # 调用该函数,将pdf2的第一页的对象赋给new_pdf_page_1
new_pdf_page_1.mergePage(pdfReader2.getPage(31)) # 叠加,返回new_pdf_page_1这个对象
pdfWriter.addPage(new_pdf_page_1) # 调用该函数,添加相应的页数的对象
pdfWriter.encrypt('11') # 加密
new_pdf_file = open('F:\\pythonProject\\PROJECT10_PDF&WORD\\new_pdf_file.pdf','wb') # 打开一个文件的对象,用二进制方法写入打开
pdfWriter.write(new_pdf_file)
Word文档
1.读取word文档
Word里的文本不仅仅是字符串,还是字体,大小的组合,在word里,一个run对象就是相同样式文本的延续。每当样式发生变化时,run就是一个新的对象。
import docx # 这里安装的是python-docx模块
doc = docx.Document('homework.docx') # 打开一个文件,返回该文件的对象
print(len(doc.paragraphs)) # 5
print(doc.paragraphs[0].text) # 第五次作业
print(doc.paragraphs[1].text) # 一、第一个观测量有周跳吗?
print(len(doc.paragraphs[0].runs)) # 5
print(doc.paragraphs[1].runs[0].text) # 一、第一个观测量有周跳吗?
2.从word里提取完整的文本
import docx
def getText(filename):
'''获取所有文档'''
doc = docx.Document(filename)
fulltext = []
for para in doc.paragraphs:
fulltext.append(para.text)
return '\n'.join(fulltext)
print(getText('homework.docx'))
# 第五次作业
# 一、第一个观测量有周跳吗?
# 二、周跳的值时整数还是实数?
# 三、LAMBDA方法的搜索对象时双差模糊度、单差模糊度还是非差模糊度?
# 四、影响整周模糊度搜索成果的因素有哪些?
3.设置paragraph和run对象
对于word文档,有三种类型的样式:
1-段落样式,对应于Paragraph对象
2-字符样式,对应于Run对象
3-链接的样式,可以对应于以上两种样式
可以将Paragraph对象和Run对象的style属性设置为一个字符串,从而设置样式。
4.Run属性
通过text属性,Run可以进一步设置样式。每个属性被设置为3个值之一:True-该属性总是启用,False-该属性总是禁用,None-默认使用该Run对象被设置的任何属性。
import docx
doc = docx.Document('homework1.docx')
doc.paragraphs[1].runs[0].bold = True
doc.save('homework2.docx')
常见的text属性:
Bold,文本加粗
italic,文本倾斜
underline,文本带下划线
strike,文本带删除线
double_strike,文本带双删除线
5.写入word文档
import docx
doc = docx.Document()
doc.add_paragraph('hello')
p2 = doc.add_paragraph('your')
p2.add_run('name')
doc.save('1.docx')
6.添加不同级别的标题
import docx
doc = docx.Document()
doc.add_paragraph('hello')
p2 = doc.add_paragraph('your')
p2.add_run('name')
doc.add_heading('header0',0) # 一级标题
doc.add_heading('header1',1)
doc.save('1.docx')
7.添加换行符和换页符
import docx
doc = docx.Document()
doc.add_paragraph('hello')
p2 = doc.add_paragraph('your')
p2.add_run('name')
p2.runs[1].add_break() # 添加换行符
p3 = doc.add_paragraph('is bob.')
p3.runs[0].add_break(docx.enum.text.WD_BREAK.PAGE) # docx.enum.text.WD_BREAK.PAGE作为唯一参数,添加换页符
doc.save('1.docx')
8.添加图像
import docx
doc = docx.Document()
doc.add_paragraph('hello')
p2 = doc.add_paragraph('your')