Python提取PDF指定內容並生成新檔案

2022-09-25 16:06:08 字數 4172 閱讀 8298

在之前的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...