Python自動化辦公系列之Python操作PDF
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
輸
作者介紹:
大家可以叫我黃同學(博客名:Huang Supreme),一個應用統(tǒng)計碩士,愛好寫一些技術(shù)博客,志在用通俗易懂的寫作風格,幫助大家學到知識,學好知識!
【作者導語】本文是鑒于有些粉絲的工作需求,有時候需要遇到這些文件的處理。因此,我寫了一個文章集合,供大家參考。全篇包括三個章節(jié),分別為:Python使用openpyxl操作excel、python使用PyPDF2和pdfplumber操作pdf、python使用python-docx操作word。本篇為第二章節(jié)。
本章目錄
章節(jié)二
? python使用PyPDF2和pdfplumber操作pdf?????
???
1、PyPDF2和pdfplumber庫介紹 ????
2、python提取PDF文字內(nèi)容 ???????
? ?1)利用pdfplumber提取文字 ???????
? ?2)利用pdfplumber提取表格并寫入excel ????
3、PDF合并及頁面的排序和旋轉(zhuǎn) ???????
? ?1)分割及合并pdf ?????????
? ? ? ?① 合并pdf ?????????
? ? ? ??② 拆分pdf ???????
? ?2)旋轉(zhuǎn)及排序pdf ?????????
? ? ? ?① 旋轉(zhuǎn)pdf ?????????
? ? ? ? ② 排序pdf ????
4、pdf批量加水印及加密、解密 ???????
? ?1)批量加水印 ???????
? ?2)批量加密、解密 ?????????
? ? ? ?① 加密pdf ?????????
? ? ? ? ② 解密pdf并保存為未加密的pdf?
上下滾動查看更多
章節(jié)二:python使用PyPDF2和pdfplumber操作pdf
1、PyPDF2和pdfplumber庫介紹
PyPDF2官網(wǎng):PyPDF2官網(wǎng)?(https://pythonhosted.org/PyPDF2/),可以更好的讀取、寫入、分割、合并PDF文件; pdfplumber官網(wǎng):pdfplumber官網(wǎng)(https://github.com/jsvine/pdfplumber),可以更好地讀取PDF文件內(nèi)容和提取PDF中的表格; 這兩個庫不屬于python標準庫,都需要單獨安裝;
2、python提取PDF文字內(nèi)容
1)利用pdfplumber提取文字
import?PyPDF2
import?pdfplumber
with?pdfplumber.open("餐飲企業(yè)綜合分析.pdf")?as?p:
????page?=?p.pages[2]
????print(page.extract_text())
結(jié)果如下:
2)利用pdfplumber提取表格并寫入excel
extract_table():如果一頁有一個表格; extract_tables():如果一頁有多個表格;
import?PyPDF2
import?pdfplumber
from?openpyxl?import?Workbook
with?pdfplumber.open("餐飲企業(yè)綜合分析.pdf")?as?p:
????page?=?p.pages[4]
????table?=?page.extract_table()
????print(table)
????
????workbook?=?Workbook()
????sheet?=?workbook.active
????for?row?in?table:
????????if?not?"".join()?==?""
????????????sheet.append(row)
????workbook.save(filename?=?"新pdf.xlsx")
結(jié)果如下:
缺陷:可以看到,這里提取出來的表格有很多空行,怎么去掉這些空行呢?判斷:將列表中每個元素都連接成一個字符串,如果還是一個空字符串那么肯定就是空行。
import?PyPDF2
import?pdfplumber
from?openpyxl?import?Workbook
with?pdfplumber.open("餐飲企業(yè)綜合分析.pdf")?as?p:
????page?=?p.pages[4]
????table?=?page.extract_table()
????print(table)
????
????workbook?=?Workbook()
????sheet?=?workbook.active
????for?row?in?table:
????????if?not?"".join([str(i)?for?i?in?row])?==?"":
????????????sheet.append(row)
????workbook.save(filename?=?"新pdf.xlsx")
結(jié)果如下:
3、PDF合并及頁面的排序和旋轉(zhuǎn)
1)分割及合并pdf
① 合并pdf
首先,我們有如下幾個文件,可以發(fā)現(xiàn)這里共有三個PDF文件需要我們合并。同時可以發(fā)現(xiàn)他們的文件名都是有規(guī)律的(如果文件名,沒有先后順序,我們合并起來就沒有意義了。)
代碼如下:
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
pdf_writer?=?PdfFileWriter()
for?i?in?range(1,len(os.listdir(r"G:\6Tipdm\7python辦公自動化\concat_pdf"))+1):
????print(i*50+1,(i+1)*50)
????pdf_reader?=?PdfFileReader("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\{}-{}.pdf".format(i*50+1,(i+1)*50))
????for?page?in?range(pdf_reader.getNumPages()):
????????pdf_writer.addPage(pdf_reader.getPage(page))
????????
with?open("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\merge.pdf",?"wb")?as?out:
????pdf_writer.write(out)
結(jié)果如下:
② 拆分pdf
這里有一個“時間序列.pdf”的文件,共3頁,我們將其每一頁存為一個PDF文件。
代碼如下:
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
pdf_reader?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\時間序列.pdf")
for?page?in?range(pdf_reader.getNumPages()):
????pdf_writer?=?PdfFileWriter()
????pdf_writer.addPage(pdf_reader.getPage(page))
????with?open(f"G:\\6Tipdm\\7python辦公自動化\\concat_pdf\\{page}.pdf",?"wb")?as?out:
????????pdf_writer.write(out)
結(jié)果如下:
2)旋轉(zhuǎn)及排序pdf
① 旋轉(zhuǎn)pdf
.rotateClockwise(90的倍數(shù)):順時針旋轉(zhuǎn)90度 .rotateCounterClockwise(90的倍數(shù)):逆時針旋轉(zhuǎn)90度
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
pdf_reader?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\時間序列.pdf")
pdf_writer?=?PdfFileWriter()
for?page?in?range(pdf_reader.getNumPages()):
????if?page?%?2?==?0:
????????rotation_page?=?pdf_reader.getPage(page).rotateCounterClockwise(90)
????else:
????????rotation_page?=?pdf_reader.getPage(page).rotateClockwise(90)
????pdf_writer.addPage(rotation_page)
????with?open("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\\旋轉(zhuǎn).pdf",?"wb")?as?out:
????????pdf_writer.write(out)
"""
上述代碼中,我們循環(huán)遍歷了這個pdf,對于偶數(shù)頁我們逆時針旋轉(zhuǎn)90°,對于奇數(shù)頁我們順時針旋轉(zhuǎn)90°;
注意:旋轉(zhuǎn)的角度只能是90的倍數(shù);
"""
其中一頁效果展示如下:
② 排序pdf
需求:我們有一個PDF文件,我們需要倒序排列,應該怎么做呢?首先,我們來看python中,怎么倒敘打印一串數(shù)字,如下圖所示。
那么倒序排列一個pdf,思路同上,代碼如下:
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
pdf_reader?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\時間序列.pdf")
pdf_writer?=?PdfFileWriter()
for?page?in?range(pdf_reader.getNumPages()-1,?-1,?-1):
????pdf_writer.addPage(pdf_reader.getPage(page))
with?open("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\\倒序.pdf",?"wb")?as?out:
????????pdf_writer.write(out)
結(jié)果如下:
4、pdf批量加水印及加密、解密
1)批量加水印
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
from?copy?import?copy
water?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\水印.pdf")
water_page?=?water.getPage(0)
pdf_reader?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\aa.pdf")
pdf_writer?=?PdfFileWriter()
for?page?in?range(pdf_reader.getNumPages()):
????my_page?=?pdf_reader.getPage(page)
????new_page?=?copy(water_page)
????new_page.mergePage(my_page)
????pdf_writer.addPage(new_page)
with?open("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\\添加水印后的aa.pdf",?"wb")?as?out:
????????pdf_writer.write(out)??
"""
這里有一點需要注意:進行pdf合并的時候,我們希望“水印”在下面,文字在上面,因此是“水印”.mergePage(“圖片頁”)
"""
結(jié)果如下:
2)批量加密、解密
這里所說的“解密”,是在知道pdf的密碼下,去打開pdf,而不是暴力破解;
① 加密pdf
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
pdf_reader?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\時間序列.pdf")
pdf_writer?=?PdfFileWriter()
for?page?in?range(pdf_reader.getNumPages()):
????pdf_writer.addPage(pdf_reader.getPage(page))
#?添加密碼
pdf_writer.encrypt("a123456")
with?open("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\\時間序列.pdf",?"wb")?as?out:
????????pdf_writer.write(out)??
結(jié)果如下:
② 解密pdf并保存為未加密的pdf
from?PyPDF2?import?PdfFileReader,?PdfFileWriter
pdf_reader?=?PdfFileReader(r"G:\6Tipdm\7python辦公自動化\concat_pdf\時間序列.pdf")
#?解密pdf
pdf_reader.decrypt("a123456")
pdf_writer?=?PdfFileWriter()
for?page?in?range(pdf_reader.getNumPages()):
????pdf_writer.addPage(pdf_reader.getPage(page))
with?open("G:\\6Tipdm\\7python辦公自動化\\concat_pdf\\未加密的時間序列.pdf",?"wb")?as?out:
????????pdf_writer.write(out)??
結(jié)果如下:
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
