PythonはPDFの指定内容を抽出し、新しいファイルを生成する。


前のPythonオフィスオートメーションのテーマでは、どのようにいくつかのページを抽出して統合するかを紹介しました。
しかし、多くの場合、抽出したいページ番号を予知するのではなく、指定された内容を含むページを新たなPDFとして抽出したいと考えています。本稿では、2つの実際のニーズを例に説明します。
01デマンド説明
データは286ページの上場会社の公開年報PDFです。大体次の通りです。
Image
今は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'
    ew_ .pdf', 'wb') as out:     pdf_writer.write(out)
    これで特定のテキストコンテンツページを含む抽出を完了し、PDFに統合しました。すべてのページには「戦略」という二文字が含まれています。
    Image
    Image
    完全なコードが必要です。興味のある読者は自分で研究できます。
    
    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'
    ew_ 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 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)
    この二つの単一の需要を実現すれば、関連コードをカプセル化して、オスなどのモジュールを結合して大量操作を実現し、両手を解放することができます。
    ここでPythonについてPDFの指定内容を抽出し、新しいファイルを作成する文章を紹介します。より多くの関連PythonはPDFの指定内容を抽出します。以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。