PDF加粗内容重复读取解决方案

文章目录

前言

在使用pdfplumber读取PDF的过程中,由于加黑的内容会被莫名其妙的读取两次,带来了很大的困扰。这篇文章将给出解决方案。

发现问题

在在使用pdfplumber读取PDF的过程中,读取普通内容是完全没有问题的。但是该公司早期PDF并未完全规范的过程中,有些标题加粗了,而有些却没有。加粗的标题将会被读取两次,比如好好的123456,加粗后将会被读取为112233445566。这可不太好。

解决方案

问题分析

首先我们需要明白,加粗的内容只会被连续读取,而不会被随机读取,这一点使得字符串具备了一定的规律。所以循环或者递归都是可行的,只是我们需要记住递归的最大深度为1000

其次我们需要明确,不是所有的连续内容都应该被删除。比如111被读成了111111,那可不能删的只剩下1,这就又和PDF上想要传达的内容不一致了。所以正则表达式也是不能乱用的。

大致逻辑

既然有这些要求,我们就好办了。

我们考虑极端场景:111111。我们就直接先数一数连续重复有几个,然后保留一半就好了。

然后再考虑一般场景:111111222222333333。在处理过程中,实际上也就是相当于把字符串拆成了3份,每份利用极端场景111111的做法去做。

show my code

知道该怎么办了就直接干吧。

虽然我们现在是针对加粗被重复读取的问题,字符串中的每一种字符一定是双数出现,所以简单一点的话就可以这么做:

python 复制代码
def drop_duplicates(arr):
  result, i = [], 0
  while i < len(arr):
    count = 1
    # 计算连续相同元素的数量
    while i + count < len(arr) and arr[i] == arr[i + count]:
      count += 1
    # 保留一半
    result.extend([arr[i]] * count // 2)
    i += count  # 处理下一段
  return ''.join(result)

当然,考虑到并不一定具备跟现在一样完全理想的场景,所以这里也考虑了万一真的有一个数字落单的情况:

python 复制代码
def drop_duplicates(arr):
  result, i = [], 0
  while i < len(arr):
    count = 1
    # 计算连续相同元素的数量
    while i + count < len(arr) and arr[i] == arr[i + count]:
      count += 1
    # 只有一个落单的话,1 // 2 = 0,这就不对了,所以上个保险,最低只能为1
    result.extend([arr[i]] * max(1, count // 2))
    i += count  # 处理下一段
  return ''.join(result)

解决。

相关推荐
RTC老炮2 分钟前
webrtc弱网-AlrDetector类源码分析与算法原理
服务器·网络·算法·php·webrtc
E___V___E7 分钟前
设计模式--装饰器模式
python·设计模式·装饰器模式
孤廖8 分钟前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法
sali-tec13 分钟前
C# 基于halcon的视觉工作流-章33-矩状测量
开发语言·人工智能·算法·计算机视觉·c#
Dan.Qiao31 分钟前
pycharm如何处理python项目间引用
ide·python·pycharm
songx_9943 分钟前
leetcode29( 有效的括号)
java·数据结构·算法·leetcode
于樱花森上飞舞1 小时前
【java】常见排序算法详解
java·算法·排序算法
万粉变现经纪人1 小时前
如何解决pip安装报错ModuleNotFoundError: No module named ‘sympy’问题
python·beautifulsoup·pandas·scikit-learn·pyqt·pip·scipy
GawynKing1 小时前
图论3 图的遍历
算法·深度优先
AnySpaceOne1 小时前
PDF转Word在线转换教程:多种实用方法分享
学习·pdf·word