栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

PDF解析业务含义_PDF解析失败null啥意思?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PDF解析业务含义_PDF解析失败null啥意思?

        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的报表

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号