python pdf跨页表格转换为excel

查看 61|回复 4
作者:whz1998   
朋友让帮忙写个pdf转word的 但是里面涉及到跨页的表格,单纯读取转换好像不行 然后就百度写了个这玩意
import pdfplumber
import pandas as pd
import os
from openpyxl import load_workbook
from datetime import datetime
# page_chars最尾部的非空字符
def tail_not_space_char(page_chars):
    i = -1
    while page_chars[i].get('text').isspace():
        i = i - 1
        # print(page_chars[i].get('text'), i)
    return page_chars[i]
# 返回列表最头部的非空字符
def head_not_space_char(page_chars):
    i = 0
    while page_chars[i].get('text').isspace():
        i += 1
        # print(page_chars[i].get('text'), i)
    return page_chars[i]
# 将pdf表格数据抽取到文件中
def extract_tables(input_file_path, output_excel_path):
    pdfList=[]
    print("========================================表格抽取开始========================================")
    # 读取pdf文件,保存为pdf实例
    pdf = pdfplumber.open(input_file_path)
    # 存储每个页面最底部字符的y0坐标
    y0_bottom_char = []
    # 存储每个页面最底部表格中最底部字符的y0坐标
    y0_bottom_table = []
    # 存储每个页面最顶部字符的y1坐标
    y1_top_char = []
    # 存储每个页面最顶部表格中最顶部字符的y1坐标
    y1_top_table = []
    # 存储所有页面内的表格文本
    text_all_table = []
    # 获取当前日期为转换后的文件名
    current_datetime = datetime.now()
    # 格式化为"YYYY-MM-DD HH:MM:SS"的字符串
    formatted_datetime = current_datetime.strftime("%Y-%m-%d %H-%M-%S")
    fileName=formatted_datetime+".xlsx"
    # print("格式化后的日期时间:", formatted_datetime)
    # 访问每一页
    print("1===========开始抽取每页顶部和底部字符坐标及表格文本===========1")
    for page in pdf.pages:
        # table对象,可以访问其row属性的bbox对象获取坐标
        table_objects = page.find_tables()
        text_table_current_page = page.extract_tables()
        if text_table_current_page:
            text_all_table.append(text_table_current_page)
            # 获取页面最底部非空字符的y0
            y0_bottom_char.append(tail_not_space_char(page.chars).get('y0'))
            # 获取页面最底部表格中最底部字符的y0,table对象的bbox以左上角为原点,而page的char的坐标以左下角为原点,可以用page的高度减去table对象的y来统一
            y0_bottom_table.append(page.bbox[3] - table_objects[-1].bbox[3])
            # 获取页面最顶部字符的y1
            y1_top_char.append(head_not_space_char(page.chars).get('y1'))
            # 获取页面最顶部表格中最底部字符的y1
            y1_top_table.append(page.bbox[3] - table_objects[0].bbox[1])
    print("1===========抽取每页顶部和底部字符坐标及表格文本结束===========1")
    # 处理跨页面表格,将跨页面表格合并,i是当前页码,对于连跨数页的表,应跳过中间页面,防止重复处理
    print("2===========开始处理跨页面表格===========2")
    i = 0
    while i = len(text_all_table):
            break
        j = i + 1
        k = 1
        # 要处理的页为空时退出
        while text_all_table[j]:
            if y0_bottom_table[i] = y1_top_table[j]:
                # 当前页面最后一个表与待处理页面第一个表合并
                text_all_table[i][-1] = text_all_table[i][-1] + text_all_table[j][0]
                text_all_table[j].pop(0)
                # 如果待处理页面只有一个表,就要考虑下下一页的表是否也与之相连
                if not text_all_table[j] and j + 1
还有点问题 最后那个分数 小数点后面四舍五入了 但是他这个不咋需要 就没改

表格, 页面

Arcticlyc   

这是保存到 word 还是 Excel 呀?最后两张图片有啥区别呀?
whz1998
OP
  


Arcticlyc 发表于 2024-5-16 00:32
这是保存到 word 还是 Excel 呀?最后两张图片有啥区别呀?

最后两个图上传重复了,保存成excel  写错了 不好意思
Arcticlyc   


whz1998 发表于 2024-5-16 00:34
最后两个图上传重复了,保存成excel  写错了 不好意思

嗷嗷,这是可以提取出 pdf 中跨页的表格吗?
whz1998
OP
  


Arcticlyc 发表于 2024-5-16 00:37
嗷嗷,这是可以提取出 pdf 中跨页的表格吗?

是的 就那个数据有点问题 精确到多少位之后 就开始四舍五入了 我没改
您需要登录后才可以回帖 登录 | 立即注册

返回顶部