pymupdfに基づくPDFテキスト、画像、表情報の抽出

目次

序文

1つは、PyMuPDFをインストールする

第二に、PyMuPDFの使用

1.ライブラリを紹介します

2.PDFを読む

3.PDF情報を抽出します

総括する


序文

作業ではPDF内の関連情報を抽出する必要があるため、pymupdfツールを確認してください。公式文書では「軽量PDF、XPS、電子書籍ビューア」を紹介しています。状況の使い方から判断すると、図書館は使い勝手が良く、パワフルで、基本的に現在の仕事のニーズに応えることができます。


1つは、PyMuPDFをインストールする

pip install PyMuPDF

第二に、PyMuPDFの使用

1.ライブラリを紹介します

コードは次のとおりです(例):

import fitz

2.PDFを読む

コードは次のとおりです(例):

# 打开pdf文件
doc=fitz.open(pdf_file)

この場所は、PDFファイルを読み取るために使用されます。

3.PDF情報を抽出します

  • テキスト情報の抽出:テキスト情報と場所情報

コードは次のとおりです(例):

for page in doc:
    words=page.getTextWords()
    for w in words:
        #位置信息:fitz.Rect(w[:4])
        #w[4]:文本信息
        print(fitz.Rect(w[:4]),w[4])
  • 画像情報の抽出:画像のnumpyデータと位置情報

コードは次のとおりです(例):

for page in doc:
    img_list=page.getImageList()
    for img in img_list:
        #图片的位置信息
        print(fitz.Rect(img[:4]))
        
        #可以直接利用pymupdf直接保存图片
        pix=fitz.Pixmap(doc,img[0])
        save_name="./图片/page_{}_{}.png".format(page.number,i)
        pix.writePNG(save_name)

もちろん、PDF形式の画像データを直接読み取ってnumpyに変換する場合は、ここにデフォルトでインストールされているPILライブラリを使用する必要があります。

コードは次のとおりです(例):

from PIL import Image
import cv2

def pixmap2array(pix):
    '''pixmap数据转数组对象'''
    #获取颜色空间
    cspace = pix.colorspace
    if cspace is None:
        mode = "L"
    elif cspace.n == 1:
        mode = "L" if pix.alpha == 0 else "LA"
    elif cspace.n == 3:
        mode = "RGB" if pix.alpha == 0 else "RGBA"
    else:
        mode = "CMYK"

    #将byte数据转化为PIL格式
    img = Image.frombytes(mode, (pix.width, pix.height), pix.samples)
    #将PIL转化为numpy格式,并将RGB颜色空间转化为BGR
    img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

    return img
  • テーブル情報の抽出:テーブルを2次元配列に変換し、xlsxテーブルファイルとして保存します

ここで、pymupdfは直接テーブルを抽出できないため、行を抽出してテーブルを再構築する必要があります。したがって、ここではpdfplumberを使用して達成します。pdfplumberライブラリのインストール:

pip install pdfplumber

コードは次のとおりです(例):

import pdfplumber

def analysis_table(pdf_file):
    #打开表格
    workbook = Workbook()
    sheet = workbook.active

    #打开pdf
    with pdfplumber.open(pdf_file) as pdf:
        #遍历每页pdf
        for page in pdf.pages:
            #提取表格信息
            table=page.extract_table( table_settings = {
            'vertical_strategy':"text",
            "horizontal_strategy":"text"})
            print(table)

            # 格式化表格数据
            for row in table:
                print(row)
                sheet.append(row)
 
    workbook.save(filename="2.xlsx")

総括する

完全なコードは次のとおりです(例)。

import fitz
import pdfplumber
from openpyxl import Workbook
from PIL import Image
import cv2
import numpy as np

def analysis_table(pdf_file):

    #打开表格
    workbook = Workbook()
    sheet = workbook.active

    #打开pdf
    with pdfplumber.open(pdf_file) as pdf:
        #遍历每页pdf
        for page in pdf.pages:
            #提取表格信息
            table=page.extract_table( table_settings = {
            'vertical_strategy':"text",
            "horizontal_strategy":"text"})
            print(table)

            # 格式化表格数据
            for row in table:
                print(row)
                sheet.append(row)

    workbook.save(filename="2.xlsx")

def pixmap2array(pix):
    '''pixmap数据转数组对象'''
    #获取颜色空间
    cspace = pix.colorspace
    if cspace is None:
        mode = "L"
    elif cspace.n == 1:
        mode = "L" if pix.alpha == 0 else "LA"
    elif cspace.n == 3:
        mode = "RGB" if pix.alpha == 0 else "RGBA"
    else:
        mode = "CMYK"

    #将byte数据转化为PIL格式
    img = Image.frombytes(mode, (pix.width, pix.height), pix.samples)
    #将PIL转化为numpy格式,并将RGB颜色空间转化为BGR
    img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

    return img

def ananlysis_PDF(pdf_file):
    '''解析pdf信息'''

    # 判断pdf是否存在
    if not os.path.exists(pdf_file):
        print("pdf文件不存在")
        return;

    # 打开pdf文件
    doc=fitz.open(pdf_file)

    #遍历pdf,提取信息
    for page in doc:
        words=page.getTextWords()
        for w in words:
            print(fitz.Rect(w[:4]),w[4])

        img_list=page.getImageList()
        i=0
        for img in img_list:
            print(fitz.Rect(img[:4]))
            pix=fitz.Pixmap(doc,img[0])
            save_name="./图片/page_{}_{}.png".format(page.number,i)
            pix.writePNG(save_name)
            image=pixmap2array(pix)
            i+=1

 

おすすめ

転載: blog.csdn.net/wxplol/article/details/109304946