基于pymupdf的PDF的文本、图片和表格信息提取
由于工作需要提取pdf中的相关信息,查到pymupdf这个工具。官方文档中介绍说“轻量级PDF,XPS和电子书查看器”。通过使用来情况来看,该库使用起来比较方便,而且功能强大,基本能够满足目前的工作需要。
·
目录
前言
由于工作需要提取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
这里由于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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献5条内容
所有评论(0)