一、安装命令:
python -m pip install -U https://paddleocr.bj.bcebos.com/whl/layoutparser-0.0.0-py3-none-any.whl
二、基本使用
import datetime#引入依赖
import os
import fitz # fitz就是pip install PyMuPDF
import cv2
import shutil
from paddleocr import PPStructure,draw_structure_result,save_structure_res
def pyMuPDF_fitz(pdfPath, imagePath):#pdf转图片
startTime_pdf2img = datetime.datetime.now() # 开始时间
print("imagePath=" + imagePath)
pdfDoc = fitz.open(pdfPath)
for pg in range(pdfDoc.pageCount):
page = pdfDoc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为4,这将为我们生成分辨率提高4的图像。
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
zoom_x = 4 # (1.33333333-->1056x816) (2-->1584x1224)
zoom_y = 4
mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pix = page.getPixmap(matrix=mat, alpha=False)
if not os.path.exists(imagePath): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath) # 若图片文件夹不存在就创建
pix.writePNG(imagePath + '/' + 'images_%s.png' % pg) # 将图片写入指定的文件夹内
endTime_pdf2img = datetime.datetime.now() # 结束时间
print('pdf转图片时间=', (endTime_pdf2img - startTime_pdf2img).seconds)
pdfDir = './pdf'
def gci(filepath):
#遍历filepath下所有文件
files = os.listdir(filepath)
for fi in files:
# 将转换的图片保存到对应imgs的对应子目录下
pyMuPDF_fitz(os.path.join(filepath,fi), os.path.join('imgs',fi[:-4]))
PP-Structure简介
layout-parser是一个可分析复杂文档结构然后进行处理的工具包,主要特性如下:
- 支持以图片形式分析版面,可以划分文字表格、标题、图片以及列表五大类
- 支持文字、标题、图片以及列表区域提取为文字字段(与PP-OCR联合使用)
- 支持表格区域进行结构化分析,最终结果输出Excel文件
- 支持python whl包和命令行两种方式,简单易用
- 支持版面分析和表格结构化两类任务自定义训练
import cv2
import layoutparser as lp
image = cv2.imread('imgs/2001.11314/images_3.png')
image = image[..., ::-1]
# 加载模型
model = lp.PaddleDetectionLayoutModel(config_path="lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config",
threshold=0.5,
label_map={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"},
enforce_cpu=False,
enable_mkldnn=True)
# 检测
layout = model.detect(image)
# 显示结果
show_img = lp.draw_box(image, layout, box_width=3, show_element_type=True)
分析结果
识别结构:
table_engine = PPStructure(show_log=True)
save_folder = './result'
img_dir = './imgs'
files = os.listdir(img_dir)
for fi in files:
# 找到文件对应子目录
# print(fi)
fi_d = os.path.join(img_dir,fi)
# print(fi_d)
for img in os.listdir(fi_d):
img_path = os.path.join(fi_d,img)
img = cv2.imread(img_path)
result = table_engine(img)
# 保存在每张图片对应的子目录下
save_structure_res(result, os.path.join(save_folder,fi),os.path.basename(img_path).split('.')[0])