python读写word、pdf文档
處理PDF和Word文檔
用于處理PDF的模塊是PyPDF2。
處理Word文檔是python-docx模塊,要安裝python-docx,但是導(dǎo)入模塊時是寫import docx。
1.從PDF提取文本
import PyPDF2 pdfFileObj = open('meetingminutes.pdf','rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj)pdfReader.numPages >> 19 pageObj = pdfReader.getPage(0) pageObj.extractText() >> 'OOFFFFIICCIIAALL BBOOAARRDD MMIINNUUTTEESS Meeting of \nMarch 7\n, 2014\n \n The Board of Elementary and Secondary Education shall provide leadership and \ncreate policies for education that expand opportunities for children, empower \nfamilies and communities, and advance Louisiana in an increasingly \ncompetitive glob\nal market.\n BOARD \n of ELEMENTARY\n and \n SECONDARY\n EDUCATION\n ' 1.1PDFDocument方式 path = 'E:\論文\aaa_673671154.pdf'from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfpage import PDFPage from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams from pdfminer.pdfpage import PDFTextExtractionNotAlloweddef parse(Path):parser = PDFParser(Path)document = PDFDocument(parser)if not document.is_extractable:raise PDFTextExtractionNotAllowedelse:rsrcmgr = PDFResourceManager()laparams = LAParams()device = PDFPageAggregator(rsrcmgr, laparams=laparams)interpreter = PDFPageInterpreter(rsrcmgr, device)for page in PDFPage.create_pages(document):interpreter.process_page(page)layout = device.get_result()for x in layout:if isinstance(x, LTTextBoxHorizontal):print(x.get_text())if __name__ == '__main__':Path = open(path, 'rb')parse(Path)2.解密PDF
某些PDF文檔有加密功能,以防止別人閱讀,只有在打開文檔前時提供口令后才能閱讀。
import PyPDF2 pdfFile = open('encrypted.pdf','rb') pdfReader = PyPDF2.PdfFileReader(pdfFile)#返回True說明時加密的PDF pdfReader.isEncrypted >>True #調(diào)用decrypt()函數(shù),傳入口令字符串,返回1說明口令正確,之后就可以進(jìn)行讀取操作了 pdfReader.decrypt('rosebud') >> 1 pdfReader.getPage(0).extractText() >> 'OOFFFFIICCIIAALL BBOOAARRDD MMIINNUUTTEESS Meeting of \nMarch 7\n, 2014\n \n The Board of Elementary and Secondary Education shall provide leadership and \ncreate policies for education that expand opportunities for children, empower \nfamilies and communities, and advance Louisiana in an increasingly \ncompetitive glob\nal market.\n BOARD \n of ELEMENTARY\n and \n SECONDARY\n EDUCATION\n '注意:decrypt()函數(shù)只解密了PdfFileReader對象,而不是實(shí)際的PDF文件。在程序中止后,硬盤上的文件仍然是加密的。程序下次運(yùn)行時,仍然需要再次調(diào)用decrypt()。
3.創(chuàng)建PDF
PdfFilewWrite對象可以創(chuàng)建一個新的PDF文件。但PyPDF2不能將任意文本寫入PDF,PyPDF2寫入PDF的能力,僅限于從其他PDF中拷貝頁面、旋轉(zhuǎn)頁面、重疊頁面和加密文件。
模塊不允許直接編輯PDF。必須創(chuàng)建一個新的PDF,然后從已有的文檔拷貝內(nèi)容。
import PyPDF2 #打開PDF,創(chuàng)建File對象,還有創(chuàng)建PdfFileReader對象,從打開的PDF中讀取數(shù)據(jù) pdf1File = open('meetingminutes.pdf','rb') pdf2File = open('meetingminutes2.pdf','rb') pdf1Reader = PyPDF2.PdfFileReader(pdf1File) pdf2Reader = PyPDF2.PdfFileReader(pdf2File)#PdfFileWriter對象,表示一個空白的PDF文檔,可以往里面寫數(shù)據(jù) pdfWriter = PyPDF2.PdfFileWriter()#通過頁面循環(huán)寫入到pdfWriter對象中,pdf1Reader.getPage(pageNum)返回的就是該頁面的內(nèi)容 for pageNum in range(pdf1Reader.numPages):pageObj = pdf1Reader.getPage(pageNum)pdfWriter.addPage(pageObj) for pageNum in range(pdf2Reader.numPages):pageObj = pdf2Reader.getPage(pageNum)pdfWriter.addPage(pageObj)#通過open()新建一個PDF文檔,然后把pdfWriter的內(nèi)容寫入到pdfOutputFile中。 pdfOutputFile = open('combineminutes.pdf','wb') pdfWriter.write(pdfOutputFile) pdfOutputFile.close() pdf1File.close() pdf2File.close()遵循的一般方式是:
注意:?
1.創(chuàng)建一個PdfFileWriter對象,只是在Python中創(chuàng)建一個代表PDF文檔的值,這并沒有創(chuàng)建實(shí)際的PDF文件,要實(shí)際生成文件,必須調(diào)用PdfFileWriter對象的write()方法。?
2.write()方法接受一個普通的File對象,它以寫二進(jìn)制的模式打開。你可以用兩個參數(shù)調(diào)用Python的open()函數(shù),得到這樣的File對象:一個是要打開的PDF文件名字字符串,一個是’wb’,表示文件應(yīng)該是以寫二進(jìn)制的模式打開。
3.疊加PDF頁面
PyPDF2也可以將一頁的內(nèi)容疊加到另一頁上,這可以用來在頁面上添加公司標(biāo)志、時間戳或水印。
import PyPDF2 minutesFile = open('meetingminutes.pdf','rb') watermarkFile = open('watermark.pdf','rb') pdfReader = PyPDF2.PdfFileReader(minutesFile) #取得第一頁的Page對象,并將它保存在minutesFirstPage中 minutesFirstPage = pdfReader.getPage(0) pdfWaterReader = PyPDF2.PdfFileReader(watermarkFile) #并在minutesFisrtPage上調(diào)用mergePage(),傳遞的參數(shù)是watermark.pdf第一頁的Page對象,這樣minutesFirstPage就代表加了水印的第一頁 minutesFirstPage.mergePage(pdfWaterReader.getPage(0))#創(chuàng)建PdfFileWriter對象,用來把新的形成內(nèi)容輸出到該對象上,最后再把所有的內(nèi)容利用wirte()輸出到open()創(chuàng)建的pdf文件上面 pdfWriter = PyPDF2.PdfFileWriter() #添加內(nèi)容,一個只含(水印+第一頁)的pdf pdfWriter.addPage(minutesFirstPage)#循環(huán)遍歷,添加meetingminutes.pdf的剩余頁面,添加到pdfWrite中 for pageNum in range(1,pdfReader.numPages):pageObj = pdfReader.getPage(pageNum)pdfWriter.addPage(pageObj)#要實(shí)際生成文件,必須調(diào)用PdfFileWriter對象的write()方法。首先使用open()函數(shù)生成一個新的pdf文檔 resultPdfFile = open('watermarkedCover.pdf','wb') pdfWriter.write(resultPdfFile)minutesFile.close() watermarkFile.close() resultPdfFile.close()4.加密PDF
PdfFileWriter對象也可以為PDF文檔進(jìn)行加密。
import PyPDF2 pdfFile = open('meetingminutes.pdf','rb') pdfReader = PyPDF2.PdfFileReader(pdfFile)pdfWriter = PyPDF2.PdfFileWriter()#我們將meetingminutes.pdf的頁面拷貝到PdfFIleWriter對象 for pageNum in range(pdfReader.numPages):pageObj = pdfReader.getPage(pageNum)pdfWriter.addPage(pageObj)#用口令swordfish加密了PdfFileWriter對象 pdfWriter.encrypt('swordfish') #打開了一個名為encryptminutes.pdf的新PDF,將PdfFileWriter的內(nèi)容寫入新的PDF resultPdf = open('encryptminutes.pdf','wb') pdfWriter.write(resultPdf)resultPdf.close()5.Word文檔
利用python-docx模型,Python可以創(chuàng)建和修改Word文檔,它帶有.docx文件擴(kuò)展名。?
安裝時是安裝python-docx,但是導(dǎo)入時是import docx。
Document對象表示整個文檔。Document對象包含一個Paragraph對象的列表,代表文檔中的段落(用戶再Word文檔中輸入時,如果按下回車,新的段落就開始了)。每個Paragraph對象都包含一個Run對象的列表。
Word文檔中的文本不僅僅是字符串。它包含與之相關(guān)的字體、大小、顏色和其他樣式信息。?
在Word中,樣式是這些屬性的集合。?
一個Run對象是相同樣式文本的延續(xù)。當(dāng)文本樣式發(fā)生改變時,就需要一個新的Run對象。
6.讀取Word文檔
import docx #打開demo.docx文檔,返回一個Document對象,它有paragraphs屬性,時Paragraph對象的列表。 doc = docx.Document('demo.docx')len(doc.paragraphs) >> 7doc.paragraphs[0].text >> 'Document Title'doc.paragraphs[1].text >> 'A plain paragraph with some bold and some italic'#每個Paragraph對象也有一個runs屬性,它是Run對象的列表。 len(doc.paragraphs[1].runs) >> 5#Run對象也有一個text屬性,包含那個延續(xù)的文本 doc.paragraphs[1].runs[0].text >> 'A plain paragraph with'7.從.docx文件中取得完整的文本
如果你只關(guān)心Word文檔的文本,不關(guān)心樣式信息,就可以利用getText()函數(shù)。?
它接受一個.docx文件名,返回其中文本的字符串。
8.設(shè)置Paragraph和Run對象的樣式
對于Word文檔,有3種類型的樣式:1.段落樣式可以應(yīng)用于Paragraph對象;2.字符樣式可以應(yīng)用于Run對象;3.鏈接的樣式可以應(yīng)用于這兩種對象。
可以將Paragraph和Run對象的style屬性設(shè)置為一個字符串,從而設(shè)置樣式。如果style屬性被設(shè)置為None,就沒有樣式于Paragraph或Run對象關(guān)聯(lián)。
在設(shè)置style屬性時,不要在樣式名稱中使用空格。例如,樣式名稱可能時Subtle Emphasis,你應(yīng)該將屬性設(shè)置為字符串’SubtleEmphasis’。
如果對Run對象應(yīng)用鏈接的樣式,需要在樣式名稱末尾加上’Char’。例如,對于Paragraph對象設(shè)置Quote鏈接的樣式,應(yīng)該使用paragraphObj.style=’Quote’。但對于Run對象,應(yīng)該使用runObj.style=’QuoteChar’。
9.Word的Run屬性
通過text屬性,Run可以進(jìn)一步設(shè)置樣式。
每個屬性都可以被設(shè)置為3個值之一:True(該屬性總是啟用,不論其他樣式是否應(yīng)用于Run)、False(該屬性總是禁用)或None(默認(rèn)使用該Run被設(shè)置的任何屬性)。
Run對象的text屬性:bold、italic、underline、strike、double_strike、all_caps等等。
import docxdoc = docx.Document('demo.docx')doc.paragraphs[0].text >> 'Document Title' doc.paragraphs[0].style >> 'Title'doc.paragraphs[0].style = 'Normal' doc.paragraphs[1].runs[0].style = 'QuoteChar' doc.paragraphs[1].runs[1].underline = True doc.paragraphs[1].runs[3].underline = Truedoc.save('restyle.docx')10.寫入Word文檔
要創(chuàng)建自己的.docx文件,就調(diào)用docx.Document,返回一個新的、空白的Word Document對象。
Document對象的add_paragraph()方法將一段新文本添加到文檔中,并返回添加的Paragraph對象的引用。
在添加文本之后,向Document對象的save()方法傳入一個文件名字符串,將Document對象保存到文件。
import docxdoc = docx.Document() doc.add_paragraph('Hello world!')doc.save('helloworld.docx')我們可以用add_paragraph()方法,添加段落。?
我們還可以使用add_run()方法,向已有段落的末尾添加文本。
add_paragraph()和add_run()分別返回Paragraph和Run對象。
add_paragraph()和add_run()都接受可選的第二個參數(shù),它是表示Paragraph或Run對象樣式的字符串。例如:
doc.add_paragraph('Hello World!','Title')11.添加標(biāo)題、換行符、換頁符和添加圖片
添加標(biāo)題:
調(diào)用add_heading()將添加一個段落,并使用一種標(biāo)題樣式。add_heading()的參數(shù),是一個標(biāo)題文本的字符串,以及一個從0到4的整數(shù)。整數(shù)0表示標(biāo)題時Title樣式,這用于文檔的頂部。整數(shù)1到4是不同標(biāo)題層次,1是主要的標(biāo)題,4是最底層的子標(biāo)題。
import docxdoc = 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')添加換行符、換頁符:
要添加換行符(而不是開始一個新的段落),可以在Run對象上調(diào)用add_break()方法,換行符將出現(xiàn)在它后面。
如果希望添加換頁符,可以將docx.text.WD_BREAK.PAGE作為唯一的參數(shù),傳遞給add_break()。
import docxdoc = docx.Document() doc.add_paragraph('This is on the first page!')#換行符,在第一行后面添加換行符 doc.paragraphs[0].runs[0].add_break()doc.add_paragraph('This is on the second page!') #換頁符,在第二行后面添加換頁符 doc.paragraphs[1].runs[0].add_break(docx.enum.text.WD_BREAK.PAGE)doc.add_paragraph('This is on the third page!') doc.save('fourPage.docx')添加圖像
import docxdoc = docx.Document() doc.add_picture('zophie.png',width=docx.shared.Inches(1),height=docx.shared.Cm(4)) doc.save('pic.docx')寬度為1英寸,高度為4厘米(Word可以同時使用英制和公制單位)。
你可能愿意用熟悉的單位來指定圖像的高度和寬度,諸如英寸或厘米。所以在指定width和height關(guān)鍵字參數(shù)時,可以使用docx.shared.Inches()和docx.shared.Cm()函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的python读写word、pdf文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸿蒙开发初体验
- 下一篇: Python可视化:绘制折线图、设置线条