weixin_42385928 2024-08-13 20:43 采纳率: 50%
浏览 52
已结题

利用python搜索PDF文件中是否存在1

PDF中有两种1,一种是带底下横线的,一种不带底下横线的,现在需要找出哪些PDF中有不带底线横线的1。
样例已经上传,是pdf文件上截图下来的

img

  • 写回答

31条回答 默认 最新

  • 专家-皆知 2024-08-13 20:43
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要解决这个问题,我们可以使用Python的PyMuPDF(也称为fitz)库来读取PDF文件并检查文本内容。这个库允许我们提取文本及其位置信息,从而区分带底线的1(通常是小写L)和不带底线的1。以下是详细的步骤和示例代码:

    安装所需库

    首先,确保安装了PyMuPDF库。可以通过pip安装:

    pip install pymupdf
    

    检查PDF中的不带底线的1

    接下来,编写一个Python脚本来遍历PDF中的文本,并检查是否存在不带底线的1。这里的关键在于通过文本的位置和形状判断是否为带底线的1(小写L)。

    import fitz  # PyMuPDF
    
    def find_unlined_ones_in_pdf(pdf_path):
        """
        检查给定PDF文件中是否存在不带底线的1。
        
        :param pdf_path: PDF文件路径
        :return: 如果找到不带底线的1则返回True,否则返回False
        """
        found_unlined_one = False
        
        # 打开PDF文件
        doc = fitz.open(pdf_path)
        
        # 遍历每一页
        for page in doc:
            # 提取页面上的文本及其位置信息
            text_instances = page.get_text("words")  # "words"模式提供单独单词及其位置
            
            for inst in text_instances:
                # 检查当前文本实例是否为数字1且不位于其他字符下方(假设底线1会比普通1低)
                if inst[4] == '1' and not is_below_line(inst):  # inst[4]存储的是文本内容
                    found_unlined_one = True
                    break  # 找到后立即跳出循环
            
            if found_unlined_one:
                break  # 在任何页面找到后,跳出文档循环
        
        doc.close()  # 关闭文档
        return found_unlined_one
    
    def is_below_line(text_instance):
        """
        简化的逻辑判断当前文本是否可能在一条线(底线)之下。
        实际应用中可能需要更复杂的逻辑来准确判断。
        
        :param text_instance: 从fitz.get_text("words")得到的文本实例
        :return: 如果文本可能在一条线之下则返回True,否则返回False
        """
        # 假设底线1会有更低的y坐标(fitz使用从下往上的坐标系)
        # 这里只是一个示例,实际情况可能需要根据字体大小、基线等调整
        baseline_threshold = 5  # 一个假设的阈值,用于判断是否为底线
        return text_instance[3] > baseline_threshold  # [3]是基线位置
    
    # 使用示例
    pdf_file_path = "your_pdf_file.pdf"
    if find_unlined_ones_in_pdf(pdf_file_path):
        print("存在不带底线的1。")
    else:
        print("未找到不带底线的1。")
    

    这段代码首先定义了一个函数find_unlined_ones_in_pdf来遍历PDF中的每个页面和文本实例,使用is_below_line函数简单判断文本是否可能带有底线。请注意,这里的is_below_line函数仅作为示例,实际应用中可能需要更精确的方法来区分1和小写L,特别是对于不同字体和排版样式。此外,由于PDF的复杂性,这个方法可能不是100%准确,但对于大多数情况应该足够使用。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月19日
  • 修改了问题 8月14日
  • 创建了问题 8月13日