多くの場合、抽出するページ番号を予測しませんが、指定したコンテンツを含むページを抽出。この記事では、2つの実際のニーズを例として説明します。
【注】記事の最後で入手した情報、コード、技術交流
01要件の説明
データは、上場企業の286ページの公開年次報告書PDFであり、おおよそ次のとおりです。
次に、Pythonを使用して次の2つの要件を満たす必要があります
要件1:単語戦略を含むすべてのし、新しいPDFをマージします
要件2 :画像を含むすべてのページを抽出し、PDFファイルとして保存します
02事前知識と論理ソート
2.1PyPDF2
モジュール実装のマージ
PyPDF2
モジュールをインポートするためのコードは、多くの場合次のとおりです。
from PyPDF2 import PdfFileReader, PdfFileWriter
ここでは、次の2つのメソッドがインポートされます。
-
PdfFileReader
読者として理解できる -
PdfFileWriter
作家として理解できる
PyPDF2
組み合わせたアプリケーションの次のロジックを実現するために使用します。
-
リーダーはすべてのPDFを1回読みます
-
リーダーは、読み取ったコンテンツをライターに渡します
-
ライターが出力を新しいPDFに統合
暗黙知のポイント:読者は、読んだコンテンツをページごとにライターに渡すことしかできません。
2.2ページの取得と追加
これらのコードは両方とも以前のツイートで言及されており、復習として以下にリストされています。
-
.getPage
特定のページを取得する -
.addPage
特定のページを追加する
2.3写真とテキストの処理
この記事の要件を達成するには、非常に重要な判断を下す必要があります。ページにテキストまたは画像が含まれているかどうかを判断します。
特定のテキストが含まれているかどうかを判断するのは比較的簡単です。各ページをトラバースするときに、含まれているテキストが抽出され、文字列レベルで判断されます。コードのアイデア:
-
でPDFファイルを
pdfplumber
開く -
指定されたページを取得するか、各ページをトラバースします
-
この
.extract_text()
メソッドを、現在のページのテキストを抽出します -
抽出されたテキストに「戦略」が含まれているかどうかを確認します
写真を含めるかどうかを判断する考え方は上記と似ていますが、方法が異なります。画像は通常の方法で認識されたと見なされ、fitz
とre
一致します。詳細については、以下のコードを参照してください。
03コードの実装
3.1要件1の実装
まず、要件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に統合しました。すべてのページに「戦略」という言葉が含まれています。
要件1完全なコードは次のとおりです。興味のある読者は自分で勉強できます
from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber
path = 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要件2の実装
次に、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)
この時点で、2番目の要件も完了しています。なお、現在、PDF画像を抽出するための完璧な方法はなく、この場合に導入された方法は、画像を認識するための安定した方法ではありません。読者は自分のデータでもっと試すことができます。完全なコードは次のとおりです。
from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os
path = 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)
これらの2つの単一要件が実現された後、関連するコードをカプセル化し、OSや他のモジュールと組み合わせて、バッチ操作を実現し、手を解放することができます。