当前位置: 首页 > article >正文

python实现PDF表格与文本分别导出EXCEL

现需将pdf 转换至Excel ,
目前实现方式:将PDF的TABLE部分与 非 TABLE部分分别导出至Excel两个sheet中
1)、识别PDF中的表格块
2)、将PDF转换为Word格式
3)、提取Word中非表格的文本数据
4)、对文本与表格重复的行进行去重
5)、合并导出至Excel不同sheet页中

# coding=UTF8
import datetime
from docx import Document
from pdf2docx import Converter
import pandas as pd
import numpy as np
import pdfplumber
import os
import fitz


# TODO 输出PDF表格数据至Excel
def extractTables(filepath):
    with pdfplumber.open(filepath) as pdf:
        tables = []
        for i in range(0, len(pdf.pages)):
            page = pdf.pages[i]
            tables.append(page.extract_tables())

        df = pd.DataFrame()
        df_seperation = pd.DataFrame([np.nan, np.nan])  # 创建空白的,用于充当分隔行

        for i in range(0, len(tables)):
            tabular = tables[i]  # 选取第i页的表格
            if len(tabular) > 0:  # 如果该页存在表格的话
                for j in range(0, len(tabular)):  # j  表示第几个表格
                    df_temp = pd.DataFrame(tabular[j])
                    df = pd.concat([df, df_seperation, df_temp])  # 更新总表格
        return df


# TODO pdf 转Word
def extractWord(pdffilepath, wordfilepath):
    cv = Converter(pdffilepath)
    cv.convert(wordfilepath)
    cv.close()


# TODO 获取非表格内容
def getDocLines(wordfilepath):
    doc = Document(wordfilepath)
    paragraphs = doc.paragraphs
    lines = []
    for paragraph in paragraphs:
        line = paragraph.text.strip()

        if not line:
            continue
        lines.append(line)
    # aspose用的体验板,带有页眉
    # lines = lines[100:]
    # print(lines)
    df = pd.DataFrame(lines)
    return df


# TODO 删除与table重复的行数据
def txt(tabledf, txtdf):
    lines = []
    for line in tabledf[0]:
        lines.append(str(line))

    # 获取txt与Excel重复的数据
    repeat_txt = []
    for line in lines:
        for txt in txtdf[0]:
            if line.find(txt) != -1:
                repeat_txt.append(txt)
                txtdf = txtdf.drop(txtdf[txtdf[0] == txt].index)

    return txtdf


if __name__ == '__main__':
    filepath = 'D:\develop_python\Python_Demo\PDF_TO_EXCEL\YM2021\\'
    outpath = 'D:\develop_python\Python_Demo\PDF_TO_EXCEL\YM2021\\'
    pdffile = '南通-2.21'

    pdffilepath = filepath + str(pdffile) + '.pdf'
    excelfilepath = filepath + str(pdffile) + '.xlsx'
    wordfilepath = filepath + str(pdffile) + '.docx'

    # 获取PDF表格数据
    try:
        starttime = datetime.datetime.now()
        print('执行开始', starttime)
        if not os.path.exists(outpath):
            os.makedirs(outpath)

        print()
        print('正在读取表格数据........')
        tabledf = extractTables(pdffilepath)
        print('表格数据读取完成........')
        print()

        print('正在转换Word......')
        extractWord(pdffilepath, wordfilepath)
        print('Word转换完成......')
        print()

        print('正在解析非表格文本数据......')
        txtdf = getDocLines(wordfilepath)
        # 删除与table重复的行数据
        df = txt(tabledf, txtdf)
        print('非表格数据解析完成......')
        print()

        print('正在输出Excel文件......')
        writer = pd.ExcelWriter(excelfilepath)
        tabledf.to_excel(writer, sheet_name='EXCEL', index=False)
        # txtdf.to_excel(writer, sheet_name='txt', index=False)
        df.to_excel(writer, sheet_name='txt', index=False)
        writer.save()
        print('Excel文件输出成功......')
        print()

        endtime = datetime.datetime.now()
        print('执行结束', endtime)
        print('耗时', endtime - starttime)
    except Exception  as e:
        print(Exception, e.args)


http://www.kler.cn/a/106465.html

相关文章:

  • Spring中的Bean
  • 基于PHP技术的校园站的设计与实现
  • 【优选算法 — 滑动窗口】水果成篮 找到字符串中所有字母异位词
  • debian 系统更新升级
  • 【vue3中el-table表格高度自适应】
  • 苦等三年!金克斯大人回来了!
  • HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求
  • 31一维信号滤波(限幅滤波、中值滤波、均值滤波、递推平均滤波),MATLAB程序已调通,可直接运行。
  • spring.factories介绍
  • 用python做一个压缩图片的小程序
  • ReentranLock超详细讲解
  • 俄罗斯黑客利用Roundcube零日漏洞窃取政府电子邮件
  • Makefile 基础教程:从零开始学习
  • Kubernetes - 一键安装部署 K8S(附:Kubernetes Dashboard)
  • node(三)express框架
  • Python解读市场趋势:LSTM 和 GRU 在预测 Google 股价方面的探索
  • 计算机网络之数据链路层(全)
  • 机器学习——正则化
  • python---设计模式(单例模式和工厂模式)
  • HCL模拟器选路实验案例
  • Linux系统之file命令的基本使用
  • 在3分钟内使用AI-Chat生成精美PPT(附AI工具)
  • 10个Golang 数据库最佳实践
  • Android 13.0 SystemUI状态栏屏蔽掉通知栏不显示通知
  • 【登录安全测试】
  • 【进程概念③】:进程环境变量/进程切换