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

news2024/11/13 10:00:54

在数字化时代,数据已成为企业决策和业务运营的关键。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 re

import fitz
import pandas as pd
from bs4 import BeautifulSoup
from tqdm import tqdm

import html


def is_contain_chinese(check_str):
    """ 判断字符串中是否包含中文 """
    for char in check_str:
        # 检查字符的Unicode编码是否在中文范围内
        if '\u4e00' <= char <= '\u9fff':
            return True
    return False


def 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:
            continue
        if is_contain_chinese(check_html_content):
            chinese_html_content += check_html_content

    print("开始输出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 glob

pdf_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()

    # 解析HTML
    soup = BeautifulSoup(html_fragment, 'lxml')

    # 提取<body>标签下的所有<p>标签
    body = soup.body
    p_tags = body.find_all('p')


    # 定义一个函数来从style字符串中提取top和left值
    def get_position(style):
        if style:
            styles = style.split(';')
            top = left = None
            for 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):
            continue
        font_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.coloradmin.cn/o/2035086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

⌈ 传知代码 ⌋ 基于ROS的气体浓度建图

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

免杀笔记--->地狱之门(Hell ‘s Gate)保姆级解析

还记得我前面一篇文章讲到的在Ring3 对抗Hook吗&#xff1f;&#xff1f; 我讲到的一种方法就是系统调用&#xff01;&#xff01; 那么今天就来讲一下一个很出名的直接系统调用(Syscall)-----> [!] 地狱之门&#xff08;Hell s Gate&#xff09;[!] 目录 1.Syscall 2.…

Python爬虫:下载4K壁纸

&#x1f381;&#x1f381;创作不易&#xff0c;关注作者不迷路&#x1f380;&#x1f380; 目录 &#x1f338;完整代码 &#x1f338;分析 &#x1f381;基本思路 &#x1f381;需要的库 &#x1f381;提取图片的链接和标题 &#x1f453;寻找Cookie和User-Agent &…

Golang 并发编程

Golang 并发编程 Goroutine 什么是协程 创建 Goroutine 主 goroutine &#xff08;main函数&#xff09;退出后&#xff0c;其它的工作 goroutine 也会自动退出 package mainimport ("fmt""time" )func myFunc() {i : 0for {ifmt.Println("func: …

【C++】深入理解类和对象(3)

励志冰檗&#xff1a;形容在清苦的生活环境中激励自己的意志。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;再探构造函数 &#x1f34b;知识点二&#xff1a;类型转换 &#x1f34b;知识点三&#xff1a;static成员 &…

spl注入实战thinkphp

目录 一、环境的部署 二、本地创建数据库 三、填写数据库连接文件 四、编写控制器 五、访问分析 debug报错会显示物理路径 原因是config.php文件相关配置 六、注入分析 七、进入断点调试 八、通过mysql执行语句查看结果 九、总结&#xff1a; 一、环境的部署 二、本地…

【51单片机仿真】基于51单片机设计的智能六位密码锁(匿*输入/密码修改/警示/保存/恢复/初始密码)源码仿真设计文档演示视频——文末资料下载

基于51单片机设计的智能六位密码锁 演示视频 基于51单片机设计的智能六位密码锁 功能简介 - 能够从键盘中输入密码&#xff0c;并相应地在显示器上显示"*" - 能够判断密码是否正确&#xff0c;正确则开锁&#xff0c;错误则输出相应信息 - 能够实现密码的修改 -…

日志审计系统

1.1日志审计基础性知识 什么是日志&#xff1f; 传统的日志概念 信息系统中所有系统和应用必须包含的描述其自身运行和操作的特定数据记录。 广义的日志概念 针对特定记录目的&#xff0c;通过各种探测手段采集的信息数据&#xff0c;包括运行状态、所有事件及操作&#x…

从零开始实现循环神经网络

本节我们通过使用MXnet&#xff0c;来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后&#xff0c;即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示&#xff1a; 接…

力扣面试经典算法150题:最后一个单词的长度

最后一个单词的长度 今天的题目是力扣面试经典150题中的数组的简单题: 最后一个单词的长度 题目链接&#xff1a;https://leetcode.cn/problems/length-of-last-word/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个仅包含大小写字母和空…

Broken靶机

查看靶机的mac地址 使用kail进行扫描ip 探测靶机主机&#xff0c;端口&#xff0c;服务 nmap -sS -sS -A -p- 192.168.154.137 进行目录扫描 dirsearch -u http://192.168.154.137 拼接后没什么发现 访问靶机ip 访问readme.md 发现是十六进制的值 将内容写入到readme.md中 使…

坐牢第二十五天20240813(网络通信)

一、TCP机械臂测试 通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 注意&#xff1a;关闭计算机的杀毒软件&#xff0c;电脑管家&#xff0c;防火墙 1&#x…

C语言问答进阶--5、基本表达式和基本语句

赋值表达式 表达式是什么&#xff1f;表达式是由运算符和操作数组成的式子。 如下的代码 #include "iostream.h" int main() { int a1,b2,sum; cout<<(sumab)<<endl; return 0; } 那么如下的呢&#xff1f; #include "iostream.h" int mai…

智能建筑系统,实现智慧城市的可持续发展

智能建筑系统是指通过现代技术和通信技术&#xff0c;对建筑系统进行全方位、智能化的管理和控制。该系统可以通过各种传感器、安全监控系统和计算机设备对工程建筑的内外环境进行认知和控制&#xff0c;进而监控和管理建筑工程设备和信息。 智能建筑系统可以调节室温、湿度等环…

基于Hadoop的汽车大数据分析系统设计与实现【爬虫、数据预处理、MapReduce、echarts、Flask】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍爬虫数据概览HIve表设计Cars Database Tables1. cars_data2. annual_sales_volume3. brand_sales_volume4. city_sales_volume5. sales_volume_by_year_and_brand6. sales_distribu…

Mysql的完整性约束

主键约束&#xff1a;一个表中只有一个主键&#xff0c;通过主键找到唯一的记录。主键不能为空不能重复。 CREATE TABLE s1&#xff08;id TINYINT PRIMARY KEY UNSIGNEDINT AUTO_INCREAMENT,name VARCHAR(20) NOT NULL UNIQUE ,age TINYINT DEFAULT 18&#xff09;;…

镜像仓库认证信息加密初始化脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Python爬虫——爬取bilibili中的视频

爬取bilibili中的视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到…

【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核

文章目录 前言 背景介绍 C28x内核 浮点单元(FPU) 快速整数除法单元(FINTDIV) 三角数学单元(TMU) VCRC单元 CPU总线 指令流水线 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解…

Linux--应用层自定义协议与序列化(例子:网络计算器)

目录 0.上篇文章 1.应用层 再谈一谈协议 网络版计算器 序列化 和 反序列化 2.重新理解 read、 write、 recv、 send 和 tcp 为什么支持全双工 3.网络计算器&#xff08;代码实现) 3.1序列化&反序列化的接口 3.2 项目逻辑 3.3 代码 3.3.1辅助库 3.3.2 基于TCP的…