pythonの3つの方法はpdfの中の写真を抽出します。


時には一つ以上のPDFファイルの中の写真を抽出しなければなりません。オンラインのウェブサイトを使って実現すれば、写真の漏えいが心配されます。手動で操作するのは面倒です。実はPythonを使っても簡単に解決できます。
今日はみんなのシステムといくつかのPythonを共有してPDF画像を抽出する方法です。実際には非常に完璧な方法はありません。各方法の抽出効率は100%ではないので、様々な方法で補完することが考えられます。
  • は、fitzライブラリと正規検索に基づいて、抽出画像
  • を検索する。
  • は、pdf2imageライブラリの2つの方法に基づいて画像を抽出する。
  • fitzライブラリと正則に基づいて検索します。
    fitzはpymupdfのサブモジュールです。コマンドラインでpymupdfをインストールする必要があります。
    
    pip install pymupdf
    ただし、導入時はimport fitzを使ってモジュールを導入してください。
    下のコードはfitzライブラリを利用して画像を抽出するために正則で画像要素に一致し、テンプレート要素をピクセルに変換してから画像形式で書き出す必要があります。
    
    import fitz
    import re
    import os
    
    file_path = r'C:\xxx\xxx.pdf' # PDF     
    dir_path = r'C:\xxx' #         
    
    def pdf2image1(path, pic_path):
      checkIM = r"/Subtype(?= */Image)"
      pdf = fitz.open(path)
      lenXREF = pdf._getXrefLength()
      count = 1
      for i in range(1, lenXREF):
        text = pdf._getXrefString(i)
        isImage = re.search(checkIM, text)
        if not isImage:
          continue
        pix = fitz.Pixmap(pdf, i)
        new_name = f"img_{count}.png"
        pix.writePNG(os.path.join(pic_path, new_name))
        count += 1
        pix = None
    
    pdf2image1(file_path, dir_path)
    サンプルファイルを実行した結果、以下のようになりました。

    いくつかの小さな色の塊が写真に抽出されているのが見えますが、どうやってフィルタリングしますか?
    簡単な方法があります。大きさフィルタリングによって、pix画素はfitzライブラリに重要な方法があります。pix.sizeはピクセルの数を反映できます。簡単な色素ブロックはこの値が低いので、閾値を設定してフィルタリングすることができます。閾値10000を例にしてフィルタリングする:
    
    import fitz
    import re
    import os
    
    file_path = r'C:\xxx\xxx.pdf' # PDF     
    dir_path = r'C:\xxx' #         
    
    def pdf2image1(path, pic_path):
      checkIM = r"/Subtype(?= */Image)"
      pdf = fitz.open(path)
      lenXREF = pdf._getXrefLength()
      count = 1
      for i in range(1, lenXREF):
        text = pdf._getXrefString(i)
        isImage = re.search(checkIM, text)
        if not isImage:
          continue
        pix = fitz.Pixmap(pdf, i)
        if pix.size < 10000: #              
          continue #           
        new_name = f"img_{count}.png"
        pix.writePNG(os.path.join(pic_path, new_name))
        count += 1
        pix = None
    
    pdf2image1(file_path, dir_path)

    すべての画像が正常に抽出されているのが見えます。
    pdf 2 imageライブラリに基づく二つの方法
    名前を見ると、このライブラリの役割が分かります。公式文書はhttps://www.cnpython.com/pypi/pdf2imageです。
    簡単に pip install pdf2image でインストールすることができますが、popplerは本当に使いやすい変換器ですので、追加の設置と構成が必要です。
  • windowsユーザはpoppler for WindowsをインストールしてからPATH
  • にbin/フォルダを追加しなければなりません。
  • Macユーザーはpoppler for Macをインストールしなければなりません。
  • 具体的に機能するコードの公式文書にも詳細な説明があります。

    この二つの方法をそれぞれ試してみましょう。
    
    from pdf2image import convert_from_path,convert_from_bytes
    import tempfile
    from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError
    import os
    
    file_path = r'C:\xxx\xxx.pdf' # PDF     
    dir_path = r'C:\xxx' #         
    
    def pdf2image2(file_path, dir_path):
      images = convert_from_path(file_path, dpi=200)
      for image in images:
        if not os.path.exists(dir_path):
          os.makedirs(dir_path)
        image.save(file_path + f'\img_{images.index(image)}.png', 'PNG')
    
    pdf2image2(file_path, dir_path)
    画像の抽出に成功しました。第二の方法を試してみます。
    
    from pdf2image import convert_from_path,convert_from_bytes
    import tempfile
    from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError
    import os
    
    file_path = r'C:\xxx\xxx.pdf' # PDF     
    dir_path = r'C:\xxx' #         
    
    def pdf2image3(file_path, dir_path):
      images = convert_from_bytes(open(file_path, 'rb').read())
      for image in images:
        if not os.path.exists(dir_path):
          os.makedirs(dir_path)
        image.save(file_path + f'\img_{images.index(image)}.png', 'PNG')
    
    pdf2image3(file_path, dir_path)

    結果は以前と一致しています。PDFの全画像が抽出されます。
    もうちょっと補充します。コア方法covert_from_bytesは、大量のパラメータを含み、自分で修正することができる。いくつかの常用パラメータは以下のようにまとめられています。
    パラメータ
    意味
    pdf_パス
    PDF文書パス
    dpi
    画像の品質(学術雑誌なら300 dpiがよくあります)
    out put_フォルダー
    生成した画像を直接メモリに書き込む代わりにフォルダに書き込みます。
    first_page
    開始ページ数
    ラスター.page
    どのページに変換しますか
    fmt
    画像フォーマットは、pngに指定できます。デフォルトはppmです。
    スリーロード.count
    変換に参加するスレッド数を許可します。
    userpw
    PDFのパスワード
    out put_file
    出力ファイル名
    poppler_パス
    popplerのインストール経路を指定します。最初に配置したら指定する必要はありません。
    これに値するのはthread_count パラメータで、マルチスレッドを起動すると、変換速度が大幅に速くなります。特にPDFページが多い場合。興味のある方は試してみてください。
    以上がpythonの3つの方法です。pdfの中の写真の詳細を抽出します。pythonのpdfの中の写真を抽出する資料については、他の関連記事に注目してください。