在之前的python辦公自動化案專題中,我們已經介紹了如何有選擇的提取某些頁面進行合併。
但是很多時候,我們並不會預知希望提程式設計客棧取的頁號,而是希望將包含指定內容的頁面提取合併為新pdf,本文就以兩個真實需求為例進行講解。
資料是乙份有286頁的上市公司公開年報pdf,大致如下
現在需要利用 python 完成以下兩個需求
「需求一:提取所有包含戰略二字的頁面並合併新pdf
需求二:提取所有包含的頁面,並分別儲存為 pdf 檔案
」2.1pypdf2模組實現合併
pypdf2匯入模組的**常常是:
from pypdf2 import pdffilereader, pdffilewriter
這裡匯入了兩個方法:
利用pypdf2實現合併運用的一下邏輯:
隱含知識點:讀取器只能將讀取的內容一頁一頁交給寫入器
2.2 獲取與新增頁面
之前我們的推文中提到這兩個**,下面列出作為複習:
2.3 和文字的處理
要實現本文的需求還要做到很重要的乙個判斷:確定頁面中有無包含的文字或
判斷是否包含特定的文字比較簡單,遍歷每一頁的時候都將包含的文字抽提出,做字串層面的判斷即可,**思路:
判斷是否包含,思路和上面是類似的,但方法不同。考慮用正則的方法識別,用fitz和re配合,具體見下文**
3.1 需求一的實現
首先來完成需求一的任務,匯入需要用到的庫:讀取寫入pdf檔案的pypdf2以及抽提文字的pdfplumber
from pypdf2 import pdffilereader, pdffilewriter
import pdfplumber
指定檔案所在的路徑,同時初始化寫入器,將檔案交給讀取器:
path = r'c:\******'
pdf_writer = pdffilewriter()
pdf_reader = pdffilereader(path + r'\公司年報.pdf')
以上下文管理器形式通過pdfplumber開啟檔案,同時用.getnumpages獲取讀取器的最大頁利於遍歷每一頁來抽提文字:
with pdfplumber.open(path + r'\公司年報.pdf') as pdf:
for i in range(pdf_reader.getnumpages()):
page = pdf.pages[i]
print(page.extract_text())
我們抽提文字的目的是用來判斷,將符合要求的頁碼作為讀取器.getpage的引數,最後用.addpage交給寫入器:
with pdfplumber.open(path + r'\公司年報.pdf') as pdf:
for i in range(pdf_reader.getnumpages()):
page = pdf.pages[i]
print(page.extract_text())
if '戰略' in page.extract_text():
pdf_writer.addpage(pdf_reader.getpage(i))
www.cppcns.com; print(i + 1, page.extract_text())
完成識別後讓寫入器輸出為需要的檔名:
with open(path + r'\new_公司年報.pdf', 'wb') as out:
pdf_writer.write(out)
至此,我們就完成了包含特定文字內容頁面的提取,並整合成乙個pdf。所有的頁面均包含「戰略」二字:
需求一完整**如下,感興趣的讀者可以自行研究
from pypdf2 import pdffilereader, pdffilewriter
import pdfplumber
path = r'c:\***'
pdf_writer = pdffilewriter()
pdf_reader = pdffilereader(path + r'\公司年報.pdf')
with pdfplumber.open(path + r'\公司年報.pdf') as pdf:
for i in range(pdf_reader.getnumpages()):
page = pdf.pages[i]
print(page.extract_text())
if '戰略' in page.extract_text():
pdf_writer.addpage(pdf_reader.getpage(i))
print(i + 1, page.extract_text())
with open(path + r'\new_公司年報1.pdf', 'wb') as out:
pdf_writer.write(out)
3.2 需求二的實現
接下來完成需求二的任務。首先匯入需要的庫:
from pypdf2 import pdffilereader, pdffilewriter
import fitz
import re
import os
指定檔案所在的路徑:
path = r'c:\******'
正則識別的部分不細講,之前的推文已經介紹過,我們直接看**:
page_lst =
checkimg = r"/subtype(?= */image)"
pdf = fitz.open(path + r'\公司年報.pdf')
lenxref = pdf._getxreflength()
for i in range(lenxref):
text = pdf._getxrefstring(i)
isimage = re.search(checkimg, text)
if isimage:
page_lst.append(i)
print(page_lst)
獲取到所有包含的頁面後,再結合讀取器和寫入器的配合就能完成新 pdf 的產生。注意本需求是所有單獨輸出,因此獲取到頁面後交給寫入器直接輸出成檔案:
pdf_reader =&程式設計客棧nbsp;pdffilereader(path + r'\公司年報.pdf')
for page in page_lst:
pdf_writer = pdffilewriter()
pdf_writer.addpage(pdf_reader.getpage(page))
w程式設計客棧ith open(path + r'\公司年報_{}.pdf'.format(page + 1), 'wb') as out:
pdf_writer.write(out)
至此也完成了第二個需求。需要說明的是目前沒有非常完美提取pdf的方法,本案例介紹的方法識別也並不穩定。讀者可以利用自己的資料多做嘗試。完整**如下:
from pypdf2 import pdffilereader, pdffilewriter
import fitz
import re
import os
path = r'c:\***'
page_lst =
checkimg = r"/subtype(?= */image)"
pdf = fitz.open(path + r'\公司年報.pdf')
lenxref = pdf._getxreflength()
for i in range(lenxref):
text = pdf._getxrefstring(i)
isimage = re.search(checkimg, text)
if isimage:
page_lst.append(i)
print(page_lst)
pdf_reader = pdffilereader(path + r'\公司年報.pdf')
for page in page_lst:
pdf_writer = pdffilewriter()
pdf_writer.addpage(pdf_reader.getpage(page))
with open(path + r'\公司年報_{}.pdf'.format(page + 1), 'wb') as out:
pdf_writer.write(out)
實現這兩個單個需求後,就可以將相關**封裝並結合os等模組實現批量操作,解放雙手。
python提取內容 使用Python提取小說內容
具體實現功能如下 輸入 目錄頁的url之後,指令碼會自動分析目錄頁,提取 的章節名和章節鏈結位址。然後再從章節鏈結位址逐個提取章節內容。現階段只是將 從第一章開始,每次提取一章內容,回車之後提取下一章內容。其他 的結果可能有不同,需要做一定修改。在逐浪測試過正常。coding utf8 usr bi...
C 提取TXT文件指定內容
早上有分享一篇 vb.net提取txt文件指定內容 那是原的需求用vb.net寫的。剛才有只懂c 的提及,vb.net的語法,很不好看。因為同這樣形式的資料獲取,有得學習,希望insus.net有時間時,提供c 的語法。由於兩篇的要求一樣,只是開發語言不一樣,因此為了節省篇幅,要求就不重複了。每個類...
python從字串中提取指定內容
我們在做資料處理的時候,會遇到包含多條格式類似的長字串,比如說 recv node1 temperature 26 node1 humidity 48 node2 temperature 36 node2 humidity 48 node3 temperature 24 node3 humidity...