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

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记,仅供参考。

需求:提取AUTOSAR SWS中所有的API接口信息,用于生成C代码。
此处以AUTOSAR_SWS_CANDriver.pdf为例,若需要提取多个SWS文件,遍历各个文件即可。

1.Python包

pdfplumber是一款完全用python开发的pdf解析库,对于线框完全的表格,pdfminer能给出比较好的抽取效果,但是对于线框不完全(包含无线框)的表格,其效果就差了不少。因为在实际项目所需处理的pdf文档中,线框完全及不完全的表格都比较多。
在这里插入图片描述
备注:安装时,可能会因为网络问题,导致pdfplumber安装失败,可以切换国内镜像进行安装,具体命令如下:

pip install pdfplumber -i http://pypi.douban.com/simple

其他国内源如下:

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/

2.实现思路

目标表格
在这里插入图片描述
具体步骤
1、使用extract_tables解析当前page所有表格,判断一个单元格为“Service Name”(关键字)
2、若存在Service Name,将此表格的内容追加到总表
3、读取当前表的同时判断是否是完整的表格,如果不是,则继续读取下一页,在一起追加到总表
备注:第一个单元格不是“Service Name”,存在两种情况,一是非我们想要的表格,另一个是部分我们需要的,后者在步骤3中处理掉,所以无影响
参考代码

import pdfplumberinputFile = "AUTOSAR_SWS_CANDriver.pdf"
functionList = []
# 前15页无有效信息,为提高效率,减少扫描页数
startPage = 15def readPdfFile():global functionListtable_settings = {"vertical_strategy": "lines",    # 对于完整的表格,vertical_strategy与horizontal_strategy都配置为lines"horizontal_strategy": "lines","snap_y_tolerance": 10,          # y方向上较短的线条extract_tables也会识别为表格的边界,最后导致识别出错# 这里将最小像素点设置为10(小于10丢弃线条丢弃)}with pdfplumber.open(inputFile) as pdf:######################################### 仅前期调试使用,具体使用时,可以屏蔽first_page = pdf.pages[63]  # 指定(63+1)页PDF内容im = first_page.to_image()  # 转换为image个数im.reset().debug_tablefinder(table_settings) # 将table_settings配置效果输出到图片方便观看im.save('xx.PNG', format="PNG", quantize=True, colors=256, bits=8)########################################for j in range(len(pdf.pages) - startPage):page = pdf.pages[j + startPage]table = page.extract_tables(table_settings)for i in range(len(table)):   # 遍历所有表格row = table[i]if row[0][0] == 'Service Name':      # 找表头tempList = row                   # 先复制已有的信息if (i == (len(table)-1)) and (row[-1][0] != 'Available via'):  # 最后一个表,且缺少最后一行,继续读取下一页的第一个表page1 = pdf.pages[j + startPage + 1]     # 继续读取下一页table1 = page1.extract_tables(table_settings)for table1_1 in table1[0]:        # 只需要读取第一个表格(其他的会在在下次循环中写入)if table1_1[0] == '':         # 如果第一个表格的第一个参数为空,代表第一行的参数的补充,并不是新的参数,所以此处拼接上去tempList[-1][1] += '\n' + table1_1[1]else:                         # 如果不为空,代表是新参数,直接追加即可tempList.append(table1_1)functionList.append(tempList)         # 最后汇总到总表格内if __name__ == '__main__':readPdfFile()for i in functionList:print(i)print('共%d个函数' % len(functionList))

3.输出结果

最终保存到全局列表functionList中,后续可根据各自的开发规范/要求输出相应的代码。
在这里插入图片描述

4. 配置说明

table_settings = {"vertical_strategy": "lines",    # 对于完整的表格,vertical_strategy与horizontal_strategy都配置为lines"horizontal_strategy": "lines","snap_y_tolerance": 10,          # y方向上较短的线条extract_tables也会识别为表格的边界,最后导致识别出错# 这里将最小像素点设置为10(小于10丢弃线条丢弃)}

4.1 snap_y_tolerance默认值效果

这里可以发现识别了很多无效的边界进入,导致组成了很多多余的单元格,最终识别出错,或者无法识别
在这里插入图片描述
备注:四个正交连接的小圆圈框起来的区域认为是一个单元格,此处不是很明显,具体可以看下图

4.2 snap_y_tolerance配置为10效果

可以很明显看见,上面很多短的边界被忽略掉了。
在这里插入图片描述
备注:“Syntax”出个人了解不应该识别出来,但是此处任然识别出来了,可能因为左侧的两点未连接,所以不影响最终结果,此处未进行深入研究,知道的小伙伴,欢迎讨论

5. 参考资料

1、https://zhuanlan.zhihu.com/p/352722932
2、https://github.com/jsvine/pdfplumber#visual-debugging
3、https://github.com/jsvine/pdfplumber/blob/stable/examples/notebooks/extract-table-nics.ipynb
4、https://zhuanlan.zhihu.com/p/100460222
5、https://zhuanlan.zhihu.com/p/100462752
6、https://zhuanlan.zhihu.com/p/100464246

相关文章:

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记,仅供参考。 需求:提取AUTOSAR SWS中所有的API接口信息,用于生成C代码。 此处以AUTOSAR_SWS_CANDriver.pdf为例,若需要提取多个SWS文件,遍历各个文件即可。 1.Python包 pdfplumber是一款完全用python开…...

UVa1583生成元(Digit Generator)

题目 如果x加上x的各个数字之和得到y&#xff0c;也就是说x是y的生成元。给出n(1<n<100000)&#xff0c;求最小生成元。无解则输出0。 输入输出样例 输入 3 216 121 2005输出 198 0 1979思路 要想解决这个题目&#xff0c;只需要对每一个输入的值从1开始遍历找到小于…...

【Springboot+vue】如何运行springboot+vue项目

从github 或者 gitee 下载源码后&#xff0c;解压&#xff0c;再从idea打开项目 后端代码处理 这是我在gitee下载下来的源码 打开之后&#xff0c;先处理后端代码 该配置的配置&#xff0c;该部署的部署 比如将sql文件导入数据库 然后去配置文件更改配置 然后启动项目 确保…...

拥抱变化,良心AI工具推荐

文章目录 &#x1f4a5; 简介&#x1f344; 工具介绍&#x1f353; 功能特点&#x1f957; 使用场景&#x1f389; 用户体验&#x1f9e9; 下载地址&#x1f36d; 总结 &#x1f4a5; 简介 我是一名资深程序员&#xff0c;但薪资缺对不起资深两个字&#xff0c;为了生存&#x…...

Tensorflow的日志log记录

if OUTPUT_GRAPH:tf.summary.FileWriter("logs/", sess.graph)自动创建文件夹log...

C-语言每日刷题

目录 [蓝桥杯 2015 省 A] 饮料换购 题目描述 输入格式 输出格式 输入输出样例 # [蓝桥杯 2023 省 A] 平方差 题目描述 输入格式 输出格式 输入输出样例 说明/提示 【样例说明】 [NOIP2001 普及组] 数的计算 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例 1 解释 数据…...

十五届海峡两岸电视主持新秀大会竞赛流程

海峡两岸电视主持新秀会是两岸电视媒体共同举办的一项活动&#xff0c;旨在为两岸年轻的电视主持人提供一个展示才华的舞台&#xff0c;促进两岸文化交流和青年交流。本届新秀会是第十二届海峡两岸电视艺术节的重要活动之一。本次竞赛赛制流程如下&#xff1a; &#xff08;1&…...

安全行业招聘信息汇总

1. 阿里巴巴-淘天集团-安全部 社招岗位&#xff1a;Java开发 招聘层级&#xff1a;P5-P6 工作年限&#xff1a;本科毕业1-3年&#xff0c;硕士毕业1-2年 base地点&#xff1a;杭州 职位描述 负责淘天安全部风控基础标签平台0到1能力建设及产品规划和落地。负责标签应用的产品…...

【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更新driver

之前讲到基于python的自动化测试环境&#xff0c;需要安装Python,再安装Selenium。具体可看【如何学习Python自动化测试】—— 自动化测试环境搭建 但是&#xff0c;想要使用Selenium发送指令模拟人类行为操作浏览器&#xff0c;就需要安装浏览器驱动。不同的浏览器需要安…...

Spring Data Redis切换底层Jedis 和 Lettuce实现

1 简介 Spring Data Redis是 Spring Data 系列的一部分&#xff0c;它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象&#xff0c;还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis&#xff0c;并且可以切换Jedis和Lett…...

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…...

一文读懂MongoDB的全部知识点(1),惊呆面试官。

文章目录 01、mongodb是什么&#xff1f;02、mongodb有哪些特点&#xff1f;03、你说的NoSQL数据库是什么意思&#xff1f;NoSQL与RDBMS直接有什么区别&#xff1f;为什么要使用和不使用NoSQL数据库&#xff1f;说一说NoSQL数据库的几个优点?04、NoSQL数据库有哪些类型?05、M…...

仅仅通过提示词,GPT-4可以被引导成为多个领域的特定专家

The Power of Prompting&#xff1a;提示的力量&#xff0c;仅通过提示&#xff0c;GPT-4可以被引导成为多个领域的特定专家。微软研究院发布了一项研究&#xff0c;展示了在仅使用提策略的情况下让GPT 4在医学基准测试中表现得像一个专家。研究显示&#xff0c;GPT-4在相同的基…...

23.Oracle11g的UNDO表空间

Oracle的UNDO表空间 一、UNDO表空间概述1、什么是UNDO表空间2、UNDO表空间的作用2.1 提供一致性读2.2 回滚事务2.3 实例恢复 3、UNDO表空间的工作机制 二、UNDO表空间的相关操作1、UNDO表空间的创建2、UNDO表空间的管理 三、Oracle 11g中UNDO表空间的新特性1、UNDO表空间自动管…...

Mybatis 操作续集2(结合上文)

Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…...

LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…...

12.整数转罗马数字

C不能像Python那样使用c*num的形式&#xff0c;重复字符&#xff0c;老老实实减吧。 class Solution { public:string intToRoman(int num) {string ans "";int res num;while (res ! 0) {if (res > 1000) {ans M;res - 1000;} else if (res > 900) {ans …...

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而&#xff0c;长时间的文稿创作不仅费时费力&#xff0c;还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…...

PTA:平方回文数

题干 在数学里面&#xff0c;有一种数字正着读和反着读结果都一样&#xff0c;我们把这种数称为回文数。如果一个回文数&#xff0c;它同时还是某一个数的平方&#xff0c;这样的数字叫做平方回数。 本题要求输出小于正整数N的所有平方回数。 &#xff08;注&#xff1a;个位数…...

从“AI证件照”到“AI译制片”,爆款AIGC应用的商业化迷思

让郭德纲飙英文、让霉霉说中文的翻译视频生成工具HeyGen和掀起AI证件照热潮的“妙鸭相机”一样&#xff0c;在一阵疯狂刷屏之后&#xff0c;又迅速在各大群里销声匿迹了。 十月份&#xff0c;由HeyGen制作的各种明星跨语言翻译视频&#xff0c;在全网疯传&#xff0c;大家震撼于…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...