PDF/Word文本表格提取转HTML的格式一致性及跨页表格处理咨询
解决方案
一、统一PDF与Word提取数据的格式
- 定义统一中间数据结构:不管从Word(用python-docx)还是PDF(pdfplumber)提取内容,先转换成标准化的结构。比如文本块用
{"content": "...", "style": {"font_size": 14, "bold": False, "alignment": "left"}, "type": "paragraph"};表格用{"rows": [...], "merged_cells": [...], "style": {"border_width": 1}},后续直接基于这个结构生成HTML。 - 做样式映射规则:把Word的内置样式(Heading 1/2、List Paragraph)和PDF的文本属性(字号、粗细、缩进)做一一对应。比如Word的Heading 1对应PDF中字号≥16且加粗的文本,统一输出为
<h1>标签;Word的项目符号列表和PDF中以•/○开头的文本,统一转换成<ul><li>结构。 - 处理特殊格式兼容:对于Word的换行、分页符,PDF的空白行,统一转换成HTML的段落分隔;对于两者的合并单元格,都在中间结构中记录单元格的跨行/跨列数,生成HTML时用
rowspan/colspan属性。
二、解决pdfplumber跨页表格错误与HTML排版问题
1. 修复跨页表格提取错误
- 优化表格识别参数:在
extract_tables中调整table_settings,优先用线条识别策略,同时保留空白字符避免内容丢失:table_settings = { "vertical_strategy": "lines", "horizontal_strategy": "lines", "keep_blank_chars": True, "text_tolerance": 3, "edge_tolerance": 3 } - 手动合并跨页表格:遍历每页表格时,对比当前页表格的表头(或第一行结构)与上一页最后一个表格的表头是否一致,若匹配则将当前页表格的内容(跳过重复表头)追加到上一页表格中:
def merge_cross_page_tables(pdf_path): merged_tables = [] last_table = None with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: tables = page.extract_tables(table_settings=table_settings) for table in tables: if last_table and len(table[0]) == len(last_table[0]) and table[0] == last_table[0]: # 表头一致,判定为跨页表格,追加内容 last_table.extend(table[1:]) else: merged_tables.append(table) last_table = table return merged_tables
2. 修正HTML排版间距不符问题
- 保留PDF的行间距信息:用
page.extract_words()获取每个文本块的位置属性(top、bottom),计算相邻行的垂直距离,转换成CSS的line-height或margin-bottom:words = page.extract_words(keep_blank_chars=True, use_text_flow=True) prev_bottom = None for word in words: if prev_bottom: line_gap = word["top"] - prev_bottom # 根据gap设置对应的CSS样式 if line_gap > 10: style = "margin-bottom: 8px;" else: style = "line-height: 1.2;" prev_bottom = word["bottom"] - 表格排版还原:生成HTML表格时,根据PDF表格的单元格内边距设置
padding,用border-collapse: collapse统一边框样式;对于跨页表格的分页处,避免生成多余的边框,可在合并后的表格中调整CSS。
内容的提问来源于stack exchange,提问作者Shwapx
相关产品推荐
相关产品推荐

