15.1:PDF文档
15.1.1:从PDF提取文本
import PyPDF2
pdfFileObj = open("meetingminutes.pdf", 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
print(pdfReader.numPages)
pageObj = pdfReader.getPage(0)
print(pageObj.extractText())
以二进制模式打开文件,然后将他传入PdfFileReader()中得到它的PdfFileReader对象
PdfFileReader的namePages属性:获取PDF共有几页
PdfFileReader的getPage()函数:获取传入页号中的页面信息(索引从0开始)
extractText()函数:放回改文本页的字符串。提取文本信息但并不完美
15.1.2:解密PDF
import PyPDF2
pdfReader = PyPDF2.PdfFileReader(open('encrypted.pdf', 'rb'))
print(pdfReader.isEncrypted)
print(pdfReader.decrypt('rosebud'))
PdfFileReader的isEncrypted属性:判断PDF是否加密,是返回True,否则False
PdfFileReader的decrypt()函数:传入口令字符串进行解密,如果加密文件没有调用这个函数在调用getPage()函数就会报错,并且该函数只解密了PdfFileReader对象,不是实际的PDF文档。
15.1.3:创建PDF
与PdfFileReader对象相对的PdfFileWriter对象,它可以创建一个新的PDF文档,但不能将任意的文本写入PDF,不像python可以写入纯文本文件,能力仅限于从其他PDF中复制页面、旋转页面、重叠页面和加密页面,不允许直接编辑PDF。
- 打开一个或多个已有的PDF,得到PdfFileReader对象
- 创建一个新的PdfFileWrite对象
- 将页面从PdfFileReader对象复制到PdfFileWrite对象中
- 利用PdfFileWrite对象写入输出的PDF
复制页面
import PyPDF2
pdf1File = open('meetingminutes.pdf', 'rb')
pdf2File = open('meetingminutes2.pdf', 'rb')
pdf1Reader = PyPDF2.PdfFileReader(pdf1File)
pdf2Reader = PyPDF2.PdfFileReader(pdf2File)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdf1Reader.numPages):
pdfObj = pdf1Reader.getPage(pageNum)
pdfWriter.addPage(pdfObj)
for pageNum in range(pdf2Reader.numPages):
pdfObj = pdf2Reader.getPage(pageNum)
pdfWriter.addPage(pdfObj)
pdfOutputFile = open('combinedminutes.pdf', 'wb')
pdfWriter.write(pdfOutputFile)
pdfOutputFile.close()
pdf1File.close()
pdf2File.close()
PdfFileWrite的addPage()函数:将数据传递给PdfFileWrite对象
PdfFileWrite的write()函数:将对象中的数据写入到文件中
旋转页面
import PyPDF2
minutesFile = open('meetingminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)
page = pdfReader.getPage(0)
page.rotateClockwise(90)
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(page)
resultPdfFile = open('rotatedPage.pdf', 'wb')
pdfWriter.write(resultPdfFile)
minutesFile.close()
resultPdfFile.close()
rotateClockwise()和rotateCounterClockwise()函数可以用旋转文档页面,rotateClockwise()是顺时针rotateCounterClockwise()是逆时针。
叠加页面
import PyPDF2
minutesFile = open('meetingminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)
minutesFirstPage = pdfReader.getPage(0)
pdfWatermarkReader = PyPDF2.PdfFileReader(open('watermark.pdf', 'rb'))
minutesFirstPage.mergePage(pdfWatermarkReader.getPage(0))
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(minutesFirstPage)
for pageNum in range(1, pdfReader.numPages):
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
resultPdfFile = open('watermarkedCover.pdf', 'wb')
pdfWriter.write(resultPdfFile)
minutesFile.close()
resultPdfFile.close()
mergePage()函数:将两张PDF页面合并到一起,传入的参数的PDF文档一般是公司的标志等等。
加密PDF
import PyPDF2
pdfFile = open('meetingminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdfReader.numPages):
pdfWriter.addPage(pdfReader.getPage(pageNum))
pdfWriter.encrypt('swordfish')
resultPdf = open('encryptedminutes.pdf', 'wb')
pdfWriter.write(resultPdf)
pdfFile.close()
resultPdf.close()
encrypt()函数:传入字符串,将字符串作为文件的加密口令
15.2:项目:从多个PDF中合并选择的页面
第一步:找到所有PDF
第二步:打开每个PDF文档
第三步:添加每一页
第四步:保存结果
import PyPDF2, os
pdfFiles = []
for filename in os.listdir('.'):
if filename.endswith('.pdf'):
pdfFiles.append(filename)
pdfFiles.sort(key=str.lower)
pdfWriter = PyPDF2.PdfFileWriter()
for filename in pdfFiles:
pdfFileObj = open(filename, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
if not pdfReader.isEncrypted:
for pageNum in range(1, pdfReader.numPages):
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
pdfFileObj.close()
pdfOutput = open('allminutes.pdf', 'wb')
pdfWriter.write(pdfOutput)
pdfOutput.close()
15.3:Word文档
安装python-docx模块
pip install --user -U python-docx
?注意要安装python-docx而不是docx,但在导入时需要执行import docx
15.3.1:读取Word文档
import docx
doc = docx.Document('demo.docx')
print(len(doc.paragraphs))
print(doc.paragraphs[0].text)
print(len(doc.paragraphs[1].runs))
print(doc.paragraphs[1].runs[0].text)
Document:表示整个文档
paragraphs:表示文档中的段落
runs:每个paragraphs对象都至少包含一个Run对象的列表,它表示一段样式相同的数据
15.6.2:从docx文档中取出完整的文本
import docx
doc = docx.Document('demo.docx')
fullText = []
for para in doc.paragraphs:
fullText.append(para.text)
print('\n'.join(fullText))
15.3.3:设置Paragraph和Run样式
对Paragraph设置样应该使用:Paragraph[**].style = '? ** '
对Run设置runs[**].style = ' ** '
15.3.4:创建带有非默认样式的Word文档
15.3.5:Run属性
属性 | 描述 |
---|
bold | 文本以粗体出现 | italic | 文本以斜体出现 | underlin | 文本带下划线 | strike | 文本带删除线 | double_strike | 文本带双删除线 | all_caps | 文本以大写字母出现 | small_caps | 文本以大写字母出现,但大小与小写字母一样 | shadow | 文本带阴影 | outline | 文本以轮廓线出现,而不是以实心出现 | rtl | 文本从右到左书写 | imprint | 文本以刻入页面的方式出现 | emboss | 文本以凹出页面的方式出现 |
import docx
doc = docx.Document('demo.docx')
print(doc.paragraphs[0].text)
doc.paragraphs[0].style = 'Normal'
doc.paragraphs[1].runs[0].style = 'QuoteChar'
doc.paragraphs[1].runs[1].underline = True
doc.save('restyled.docx')
15.3.6:写入Word文档
import docx
doc = docx.Document()
doc.add_paragraph('Hello World')
paraObj1 = doc.add_paragraph('This is a second paragraphs.')
paraObj2 = doc.add_paragraph('This is a yet another paragraphs.')
paraObj1.add_run('This text is being added to the second paragraphs.')
doc.save('multipleParagraphs.docx')
add_paragraph()函数将一段新文本添加到文档中,只能添加到文档末尾。
add_run()函数:将一段文本添加到paragraph对象中,只能添加在paragraph对象末尾。
15.3.7:添加标题
import docx
doc = docx.Document()
doc.add_heading('Header 0', 0)
doc.add_heading('Header 1', 1)
doc.add_heading('Header 2', 2)
doc.add_heading('Header 3', 3)
doc.add_heading('Header 4', 4)
doc.save('headings.docx')
add_heading()函数添加一个段落,并使用一种标题样式,参数是一个标题文本的字符串和一个0到4的整数
15.3.8:添加换行符和换页符
import docx
from docx import Document
doc = docx.Document()
doc.add_paragraph('This is on the first page!')
doc.add_page_break()
doc.add_paragraph('This is on the second page!')
doc.save('twoPage.docx')
add_page_break()函数:添加换页符
15.3.9:添加图像
import docx
doc = docx.Document()
doc.add_paragraph('This is cat')
doc.add_picture('zophie.png')
doc.save('twoPage.docx')
add_picture()函数可以在文档末尾添加图像,可选的width和height关键参数设置图像在文档的宽度和高度
15.4:从Word文档中创建PDF
pip install --user --U pywin32==224
?比较高的版本安装不了需要下载后导入
import docx
import win32.client
wordFilename = 'your_word_document.docx'
pdfFilename = 'your_pdf_filename.pdf'
doc = docx.Document()
doc.save(wordFilename)
wdFormatPDF = 17
wordObj = win32com.client.Dispatch('Word.Application')
docObj = wordObj.Documents.Open(wordFilename)
docObj.SaveAs(pdfFilename, FileFormat=wdFormatPDF)
docObj.Close()
wordObj.Quit()
|