2401_84482571 2024-06-07 09:07 采纳率: 66.7%
浏览 3
已结题

为什么数据提取不完整pdfminer

img

img

img

img


1.用pdfminer提取数据,打印出来有些数据没有提取到,是什么原因呢
2.后续想生成excel文件,但是无法识别table,另外,生成出来的文件怎么切割到每一个单元格呢

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-07 09:07
    关注

    引自免费微信小程序:皆我百晓生

    针对您的问题,我会分两部分进行解答:首先解决PDF数据提取不完整的问题,然后处理Excel文件创建与数据写入。

    问题1:PDF数据提取不完整

    在您提供的代码中,似乎出现了混淆。您尝试从text变量中提取生产指令号,但在循环中使用了未定义的table变量。这可能是导致某些数据未被正确提取的原因。为了解决这个问题,我们需要确保正则表达式匹配的是正确的字符串,并且在正确的地方使用提取结果。

    这里是一个修正后的版本,它将提取所有生产指令号并将其存储在一个列表中,同时会处理缺失值的情况:

    import re
    from pdfminer.high_level import extract_text
    from pdfminer.layout import LAParams
    
    # 提取PDF中的文本信息
    with open('外协-汇鼎(299215.5).pdf', 'rb') as file:
        text = extract_text(file, laparams=LAParams(line_margin=0.5))  # 增加行间距参数,提高提取准确率
    
    # 定义正则表达式
    regex = r"生产指令号:(.*?)(?:\n|$)"  # 使用非贪婪匹配,并考虑换行符作为结束符
    
    # 提取生产指令号
    xinyongcodes = re.findall(regex, text)
    
    # 打印提取的结果
    for i, code in enumerate(xinyongcodes, start=1):
        if code.strip():  # 过滤掉空白项
            print(f"第{i}个生产指令号:{code.strip()}")
    

    这段代码首先增加了行间距参数laparams=LAParams(line_margin=0.5),这有助于提高PDF文本的提取准确性。然后,在正则表达式中使用了非贪婪匹配(.*?),以防止因贪婪匹配而错过下一个匹配项。最后,通过检查提取的每个生产指令号是否为空白,过滤掉了无效的条目。

    问题2:生成Excel文件并写入数据

    在修复了PDF数据提取后,我们可以继续处理生成Excel文件的部分。以下是修改后的代码,用于将提取的数据写入Excel文件,并确保每个元素都在单独的单元格内:

    import re
    from pdfminer.high_level import extract_text
    from pdfminer.layout import LAParams
    import openpyxl
    
    # 提取PDF中的文本信息
    with open('外协-汇鼎(299215.5).pdf', 'rb') as file:
        text = extract_text(file, laparams=LAParams(line_margin=0.5))
    
    # 定义正则表达式
    regex = r"生产指令号:(.*?)(?:\n|$)"
    xinyongcodes = re.findall(regex, text)
    
    # 创建一个新的Excel工作簿
    workbook = openpyxl.Workbook()
    sheet = workbook.active
    
    # 写入数据到Excel
    row_num = 1
    for code in xinyongcodes:
        if code.strip():
            sheet.cell(row=row_num, column=1, value=code.strip())
            row_num += 1
    
    # 保存Excel文件
    workbook.save(filename='luomiqi1.xlsx')
    

    这个版本的代码创建了一个新的Excel工作簿,然后遍历提取的生产指令号,并将它们分别写入到单独的单元格中。每提取一个生产指令号,就会自动跳转到下一行。最后,保存Excel文件到指定的位置。

    请注意,这个示例仅针对提取生产指令号这一列数据。如果您有其他列需要提取,可以按照类似的方法添加更多的正则表达式和逻辑。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月7日