1. 需求与适用范围
在数字化转型工作中,需要提取PDF文件中的一些信息。这些PDF文件通常是其他乙方公司用各类CAD文件绘制的,转成PDF后提供给电厂。这些PDF不是扫描件,因此具备从其中提取数据的可能性。纯文本的读取相对容易,稍微麻烦点的是组态图、接线图。
2. 基本方法
使用Python的pdfplumber库可以读取PDF文件中的形状、文本和表格。这个库不适合做OCR,但是对于非扫描的PDF效果不错。
优点1:有中文手册
优点2:具备可视化调试功能。
import pdfplumber
with pdfplumber.open("path/to/file.pdf") as pdf:
p1 = pdf.pages[0]
im=p1.to_image(resolution=150)#设置转换后图片的分辨率
im.draw_rects(p1.extract_words())
im.show()
简单的几行代码就可以把PDF文件中第1页的所有文字框出来。
优点3:可以直接导出文本、矩形、线、表格
使用page.extract_words()可以直接导出文本,输出格式是一个字典列表。用w[i]['text']就可以读取到 第i个文本的框里的文本。同时还有文本框的位置信息等。
使用for r in page.rects:可以遍历所有的矩形。
使用for line in page.lines:可以遍历所有的水平线,对于非水平线,需要再遍历page.curves
比如对于上图中的各类箭头线、折线、竖线都不能靠page.lines,而要靠page.curves
利用Lines和curves里pts属性,可以读取到线段或折线的起点、终点、转折点数据。通过判断这些点是否在前述矩形边界上,就可以获取到矩形和矩形之间的连接关系。
通过page.extract_tables()可以提取页面中的表格。
注意:表格和文本提取后的数据排序并不是完全按照阅读顺序来的,所以可以根据每个文本框或表格单元格的x0,y0,top,bottom等属性来排序获得需要的数据结构。
3. to do
纯文本的读取虽然简单,但是其内容其实并不是结构化。比如文件中可能描述了某个报警功能的作用。而如果我想将其读取到数据库中,并在需要的时候检索出来就比较困难。
这时需要用到目前火热的大模型。目前已经尝试了openai和清华的chatglm。两个模型查询西门子X307-3交换机中的link check功能的作用,都给出了比较满意的答案。回头把截图贴上来(autodl的GPU要抢,OPENAI的梯子也要抢。。。)
但是对于可能得更多私有化的文档(西门子这个问题显然是大模型本身在网络上爬下来作文训练文档了,所以答的比较好)。就需要对模型进行微调,具体的搞法还在研究。