当前位置:

pdf图片识别分类

访客 2024-04-25 429 0

文章目录

    • 解析pdf数据
    • ocr识别
    • 分类方法
      • 正则匹配
      • 分类模型
    • 分类完提示

解析pdf数据

试了几种方法
fitz-get_image后面方法不适用,用pixmap分辨率低
用pypdf2版本低方法用不了
用pdf2image还要下依赖工具
用spire.pdf的SaveAsImage分辨率低,ExtractImages可以但运行慢
先用spire.pdf的ExtractImages吧

from spire.pdf.common import ImageFormatfrom spire.pdf import PdfDocument# 从PDF文档提取图片,PDF文档的路径,存放图片的文件夹路径def extract_images_from_pdf(file_path, output_folder):# 创建PdfDocument类的实例doc = PdfDocument()# 加载PDF文档doc.LoadFromFile(file_path)# 创建list来存储提取的图片images = []# 遍历文档的页面for i in range(doc.Pages.Count):# 获取当前页page = doc.Pages.get_Item(i)# 从页面提取图片并存储到listfor img in page.ExtractImages():# print(img)images.append(img)# 将图片保存到指定文件夹for i, image in enumerate(images):image.Save(f"{output_folder}Image-{i+1}.jpg", ImageFormat.get_Jpeg())doc.Close()# 调用函数实现从PDF提取图片file_path = "副本.pdf"output_folder = "tup/"extract_images_from_pdf(file_path, output_folder)

ocr识别

试验几种方法paddleocr umiocr cnocr 微信截图等
识别效果都差不多 最先进的也就这样了,就用cnocr 运行效率高 其他更慢
调了调一些参数,发现不调还好一些
cnocr也和opencv一样不支持中文路径,直接用PIL读取传对象给cnocr就可以

from cnocr import CnOcr # 识别from PIL import Imagedef ocr_cn(path): # 输入图片pathimg=Image.open(path)# print(img)r = ocr.ocr(img)t = []  # 文本for each in r:# print(each['text'])t.append(each['text'])# print(t)return t

分类方法

分类方法有基于规则、基于词频统计、nlp算法-朴素贝叶斯 textcnn什么的
一般数据量小就规则,一般数据量大也先用规则看看 一些能看到的共性可以直接提出来,剩下的再用AI学习

正则匹配

.所有 \d数字 \D非数字 \s空格 \S非空格 \w字母数字汉字下划线  \W非\w*匹配0-无限次,+匹配1-无限次,?匹配0-1次,{n}匹配n次,{m,n}匹配m-n次(19|20)  [1-9][^\d]  [^https://]  取非'^www.*com$'  www开头com结尾'[a-zA-Z0-9_]{4,20}@(163|126|qq|sina|yahoo)\.com' 邮件'\d{3}-\d{8}|\d{4}-\d{7,8}' 电话号re.match("<[a-zA-Z]+>(.*)</[a-zA-Z]+>", "<html>zzz</div>").group(1) 提取html内容re.sub(r'[0-9]', '*', s)  # 把数字替换为*re.sub(r'[0-9]+', "*", s) # 多个数字替换为1个*re.sub(r'[^0-9]+', "*", s)# 匹配非数字提取年月a,b,c='2023-1-12', '2024.2.23','24年1月'd="(\d{2})[- /.]([1-9]|1[0-2])[- /.]"  # 日期中间4种分隔 - / . 空格line=re.search(d,b)  # 匹配不到就是None,match是从第一个开始匹配print(line) # <re.Match object; span=(2, 6), match='24.2'>print(line.span())   # (2, 6)print(line.group()) # 24.2.print(line.group(1)) # 24 小括号是分组print(line.group(2)) # 2  小括号是分组print(re.findall(d,a)) # [('23','1')] 返回所有匹配结果,没匹配为空[]print(re.split('[-年.]',line.group()))  # ['24', '2']

分类模型

分类完提示

用Tkinter或pyqt做窗口提示和交互

## 分类完提示import tkinter as tkfrom tkinter import messageboxroot = tk.Tk()root.withdraw()messagebox.showinfo("提示", "程序运行完成!")messagebox.showinfo("提示", "分类完成!"+'\n'+'分类成功 条'+'\n'+'分类失败 条')

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~