如何提取亚马逊账单pdf文件中的文本内容并划分成正确表格?
评论
收藏

如何提取亚马逊账单pdf文件中的文本内容并划分成正确表格?

经验分享
缤纷
2024-04-24 18:33·浏览量:1144
缤纷
发布于 2024-04-24 18:331144浏览

场景描述:

  • 提取文本类型的pdf文件中的两个表格文本内容
  • 图中4个固定字段的文本内容不会改变、后两个字段的位置会因为不同文件的内容长度不同而发生变化
  • 直接提取pdf文本内容会因为‘Debits’‘Credits’两列的金额位置无法区分混乱而无法正确划分成表格

pdf文件如图所示:

提取结果如下图所示:



解决思路:

1. 获取四个固定字段关键词位置

2. 根据关键词的位置确定该pdf文件中截取文本内容范围

   如获取表格1内容:

  •    表格1的横纵起始位置为0、结束位置为400(整个文件长度的一半、是固定的参数
  •    ‘’Income‘’纵轴位置为80;
  •   “Transfers”纵轴位置为230;

  那么截取文本范围为横坐标起始位置x0, x1固定为0,400纵坐标起始位置top, bottom是变量,当前为80,230

3. 确定范围后截取该部分文本并根据字段划分成表格


第一步、输入关键词列表(如[‘’Income‘’,  “Transfers”]),获取两个关键词的纵坐标

代码模块:

import pdfplumber
import pandas as pd

def extract_second_y_coordinates(pdf_path, keywords):
    """
    提取PDF文件中指定关键词列表中的每个关键词第1或2或3次出现的纵坐标
    规则:如果关键词只出现了1或者2次则返回第1次或第2次出现的纵坐标,如果出现了3次及以上则返回第3次出现的纵坐标

    参数:
    - pdf_path: PDF文件的路径
    - keywords: 要提取纵坐标的关键词列表

    返回:
    - 一个列表,包含两个关键词第1或2或3次出现时的纵坐标
    """
    coordinates = {keyword: None for keyword in keywords}
    counts = {keyword: 0 for keyword in keywords}

    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            words = page.extract_words()
            for word in words:
                if word['text'] in keywords:
                    counts[word['text']] += 1
                    if counts[word['text']] ==1:
                        coordinates[word['text']] = word['top']
                    if counts[word['text']] ==2:
                        coordinates[word['text']] = word['top']
                    if counts[word['text']] ==3:
                        coordinates[word['text']] = word['top']



    return [coordinates[keyword] for keyword in keywords]

调用模块:


二、提取坐标区域内的表格内容

代码模块:

  关键方法(找GPT提问的结果、感谢晴天老师的帮助):

import pdfplumber

def extract_table_from_area(pdf_filepath, page_num, x0, top, x1, bottom):
    # 打开PDF文件
    with pdfplumber.open(pdf_filepath) as pdf:
        # 选择指定页面
        page = pdf.pages[page_num]
        # 计算裁剪区域,传入横坐标起始位置(x0,x1),纵坐标起始位置(top,bottom)
        bbox = (
            x0,
            top,
            x1,
            bottom
        )
        # 裁剪页面
        cropped_page = page.crop(bbox)
        # 定义表格设置
        table_settings = {
            "vertical_strategy": "text",
            "horizontal_strategy": "text",
            "intersection_x_tolerance": 15
        }
        # 从裁剪后的页面提取表格
        tables = cropped_page.extract_tables(table_settings)
    # 返回提取出的所有表格,每个表格都是一个二维列表
    return tables

调用模块:


三、在主流程中循环判断表格1和2,将提取出来的表格数据进行加工处理

提取出的表格列会拆分得比较细、需要加工处理(循环判断列数>3时,合并第1、2列)

收藏6
全部评论1
最新
发布评论
评论