PDF是一种查看方便但解析起来非常不方便的工具,不理解为什么到现在还没对这个问题从源头优化一下。对PDF文件的解析,一般分成对pdf文本等内容的解析、将pdf转化成图像再解析这两种。
一、pdf 解析文本公认比较好用的pip库是pdfplumber,此外fitz也可以,经费够可以调pdflux这种服务商。fitz仅处理文本,pdfplumber还可以处理表格。
1.1 pdfplumber解析文本
PDFPlumber是基于 PDFMiner 构建的 PDF 解析器,微软构建DocBank(大规模文档布局标注数据集)用到了这个库。不能100%还原表格,支持可视化调试。在mac上解析某个markdown生成的pdf时遇到了一个坑,解析出来的文字是cid编码,解析普通的pdf没有问题。
CID码:PDF包含将字符代码映射到字形索引的CMAP。因此,CID是它映射到的字形在CMAP表中的字符标识。
import pdfplumber pdf = pdfplumber.open(path) import pandas as pd for page in pdf.pages: # 获取当前页面的全部文本信息,包括表格中的文字 # print(page.extract_text()) # 只提取文字,对表格信息,有简单合并行 # print(page.extract_words()) # 提取字符串的文本、坐标等信息 # print(page.extract_tables()) # 按行元素返回表格信息,无坐标 # print(page.chars) # 按字符而非字符串提取文本、坐标等信息 for t in page.extract_tables(): # for row in t: # print(row) # 得到的table是嵌套list类型,转化成Dataframe更加方便查看和分析 df = pd.Dataframe(t[1:], columns=t[0]) print(df) # 只用第一页测试 break pdf.close()
1.2 fitz 解析文本
import fitz
doc = fitz.open(path)
whole_pdf = []
for i, page in enumerate(doc):
words = page.getTextWords()
print(words)
# for w in words:
# print(fitz.Rect(w[:4]), w[4])
break
此外解析带表格的pdf还有一些其他方法:
1、pdfminer:较复杂、不能直接还原出表格,据说是pdfplumber的底层
2、tabula:依赖java、识别有问题、难以区分多张表
3、各个表格解析的开源项目,如paddleocr、tablemaster、camelot...
4、各个人工智能服务供应商,注册服务后获取token,需要上传文件后下载,如庖丁科技的pdflux
5、poppler:C++
二、pdf 转 图像
不论是扫描生成的图片型pdf还是word生成的可复制文本型pdf,均可转为图像。
def pdf2img(file_path, dest_path):
zoom_x = 2.0 # horizontal zoom
zomm_y = 2.0 # vertical zoom
mat = fitz.Matrix(zoom_x, zomm_y) # zoom factor 2 in each dimension
doc = fitz.open(file_path) # open document
image_paths = []
for page in doc: # iterate through the pages
pix = page.getPixmap(matrix=mat)
image_path = '{0}_{1}.jpg'.format(dest_path, page.number+1)
pix.writeImage(image_path)
image_paths.append(image_path)
return image_paths
html的报表



