日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

实用脚本!Python 提取 PDF 指定内容生成新文件!

發布時間:2024/9/16 python 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实用脚本!Python 提取 PDF 指定内容生成新文件! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多時候,我們并不會預知希望提取的頁號,而是希望將包含指定內容的頁面提取合并為新PDF,本文就以兩個真實需求為例進行講解。

01

需求描述

數據是一份有286頁的上市公司公開年報PDF,大致如下

現在需要利用 Python 完成以下兩個需求

需求一:提取所有包含 戰略 二字的頁面并合并新PDF

需求二:提取所有包含圖片的頁面,并分別保存為 PDF 文件

02

前置知識和邏輯梳理

2.1 PyPDF2 模塊實現合并

PyPDF2 導入模塊的代碼常常是:

from?PyPDF2?import?PdfFileReader,?PdfFileWriter

這里導入了兩個方法:

  • PdfFileReader 可以理解為讀取器

  • PdfFileWriter 可以理解為寫入器

  • 利用 PyPDF2 實現合并運用的一下邏輯:

  • 讀取器將所有pdf讀取一遍

  • 讀取器將讀取的內容交給寫入器

  • 寫入器統一輸出到一個新pdf

  • 隱含知識點:讀取器只能將讀取的內容一頁一頁交給寫入器

    2.2 獲取與添加頁面

    之前我們的推文中提到這兩個代碼,下面列出作為復習:

  • .getPage 獲取特定頁

  • .addPage 添加特定頁

  • 2.3 圖片和文字的處理

    要實現本文的需求還要做到很重要的一個判斷:確定頁面中有無包含的文字或圖片

    判斷是否包含特定的文字比較簡單,遍歷每一頁的時候都將包含的文本抽提出,做字符串層面的判斷即可,代碼思路:

  • 利用 pdfplumber 打開PDF 文件

  • 獲取指定的頁,或者遍歷每一頁

  • 利用 .extract_text() 方法提取當前頁的文字

  • 判斷 “戰略” 是否在提取的文字中

  • 判斷是否包含圖片,思路和上面是類似的,但方法不同。圖片考慮用正則的方法識別,用 fitz 和 re 配合,具體見下文代碼

    03

    代碼實現

    3.1 需求一的實現

    首先來完成需求一的任務,導入需要用到的庫:讀取寫入PDF文件的 PyPDF2 以及抽提文本的 pdfplumber

    from?PyPDF2?import?PdfFileReader,?PdfFileWriter import?pdfplumber

    指定文件所在的路徑,同時初始化寫入器,將文件交給讀取器:

    path?=?r'C:\xxxxxx' 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))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?pdfplumberpath?=?r'C:\xxx' 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:\xxxxxx'

    正則識別圖片的部分不細講,之前的推文已經介紹過,我們直接看代碼:

    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?=?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)

    至此也完成了第二個需求。需要說明的是目前沒有非常完美提取PDF圖片的方法,本案例介紹的方法識別圖片也并不穩定。讀者可以利用自己的數據多做嘗試。完整代碼如下:

    from?PyPDF2?import?PdfFileReader,?PdfFileWriter import?fitz import?re import?ospath?=?r'C:\xxx'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等模塊實現批量操作,解放雙手。

    END

    推薦閱讀牛逼!Python常用數據類型的基本操作(長文系列第①篇) 牛逼!Python的判斷、循環和各種表達式(長文系列第②篇)牛逼!Python函數和文件操作(長文系列第③篇)牛逼!Python錯誤、異常和模塊(長文系列第④篇) 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的实用脚本!Python 提取 PDF 指定内容生成新文件!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。