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