使用Python操作PDF文件
從PDF讀取文本內(nèi)容和從已經(jīng)有的文檔生成新的PDF。
需要用到的模塊是PyPDF2.
mstamy2/PyPDF2: A utility to read and write PDFs with Python (github.com)
同時(shí),還要關(guān)注較新的PyPDF4包,因?yàn)樗芸炀蜁?huì)取代PyPDF2。
claird/PyPDF4: A utility to read and write PDFs with Python (github.com)
也可以看看pdfrw包,它也可以執(zhí)行許多與PyPDF2相同的操作。
pmaupin/pdfrw: pdfrw is a pure Python library that reads and writes PDFs (github.com)
首先安裝PyPDF2,在命令行中運(yùn)行,由于PyPDF2沒有任何依賴,因此安裝非??臁?/p>
pip install PyPDF2
操作方法
1、從PDF讀取文本
PyPDF2無(wú)法從pdf文檔中提取圖像,圖表和其他媒體,但是它可以提取文本,并且將文本返回為python字符串。
import PyPDF2 # ===============從pdf中提取文本=========== pdffile = open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\meetingminutes.pdf', 'rb') # 讀取pdf文件 pdfreader = PyPDF2.PdfFileReader(pdffile) # 讀入到 print(pdfreader.numPages) # 讀取pdf頁(yè)數(shù)======19

獲取第一頁(yè)的內(nèi)容:
page0 = pdfreader.getPage(0) #獲取第1頁(yè),第一頁(yè)是0 print(page0.extractText()) # 獲取第2頁(yè)的內(nèi)容,返回的是字符串
內(nèi)容是

2、解密PDF
某些文檔有加密功能,為了防止別人閱讀,只有在打開文檔的時(shí)候提供口令才能閱讀。我打開的文件的加密口令是rosebud.
其實(shí)在讀取一個(gè)pdf文件是首先應(yīng)該確定它是否加密了。如果加密,isEncrypted屬性就會(huì)返回True.此時(shí)就需要口令了。
# 某些pdf文件是加密的,防止別人閱讀的,只有打開文檔的時(shí)候提供口令才能閱讀 pdf_reader = PyPDF2.PdfFileReader(open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\encrypted.pdf','rb')) print(pdf_reader.isEncrypted) # 文件是否加密
返回的結(jié)果是:

如果這時(shí)候不輸入口令就獲取內(nèi)容的話。
print(pdf_reader.getPage(0)) # PyPDF2.utils.PdfReadError: file has not been decrypted 文件還沒有解鎖
會(huì)提示出現(xiàn)錯(cuò)誤。

此時(shí)調(diào)用decrypt方法,輸入口令,再讀取就可以啦。
print(pdf_reader.decrypt('rosebud')) # rosebud==正確口令顯示1,其他顯示0
page_obj = pdf_reader.getPage(0) # 這樣才能正確讀取
print(page_obj.extractText())3、創(chuàng)建PDF
PyPDF2可以創(chuàng)建一個(gè)新的PDF文件,但是不能將任何文本寫入到PDF。其寫入PDF的能力,僅限于從其他PDF中拷貝頁(yè)面、旋轉(zhuǎn)頁(yè)面、重疊頁(yè)面和加密文件。后面一一介紹。
4、拷貝頁(yè)面
# ==========拷貝頁(yè)面==============
pdffile1 = open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\meetingminutes.pdf', 'rb')
pdffile2 = open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\meetingminutes2.pdf', 'rb')
pdf1_reader = PyPDF2.PdfFileReader(pdffile1)
pdf2_reader = PyPDF2.PdfFileReader(pdffile2)
# 創(chuàng)建一個(gè)pdf文檔,這個(gè)只是代表pdf文檔的值,并沒有創(chuàng)建實(shí)際的文檔。
pdf_writer = PyPDF2.PdfFileWriter()
# 將文檔一頁(yè)一頁(yè)的讀入到新的文檔
for pagenum in range(pdf1_reader.numPages):
pageobj = pdf1_reader.getPage(pagenum)
pdf_writer.addPage(pageobj)
for pagenum in range(pdf2_reader.numPages):
pageobj = pdf2_reader.getPage(pagenum)
pdf_writer.addPage(pageobj)
# write方法才能真正生成一個(gè)文件
pdfoutputfile = open('combin.pdf','wb')
pdf_writer.write(pdfoutputfile)
pdfoutputfile.close()
pdffile1.close()
pdffile2.close()在對(duì)應(yīng)目錄下生成pdf文件

5、旋轉(zhuǎn)頁(yè)面
利用rotateClockwise()和rotateCounterClockwise()方法PDF頁(yè)面可以旋轉(zhuǎn)90的整倍數(shù)。
pdffile1 = open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\meetingminutes.pdf', 'rb')
pdfreaders = PyPDF2.PdfFileReader(pdffile1)
page = pdfreaders.getPage(0) # 獲取第一頁(yè)
page.rotateClockwise(90) # 第一頁(yè)旋轉(zhuǎn)90度
# 創(chuàng)建一個(gè)新的PDF文檔
pdfwriter = PyPDF2.PdfFileWriter()
# 添加內(nèi)容
pdfwriter.addPage(page)
# 真實(shí)創(chuàng)建PDF文件并寫入內(nèi)容
result = open('ratated.pdf','wb')
pdfwriter.write(result)
# 關(guān)閉文件
result.close()
pdffile1.close()點(diǎn)擊開PDF文檔,結(jié)果是:

6、疊加頁(yè)面
有的時(shí)候需要在PDF中添加公司的標(biāo)志、時(shí)間戳或水印。我們用這個(gè)庫(kù)依然可以實(shí)現(xiàn)。
# 給指定的頁(yè)面添加水印、公司標(biāo)志或者時(shí)間戳。 pdffile1 = open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\meetingminutes.pdf', 'rb') pdf_reader1 = PyPDF2.PdfFileReader(pdffile1) # 獲取該文檔的第一頁(yè) first_page = pdf_reader1.getPage(0) # 打開印有水印的PDF文件 water_pdf = PyPDF2.PdfFileReader(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\watermark.pdf', 'rb') # 在上一個(gè)文檔的第一頁(yè)中加入這個(gè)有水印的文件 first_page.mergePage(water_pdf.getPage(0)) # 將讀取的內(nèi)容寫入到對(duì)象中 pdfwriter = PyPDF2.PdfFileWriter() pdfwriter.addPage(first_page)
結(jié)果是:

7、加密PDF
我們可以對(duì)拷貝的頁(yè)面進(jìn)行加密。
pdffile1 = open(r'E:\python讓繁瑣的工作自動(dòng)化\13_處理pdf和word文檔\data\meetingminutes.pdf', 'rb')
pdf_reader1 = PyPDF2.PdfFileReader(pdffile1)
# 將讀取的內(nèi)容寫入對(duì)象中
pdfwriter = PyPDF2.PdfFileWriter()
for pagenum in range(pdf_reader1.numPages):
pdfwriter.addPage(pdf_reader1.getPage(pagenum))
# 輸入口令
pdfwriter.encrypt('meimei')
# 真正創(chuàng)建PDF文件
result_pdf = open('encry.pdf','wb')
pdfwriter.write(result_pdf)
# 關(guān)閉文件
result_pdf.close()點(diǎn)擊生成的PDF文件。

輸入密碼才可以打開。
到此這篇關(guān)于Python操作PDF文件的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)自動(dòng)更換ip的方法
這篇文章主要介紹了python實(shí)現(xiàn)自動(dòng)更換ip的方法,涉及Python針對(duì)本機(jī)網(wǎng)絡(luò)配置的相關(guān)操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
Python OpenCV學(xué)習(xí)之圖形繪制總結(jié)
在圖像的任務(wù)中,不管是圖像檢測(cè)還是圖像識(shí)別,我們都需要通過繪制圖形和繪制文字對(duì)處理的結(jié)果進(jìn)行說明,本篇就詳細(xì)介紹下OpenCV中的圖形的繪制,感興趣的可以了解一下2022-01-01
PHP網(wǎng)頁(yè)抓取之抓取百度貼吧郵箱數(shù)據(jù)代碼分享
本文給大家介紹PHP網(wǎng)頁(yè)抓取之抓取百度貼吧郵箱數(shù)據(jù)代碼分享,程序?qū)崿F(xiàn)了一鍵抓取帖子全部郵箱和分頁(yè)抓取郵箱兩個(gè)功能,感興趣的朋友一起學(xué)習(xí)吧2016-04-04

