基于pymupdf的PDF的文本、图片和表格信息提取 您所在的位置:网站首页 如何提取excel的图片 基于pymupdf的PDF的文本、图片和表格信息提取

基于pymupdf的PDF的文本、图片和表格信息提取

2024-02-29 04:59| 来源: 网络整理| 查看: 265

目录

前言

一、安装PyMuPDF

二、PyMuPDF的使用

1.引入库

2.读取pdf

3.提取pdf信息

总结

前言

由于工作需要提取pdf中的相关信息,查到pymupdf这个工具。官方文档中介绍说“轻量级PDF,XPS和电子书查看器”。通过使用来情况来看,该库使用起来比较方便,而且功能强大,基本能够满足目前的工作需要。

一、安装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

提取表格信息:将表格转化为二维数组并保存为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

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有