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

【pfg】

def get_pdf_table(pdf_path,col_name): """ 提取pdf表格数据 :param pdf_path: 需要提取的pdf文件绝对路径 :param col_name: 需要特殊处理的列名 :return: """ try: # 打开PDF文件 with pdfplumber.open(pdf_path) as pdf: index_col_name = -1 # col_name的列下标,默认为-1 为-1表示不存在该列 header_all = [] # 遍历每一页 for page_num, page in enumerate(pdf.pages, 1): # 提取表格 tables = page.find_tables(custom_settings) if not tables: # 未发现表格,直接继续下一页 continue for table in tables: table_text = table.extract() table_cells = table.cells table_col_num = len(table_text[0]) if table_col_num <= 2: #丢弃2列的表数据 continue cell_span_result = find_cell_span(table_cells) # 获取该表格中横向和纵向合并细节 header_index_array = get_header_index(table_text, cell_span_result) # 获取表头开始行下标和结束行下表 content_index = header_index_array[1] + 1 # 表头页数据开始行下标 header_result = set_span_cell_all(table_text[header_index_array[0]:content_index], cell_span_result, header_index_array[0]) # 表头数据预处理,将所有合并单元格均浮上同样的值 header = get_header(header_result) # 将不同的值用_连接起来 if header not in header_all: header_all.append(header) output_csv = os.path.splitext(pdf_path)[0] + str(header_all.index(header)) + '.csv' # 找到表下标 with open(output_csv, 'a', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(header) # 写入表头 print(f"已提取表头:页面:{page_num}, {header},{col_name}列索引:{index_col_name}", file=sys.stderr) else: content_index = header_index_array[1] - header_index_array[0] + 1 # 非表头页数据开始行下标 output_csv = os.path.splitext(pdf_path)[0] + str(header_all.index(header)) + '.csv' # 找到表下标 data_rows = table_text[content_index:] # 非表头页数据处理 try: index_col_name = header.index(col_name) # 获取特殊内容的列下标 需要兼容不存在特殊内容列的情况 except: pass result = set_span_cell_special(data_rows, cell_span_result, index_col_name, content_index) with open(output_csv, 'a', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerows(result) # 写入表头 print(f"✅ 成功将PDF表格提取为CSV: {os.path.abspath(output_csv)}") except Exception as e: print(f"提取文件:{pdf_path}失败,失败原因:{e}")
http://www.jsqmd.com/news/461442/

相关文章:

  • ubuntu mujoco安装好以后如何通过python那个它
  • 20260310_170257_渗透测试人员守则:基础知识
  • OpenClaw 从 0 到 1:本地部署 + 飞书机器人(避坑实战)
  • python2自动打卡脚本
  • Minio分布式集群+nginx+keepalived部署
  • 前端八股文面经大全:字节跳动前端二面部分(2026-01-13)·面经深度解析
  • 为什么PHP的浮点数运算(如0.1+0.2)结果不是精确的0.3?IEEE浮点数标准是如何表示小数的?
  • OpenClaw 在 Windows 系统下的完整安装部署指南
  • 2026年3月东莞试验箱厂家靠谱推荐:恒温恒湿、交变湿热热、两箱式冷热冲击、三箱式冷热冲击、盐雾试验箱,艾博仪器解锁东莞试验箱优质之选 - 海棠依旧大
  • 2026实测|8款封神PPT工具,AI博主私藏,职场/学生/技术党直接抄作业
  • GESP / CSP-J入门讲解:题目的 题意分析 + C++题解
  • 2026软考资料,看这一篇就够了
  • 数字遗体化妆师:给去世程序员的代码做美容
  • python字符串、列表介绍
  • 为什么同一个类中方法互调,@Transacational会失效
  • ARM处理器指令系统——指令流水线(下,指令流水线的发展简介、影响流水线性能的因素)
  • 学鸿蒙开发好找工作吗?—— 百万人才缺口,引爆黄金职业风口
  • 国内GitHub镜像站搭建全攻略
  • 20260310_165916_网络安全:全网最全渗透测试指南,让你彻底看懂系统漏洞
  • 回归疫情预测
  • 深度学习卷积神经网络车牌识别系统
  • SQLAlchemy 高级批量插入笔记(标量子查询 + 显式参数绑定)
  • 类和动态内存分配(在构造函数中使用new 时应注意的事项)
  • Java常用API之String类
  • 图解最常用的 10 个机器学习算法!线性回归、逻辑回归、决策树、随机森林...
  • 喊着“全面拥抱AI”,可我连从哪下手都不知道——一位制造业软件工程师的真心话
  • 找当下口碑好的卡式风机盘管公司?2026年这些受认可,卧式暗装风机盘管/工业暖风机,卡式风机盘管批发厂家怎么选择 - 品牌推荐师
  • Druid 1.2.28发布,多项性能优化升级
  • Go语法练习小项目
  • 核心接口使用(四)Tool和MCP(2)MCP Server