Python自学笔记(六)——处理pdf和word文档_PyPDF2&python-docx

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