基于pymupdf的PDF的文本、图片和表格信息提取 | 您所在的位置:网站首页 › 如何提取excel的图片 › 基于pymupdf的PDF的文本、图片和表格信息提取 |
目录 前言 一、安装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 实验室设备网 版权所有 |