深入探索PDF源码解析:从PDF到Excel的数据统计分析找到正文

在数字化时代,数据已成为企业决策和业务运营的关键。PDF文档作为一种广泛使用的文件格式,其中蕴含着大量有价值的信息。然而,PDF文档的结构和格式使得直接对其进行数据提取和分析变得复杂。为了解决这个问题,我们采取了一种创新的方法:将PDF文档转换为HTML格式,再将HTML内容转换为Excel格式,以便进行深入的数据统计分析。
在探索这一方法的过程中,我们发现了一些有趣的现象,尤其是在页眉页脚和页码信息的出现上。这些高频内容为我们提供了关于文档结构和内容的重要线索。

PDF到HTML的转换

首先,我们使用专业的PDF转换工具将PDF文档转换为HTML格式。这个工具能够识别PDF文档中的文本内容,并将其布局转换为HTML格式,保留了原有的格式和结构。转换后的HTML文档可以被浏览器打开,并且其内容可以被进一步处理。

HTML到Excel的转换

接下来,我们使用HTML转Excel工具将HTML内容转换为Excel格式。这个工具能够识别HTML中的文本内容,并按照表格的格式将其转换为Excel表格。每个单元格对应HTML中的一个文本元素,使得我们能够将HTML中的内容以Excel表格的形式进行统计分析。

import json
import os
import reimport fitz
import pandas as pd
from bs4 import BeautifulSoup
from tqdm import tqdmimport htmldef is_contain_chinese(check_str):""" 判断字符串中是否包含中文 """for char in check_str:# 检查字符的Unicode编码是否在中文范围内if '\u4e00' <= char <= '\u9fff':return Truereturn Falsedef pdf2html(input_path, html_path):doc = fitz.open(input_path)print(doc)chinese_html_content = "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><title>Title</title></head><body style=\"display: flex;justify-content: center;flex-direction: column;background: #0e0e0e;align-items: center;\">"html_content = "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><title>Title</title></head><body style=\"display: flex;justify-content: center;flex-direction: column;background: #0e0e0e;align-items: center;\">"for page in tqdm(doc):html_content += page.getText('html')check_html_content = html.unescape(page.getText('html'))if 'image' in check_html_content:continueif is_contain_chinese(check_html_content):chinese_html_content += check_html_contentprint("开始输出html文件", input_path)#     print(html.unescape(html_content))html_content += "</body></html>"chinese_html_content += "</body></html>"html_content = html.unescape(html_content)with open(os.path.join("html", os.path.split(html_path)[-1]), 'w', encoding='utf8', newline="") as fp:fp.write(html_content)with open(os.path.join("chinese_html", os.path.split(html_path)[-1]), 'w', encoding='utf8', newline="") as fp:fp.write(chinese_html_content)import globpdf_path = glob.glob("../../企业年报/*.pdf")
chinese_htmls = glob.glob("chinese_html/*.html")
for chinese_html in chinese_htmls:# HTML片段html_fragment = open(chinese_html, "r", encoding="utf-8").read()# 解析HTMLsoup = BeautifulSoup(html_fragment, 'lxml')# 提取<body>标签下的所有<p>标签body = soup.bodyp_tags = body.find_all('p')# 定义一个函数来从style字符串中提取top和left值def get_position(style):if style:styles = style.split(';')top = left = Nonefor s in styles:if 'top' in s:top = s.split(':')[1]if 'left' in s:left = s.split(':')[1]return {'top': top, 'left': left}return {}# 定义一个函数来从style字符串中提取font-size值def get_font_size(style):if style:for item in style.split(';'):if 'font-size' in item:return item.split(':')[1]return None# 创建一个空列表来存储提取的数据data = []# 定义一个函数来使用正则表达式提取font-size值def get_font_size_regex(style):# 使用正则表达式查找font-size属性,并提取值font_size_match = re.search(r'font-size:\s*([\d.]+)pt', style)return font_size_match.group(1) if font_size_match else None# 遍历所有的<p>标签for p in p_tags:if 'style' not in str(p):continuefont_size = get_font_size_regex(str(p))# 提取<p>标签的文本、位置和字体大小p_data = {'text': p.get_text(),'position': get_position(p['style']),'font_size': font_size,'children': []}# 遍历<p>标签下的所有子标签for child in p.children:if child.name:# try:# print(child.find('b'))font_size = get_font_size_regex(str(child))child_data = {'tag': child.name,'text': child.get_text(),'font_size': font_size}p_data['children'].append(child_data)# except:# print(child)# 将<p>标签的数据添加到列表中data.append(p_data)# 将数据转换为JSON格式json_data = json.dumps(data, ensure_ascii=False, indent=4)# print(json_data)chinese_json = chinese_html.replace("html", "json_with_out_child")json.dump(data, open(chinese_json, "w",encoding="utf-8"), ensure_ascii=False, indent=4)chinese_excel = chinese_html.replace("html", "excel")pd.DataFrame(data).to_excel(chinese_excel + ".xlsx")

页眉页脚和页码信息的发现

在转换过程中,我们观察到在某些位置,相同的内容频繁出现,这包括了页眉页脚和页码信息。这些信息通常出现在页面的顶部或底部,并且在每页上都保持一致。这些高频内容的出现为我们提供了宝贵的信息,帮助我们更好地理解PDF文档的结构和内容。
在这里插入图片描述
我们来观察同样位置前三名分别是什么内容
第一名 {‘top’: ‘44pt’, ‘left’: ‘56pt’}
在这里插入图片描述
通过观察 第一名 内容为文档的页眉
第二名 {‘top’: ‘778pt’, ‘left’: ‘56pt’}
在这里插入图片描述
第二名 内容为文档的页码
第三名 {‘top’: ‘770pt’, ‘left’: ‘90pt’}在这里插入图片描述
第三名 内容为文档的页码
第四名 {‘top’: ‘43pt’, ‘left’: ‘89pt’}
在这里插入图片描述
第四名 依旧是页眉
除了基于文本的位置进行解析,我们还可以基于类型加文本加字体大小的方式进行文档的排序。
在这里插入图片描述
这里我们可以观察到第二段文本:
标签:[‘span’, ‘span’, ‘span’, ‘span’]
文本:[‘宁波先锋新材料股份有限公司’, ’ 2021’, ’ 年年度报告全文’, ’ ']
字体大小:[‘9’, ‘9’, ‘9’, ‘9’] 这一段文本包含了一家公司名称、年份和报告标题,通常出现在报告的标题或头部信息中。
不过其他两项就很难去除。

深入的数据统计分析

通过将PDF文档转换为HTML格式,然后将HTML内容转换为Excel格式,我们成功地将PDF文档中的内容以表格的形式进行了统计分析。在这个过程中,我们发现了页眉页脚和页码信息的高频出现,为我们提供了关于页面结构的重要信息。

结论与展望

通过这种方法,我们不仅能够提取和分析PDF文档中的文本内容,还能够深入了解文档的结构和布局。这种方法不仅适用于PDF文档,也可以应用于其他类型的文档,如Word文档、Excel表格等。通过这种方法,我们可以更加方便地进行数据处理和分析,提高工作效率。
未来,我们可以进一步探索如何优化这一流程,提高转换的准确性和效率。同时,我们也可以研究如何将更多的PDF文档特性,如图表、图像等,也纳入到数据分析的范畴中,以获得更全面的数据洞察。
总之,PDF源码解析是一个充满挑战和机遇的领域。通过将PDF转换为HTML,再将HTML转换为Excel,我们能够更深入地分析和利用PDF文档中的数据。随着技术的不断进步,我们相信未来将有更多的方法和工具出现,帮助我们更好地挖掘PDF文档中的价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400305.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入实例(sqli-labs/less-17)

0、初始网页 1、确定闭合字符 注入点在于password框&#xff0c;闭合字符为单引号 2、爆库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1)# 1 and (select 1 from (select count(*),concat((select database()),floor(rand()*2))x from information_schema.tables gr…

经纬恒润亮相第四届焉知汽车年会,功能安全赋能域控

8月初&#xff0c;第四届焉知汽车年会在上海举行。此次年会围绕当下智能电动汽车的热点和焦点&#xff0c;聚焦于智能汽车场景应用、车载通信、激光雷达、智能座舱、功能安全、电驱动系统等多个领域&#xff0c;汇聚了来自OEM、科技公司、零部件供应商、测试认证机构、政府院校…

Spark SQL Catalyst工作流程

我们写的SQL语句&#xff0c;会经过一个优化器 (Catalyst)&#xff0c;转化为 RDD&#xff0c;交给集群执行。 而Catalyst在整个Spark 生态中的地位也是至关重要的。 SQL到RDD中间经过了一个Catalyst&#xff0c;它就是Spark SQL的核心&#xff0c;是针对Spark SQL语句执行过程…

使用pytest+selenium编写网页UI自动化脚本和用例

1 UI自动化测试 UI自动化测试&#xff08;User Interface Automation Testing&#xff09;是一种通过编写脚本或使用自动化测试工具&#xff0c;对界面&#xff08;UI&#xff09;进行自动化测试的方法。原理主要是模拟用户打开客户端或网页的UI界面&#xff0c;自动化执行用户…

kali安装docker

docker 安装 ● 1、更新 kali 下载资料源&#xff1a;apt-get update ● 2、如果出现上面没有数字签名问题&#xff0c;那就是需要下载证书 使用命令&#xff1a; wget archive.kali.org/archive-key.asc #下载证书 apt-key add archive-key.asc #添加证书 ● 3、重新更新一…

redis列表若干记录

2、列表 ziplist ziplist参数 entry结构 entry-data:节点存储的元素prelen&#xff1a;记录前驱节点长度encoding&#xff1a;当前节点编码格式encoding encoding属性 使用多个子节点存储节点元素长度&#xff0c;这种多字节数据存储在计算机内存中或者进行网络传输的时的字节…

redis面试(十六)公平锁释放和排队加锁

锁释放 RedissonFairLock.unlockInnerAsync()方法 这和加锁的逻辑没有太大区别 也就是说在客户端A他释放锁的时候&#xff0c;也会走while true的脚本逻辑&#xff0c;看一下有序集合中的元素的timeout时间如果小于了当前时间&#xff0c;就认为他的那个排队就过期了&#xf…

如何减少 Docker 镜像大小:6 种优化方法

如果您想减少docker镜像的大小&#xff0c;您需要使用构建docker镜像的标准最佳实践。 本博客讨论了您可以快速实施的各种优化技术&#xff0c;以制作最小、最精简的 docker 镜像。我们还将介绍一些用于 Docker 镜像优化的最佳工具。 Docker 作为一种容器引擎&#xff0c;可以…

k8s核心架构分析

k8s核心概念概述 Kubernetes入门&#xff1a;掌握集群核心&#xff0c;释放容器潜能 技术爱好者们&#xff0c;CD集群的核心概念是构建、部署和管理容器化应用的基石。掌握这些概念&#xff0c;不仅助你深入理解技术细节&#xff0c;更能在CD集群中自如操作&#xff0c;无论是…

2 C 语言开发工具选择、 MinGW 的安装与配置、VS Code 的安装与配置、插件推荐

目录 1 开发工具选择 1.1 Visual Studio 1.2 Code::Block 1.3 Clion 1.4 VS Code 1.5 在线编辑工具 2 开发工具安装 2.1 安装 MinGW-w64 2.1.1 MinGW-w64 介绍 2.1.2 解压 MinGW 2.1.3 将 MinGW 添加至环境变量 2.1.4 验证安装 2.2 安装 VS Code 2.2.1 下载安装包…

Avnet ZUBoard 1CG开发板上手—深度学习新选择

Avnet ZUBoard 1CG 开发板上手—深度学习新选择 摘要 本文主要介绍了 Avnet ZUBoard 1CG 开发板的特性、架构、硬件单元等概念&#xff0c;并对如何使用以太网接口和串口连接开发板进行基本介绍&#xff0c;同时辅以两个应用例程演示其功能。 原文链接&#xff1a; FreakSt…

如何编写一个CMakeLists.txt文件(由简到难,较详细)

在Linux系统下&#xff0c;经常使用CMakeLists.txt文件来链接、编译C工程&#xff0c;大部分人clone的代码里都是有CMakeLists.txt文件的&#xff0c;只需要cmake .. 和make就完事了&#xff0c;但在工作中&#xff0c;你必须要有从无到有编写CMakeLists.txt文件的能力。 一、…

【QGroundControl二次开发】十. QT添加GStreamer视频播放同时保存

上一章介绍使用QT播放GStreamer视频流 【QGroundControl二次开发】八. QT实现播放gstreamer视频。 这章介绍如何在原有基础上保存为视频&#xff0c;同时保存为一个个规定大小的小视频。 一. 思想 之前的文章展示了如何在QT中播放GST视频流&#xff0c;这章在原有的基础上增加…

金九银十,软件测试面试题合集(含答案)

前言 前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些…

常见的几种用例测试方法

等价类划分法 适用场景&#xff1a;需要有大量的测试数据输入&#xff0c;但是我们实际测试中不可能一一列举进行测试&#xff0c;所以讲数据进行分类&#xff0c;选出具有代表性的数据代表一类数据进行测试。 分类&#xff1a; 有效等价类&#xff1a;满足需求的数据无效等…

普元EOS-新项目不停提示登录信息已过期

1 问题 新创建的EOS精简应用&#xff0c; 项目端口为 28015 启动后&#xff0c;在浏览器输入地址 http://127.0.0.1:28015 。 页面不停提示 “登录信息已过期” 2 解决办法 EOS的项目对Login-Filter的配置错误&#xff0c; EOS的项目在Http安全过滤管理的时候&#xff0c;会…

【原创】java+swing+mysql商品信息管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景&#xff1a; 使用javaswing技…

使用mybatis注解和xml映射执行javaWeb中增删改查等操作

Mapper接口 使用注解执行SQL语句操作和相应的Java抽象类&#xff08;对于简单的增删改查使用注解&#xff09; Mapper public interface EmpMapper {// 根据id删除员工信息Delete("delete from mybatis.emp where id#{id}")public int EmpDelete(Integer id);// 查…

【mysql 第一篇章】系统和数据库的交互方法

一、宏观的查看系统怎么和数据库交互 在我们刚刚接触系统和数据库的时候不明白其中的原理&#xff0c;只知道系统和数据库是需要交互的。所以我们会理解成上图的形式。 二、MYSQL 驱动 随着我们的学习时间的加长以及对程序的了解&#xff0c;发现链接数据库是需要有别的工具辅…

可乐机的设计验证

前言 状态机&#xff08;State Machine&#xff09;是一种数学模型&#xff0c;用于表示具有有限状态集合的系统。它通过定义状态、转移规则和事件&#xff0c;描述系统在不同条件下的行为。状态机的核心概念包括状态、事件、转移和动作。状态是系统的具体条件或配置&#xff0…