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

网站建设图片代码做电影网站赚钱的方法

网站建设图片代码,做电影网站赚钱的方法,快速软件开发平台,店铺推广软文范例PDF解析是极其复杂的问题。不可能靠一个工具解决全部问题#xff0c;尤其是五花八门#xff0c;格式不统一的PDF文件。除非有钞能力。如果没有那就看看可以分为哪些问题。 提取文本内容#xff0c;提取表格内容#xff0c;提取图片。我认为这些应该是分开做的事情。python有…   PDF解析是极其复杂的问题。不可能靠一个工具解决全部问题尤其是五花八门格式不统一的PDF文件。除非有钞能力。如果没有那就看看可以分为哪些问题。   提取文本内容提取表格内容提取图片。我认为这些应该是分开做的事情。python有一些组件是有专长的。   问题分解以后最重要的一个事情是版面分析。怎么确定边界就是哪一块是什么内容是正文还是表格还是图片   文本、图片及形状涵盖了常见的PDF元素本文介绍利用PyMuPDF提取这些页面元素及其基本数据结构。本文会提供可运行的代码 一、技术选型 PyMuPDF PyMuPDF的Textpage对象提供的extractDICT()和extractRAWDICT()用以获取页面中的所有文本和图片内容、位置、属性基本数据结构如下 看到这里有分类有位置信息。 二、代码演示 2.1 安装 pip install PyMuPDF 2.2 demo代码  import fitz # PyMuPDFdef extract_text_blocks(pdf_path):# 打开 PDF 文件pdf_document fitz.open(pdf_path)# 存储文本块和行块信息text_blocks []line_blocks []# 遍历 PDF 中的每一页for page_number in range(len(pdf_document)):page pdf_document.load_page(page_number)# 获取文本块和行块信息blocks page.get_text(dict)[blocks]for b in blocks:for l in b[lines]:line_blocks.append({line: l[spans],bbox: l[bbox],height: l[bbox][3] - l[bbox][1] # 计算行块的高度})text_blocks.append({block: b[lines],bbox: b[bbox]})# 关闭 PDF 文件pdf_document.close()return text_blocks, line_blocks# 示例用法 pdf_path D:\\angus\\py\\困难pdf节选西藏奇正2022.pdf text_blocks, line_blocks extract_text_blocks(pdf_path)# 打印提取的文本块信息 for index, block in enumerate(text_blocks):print(fText Block {index 1}:)for line_index, line in enumerate(block[block]):print(f Line {line_index 1}: {line[spans]} at position {block[bbox]})# 打印提取的行块信息 for index, line in enumerate(line_blocks):print(fLine {index 1}: {line[line]} at position {line[bbox]}, height{line[height]})三、效果展示 3.1 原文PDF内容 3.2 解析后得到的结果 3.3 分析原文和结果 对比输出的结果和原文。我们可以发现我们拿到了行的数据也拿到了段落的数据。上述的代码中已经给我们分好了块这样解可以区分段落了。 3.4 获取更多信息包括位置 来看一个文本块 size: 文本的大小。flags: 文本的标志。font: 字体名称。color: 字体颜色。ascender: 文本的上升高度。descender: 文本的下降高度。text: 文本内容。origin: 文本的起始位置坐标。bbox: 文本的边界框坐标即左下角和右上角的坐标。 通过这些信息我们可以获取到每个文本块的具体内容、大小、位置和格式等信息。这些信息对于分析和处理 PDF 文件中的文本内容非常有用。例如你可以根据文本的大小、位置和格式来识别标题、正文和其他内容并进行相应的处理和分析。当然就以这个文档为例我们可以看到的是因为文档本身字体大小都一样所以很难根据字体和大小获取到标题。 四、错误问题 但是也发现了问题 4.1 段落有被分开了 原文 错误的问题如下 4.2 将表格错当成了文本内容 原文表格内容如下 解析得到的内容如下 表格的一行为一个块内容 这里调试了一版可以去掉表格。 逻辑是判断相邻的block表格的特征是当个block内的 lines的 bbox的第四位是相同的。且相邻的block的lines一定是相同的且lines不为空。逻辑本身没有问题就怕PDF有问题识别出来的表格的同一行的bbox中的第四位不一样这样会错误判断 import fitz # PyMuPDFdef is_table_block(b1, b2):# 检查连续相邻的文本块是否具有相同的行数并且其 bbox 的高度也相同if len(b1[lines]) len(b2[lines]) and b1[bbox][3] - b1[bbox][1] b2[bbox][3] - b2[bbox][1]:return Truereturn Falsedef extract_text_blocks(pdf_path):# 打开 PDF 文件pdf_document fitz.open(pdf_path)# 存储文本块信息text_blocks []line_blocks []# 遍历 PDF 中的每一页for page_number in range(len(pdf_document)):page pdf_document.load_page(page_number)# 获取文本块和行块信息blocks page.get_text(dict)[blocks]for i in range(len(blocks)):if i len(blocks) - 1 and is_table_block(blocks[i], blocks[i1]): # 如果是表格则跳过continuefor l in blocks[i][lines]:line_blocks.append({line: l[spans],bbox: l[bbox],height: l[bbox][3] - l[bbox][1] # 计算行块的高度})text_blocks.append({block: blocks[i][lines],bbox: blocks[i][bbox]})# 关闭 PDF 文件pdf_document.close()return text_blocks, line_blocks# 示例用法 pdf_path D:\\angus\\py\\困难pdf节选西藏奇正2022.pdf text_blocks, line_blocks extract_text_blocks(pdf_path)# 打印提取的文本块信息 # 用于检查两个文本块中的行是否相同 def check_lines_same(block1, block2):num_lines_block1 len(block1[block])num_lines_block2 len(block2[block])return num_lines_block1 num_lines_block2for index, block in enumerate(text_blocks):# 获取当前文本块中行的个数num_lines len(block[block])# 如果当前文本块是表格则继续检查下一个文本块是否是表格if num_lines 1 and index len(text_blocks) - 1: # 需要多于一行并且不是最后一个文本块next_block text_blocks[index 1]if check_lines_same(block, next_block):# 如果下一个文本块也是表格则跳过不进行打印输出continue# 如果当前文本块不是表格则打印输出print(fText Block {index 1}:)for line_index, line in enumerate(block[block]):print(f Line {line_index 1}: {line[spans]} at position {block[bbox]})# 打印提取的行块信息 # for index, line in enumerate(line_blocks): # print(fLine {index 1}: {line[line]} at position {line[bbox]}, height{line[height]})4.3 解析丢失整行数据 测试了另外一个法律法规文件。 发现文件丢失了。原文件内容如下 解析后的 还没找到bug的原因。  五、升级版 解决了丢行的问题因为代码bug在判断表格的时候有问题。 解决了段落被分开的问题。解决思路是判断两个段落之间应该有空白分隔。如果两个块之间没有空白分隔则为同一个段。 并将内容输出为json格式 import fitz # PyMuPDF import jsondef is_table_block(b1, b2):# 检查连续相邻的文本块是否具有相同的行数并且其 bbox 的高度也相同if len(b1[lines]) len(b2[lines]) and b1[bbox][3] - b1[bbox][1] b2[bbox][3] - b2[bbox][1]:return Truereturn Falsedef extract_text_blocks(pdf_path):# 打开 PDF 文件pdf_document fitz.open(pdf_path)# 存储文本块信息text_blocks []line_blocks []# 遍历 PDF 中的每一页for page_number in range(len(pdf_document)):page pdf_document.load_page(page_number)# 获取文本块和行块信息blocks page.get_text(dict)[blocks]# 对当前页面内的文本块按照坐标进行排序blocks.sort(keylambda x: (x[bbox][3], x[bbox][0]))for i in range(len(blocks)):for l in blocks[i][lines]:line_blocks.append({line: l[spans],bbox: l[bbox],height: l[bbox][3] - l[bbox][1], # 计算行块的高度page_number: page_number 1 # 记录页码信息})text_blocks.append({block: blocks[i][lines],bbox: blocks[i][bbox],page_number: page_number 1 # 记录页码信息})# 关闭 PDF 文件pdf_document.close()return text_blocks, line_blocksdef is_same_paragraph(line1, line2):# 判断相邻行是否属于同一个段落的逻辑# 这里提供一个简单的示例你可以根据实际情况调整和扩展# 判断两行之间的垂直间距是否小于某个阈值vertical_threshold 5 # 垂直间距阈值根据实际情况调整if abs(line1[bbox][3] - line2[bbox][1]) vertical_threshold:return Truereturn False# 示例用法pdf_path D:\\angus\\py\\困难pdf节选西藏奇正2022.pdf text_blocks, line_blocks extract_text_blocks(pdf_path)# 用于检查两个文本块中的行是否相同 def check_lines_same(block1, block2):num_lines_block1 len(block1[block])num_lines_block2 len(block2[block])return num_lines_block1 num_lines_block2# 收集打印的 JSON printed_json_list []for index, block in enumerate(text_blocks):# 获取当前文本块中行的个数num_lines len(block[block])# 如果当前文本块是表格则继续检查下一个文本块是否是表格if num_lines 1 and index len(text_blocks) - 1: # 需要多于一行并且不是最后一个文本块next_block text_blocks[index 1]if check_lines_same(block, next_block):# 如果下一个文本块也是表格则跳过不进行打印输出continue# 如果当前文本块不是表格则添加到打印的 JSON 列表中block_info {block_index: index 1,page_number: block[page_number],lines: [line[spans] for line in block[block]],bbox: block[bbox]}print(block_info)printed_json_list.append(block_info)previous_json None # 用于记录上一个非空 JSONfor printed_json in printed_json_list:# 获取 lines 的最后一个对象last_line_array printed_json[lines][-1]# 获取最后一个对象中的最后一个对象last_object_in_last_line last_line_array[-1]# 获取最后一个对象中的 text 字段的值text_value last_object_in_last_line[text]# 输出截取到的最后一个text值#print(text字段的取值为..:, text_value)if text_value.strip() :# 如果 text_value 为空则打印当前 JSONif previous_json is not None:# 合并当前 JSON 到上一个非空 JSON 上previous_json[lines].extend(printed_json[lines])previous_json[bbox] [min(previous_json[bbox][0], printed_json[bbox][0]),min(previous_json[bbox][1], printed_json[bbox][1]),max(previous_json[bbox][2], printed_json[bbox][2]),max(previous_json[bbox][3], printed_json[bbox][3])]# 更新页码信息previous_json[page_number] printed_json[page_number]print(json.dumps(previous_json, ensure_asciiFalse))# 重置jsonprevious_json Noneelse:print(json.dumps(printed_json, ensure_asciiFalse)) else:# 如果 text_value 不为空则合并当前 JSON 到上一个非空 JSON 上if previous_json is not None:# 合并当前 JSON 到上一个非空 JSON 上previous_json[lines].extend(printed_json[lines])previous_json[bbox] [min(previous_json[bbox][0], printed_json[bbox][0]),min(previous_json[bbox][1], printed_json[bbox][1]),max(previous_json[bbox][2], printed_json[bbox][2]),max(previous_json[bbox][3], printed_json[bbox][3])]# 更新页码信息previous_json[page_number] printed_json[page_number]else:# 如果没有上一个非空 JSON则将当前 JSON 赋值给上一个非空 JSONprevious_json printed_json
http://www.dnsts.com.cn/news/61640.html

相关文章:

  • win8 metro风格网站后台管理模板网站代运营要多少费用吗
  • 没有网站怎么做cps百度网站域名注册
  • 太原网站建设加王道下拉建网站电话
  • 网站写手怎么做天津西青区离哪个火车站近
  • 做网站优化推广多少钱公司注册核名查询官网
  • 网站改版需求分析php做网站麻烦吗
  • vi设计用什么软件成都seo培训
  • 南宁公司做网站腾云网建站
  • 招远网站建设价格网站推广外链怎么做
  • 内蒙古建设监理协会网站建网站前期设计用那软件
  • 淮南招聘网站建设百度电话
  • 道滘东莞微信网站建设江苏住房与城乡建设厅网站
  • 信息技术八年级上册网站建设游戏官网平台
  • 门户网站创新的方式有南京seo圈子
  • 网站建设题库含答案12306网站是是阿里巴巴做的吗
  • app网站做二手交易龙岩app定制开发
  • 平罗县住房和城乡建设局网站个人网页设计欣赏欣赏
  • 网站信息内容建设管理网站建设在学校中的作用
  • 搭建网站服务器平台的三种方式集团网站建设服务
  • 南京网站制作域名互联网推广软件
  • 网站建设及推广预算表通信技术公司网站建设
  • 备案密码如何登录添加网站微信红包封面分销平台
  • 怎么用.net做网站学校建设外文网站情况
  • 宁波哪里做网站的网站系统功能描述
  • 网站制作详细流程qq空间关闭申请网站
  • 北京网站设计服务app手机软件开发
  • 网站不能添加图片大学网站栏目建设通知
  • icp备案网站管理员有负责吗网址生成短链接
  • 网站建设与优化推广方案模板希爱力
  • 找做金融的网站闵行郑州阳网站建设