Extracción de información de texto, imágenes y tablas en PDF basada en pymupdf

Tabla de contenido

Prefacio

Uno, instale PyMuPDF

En segundo lugar, el uso de PyMuPDF

1. Presentar la biblioteca

2. Leer el pdf

3. Extraer información en PDF

para resumir


Prefacio

Debido a que el trabajo necesita extraer la información relevante en el pdf, consulte la herramienta pymupdf. El documento oficial presenta " visor ligero de PDF, XPS y libros electrónicos ". A juzgar por el uso de la situación, la biblioteca es más conveniente de usar y poderosa, básicamente capaz de satisfacer las necesidades de trabajo actuales.


Uno, instale PyMuPDF

pip install PyMuPDF

En segundo lugar, el uso de PyMuPDF

1. Presentar la biblioteca

El código es el siguiente (ejemplo):

import fitz

2. Leer el pdf

El código es el siguiente (ejemplo):

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

Este lugar se utiliza para leer archivos pdf.

3. Extraer información en PDF

  • Extraer información de texto: información de texto e información de ubicación

El código es el siguiente (ejemplo):

for page in doc:
    words=page.getTextWords()
    for w in words:
        #位置信息:fitz.Rect(w[:4])
        #w[4]:文本信息
        print(fitz.Rect(w[:4]),w[4])
  • Extraer información de la imagen: numerosos datos e información de ubicación de la imagen

El código es el siguiente (ejemplo):

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)

Por supuesto, si desea leer directamente los datos de la imagen en pdf y convertirlos a numpy, debe usar la biblioteca PIL, que se instala aquí de forma predeterminada.

El código es el siguiente (ejemplo):

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
  • Extraiga la información de la tabla: convierta la tabla en una matriz bidimensional y guárdela como un archivo de tabla xlsx

Aquí, debido a que pymupdf no puede extraer directamente la tabla, es necesario reconstruir la tabla extrayendo líneas. Así que aquí usa pdfplumber para lograrlo. Instalación de la biblioteca pdfplumber:

pip install pdfplumber

El código es el siguiente (ejemplo):

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")

para resumir

El código completo es el siguiente (ejemplo):

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

 

Supongo que te gusta

Origin blog.csdn.net/wxplol/article/details/109304946
Recomendado
Clasificación