夜雨康斯坦丁 2024-07-03 16:17 采纳率: 66.7%
浏览 3
已结题

Python读取文档内容重命名问题

这边想读取PDF文档中的订单编号与发票号,并用其重新命名文件,这个有什么问题,总是报Failed to extract all necessary information from the PDF file。这个如何解决,改代码应该如何修改
代码如下:

import os  
import re  
import pdfplumber  
  
def extract_info_from_pdf(pdf_path):  
    order_id = None  
    invoice_number = None  
    invoice_amount = None  
      
    with pdfplumber.open(pdf_path) as pdf:  
        for page in pdf.pages:  
            text = page.extract_text()  
            if text:  
                # 订单编号固定为20位数字  
                order_id_match = re.search(r'\b\d{20}\b', text)  
                if order_id_match:  
                    order_id = order_id_match.group(0)  
                  
                # 发票号固定为8位数字  
                invoice_number_match = re.search(r'\b\d{8}\b', text)  
                if invoice_number_match and not invoice_number:  # 假设每个PDF只有一个发票号  
                    invoice_number = invoice_number_match.group(0)  
                  
                # 发票金额包含“元”字,可能包含小数  
                invoice_amount_match = re.search(r'(\d+(\.\d+)?)元', text)  
                if invoice_amount_match:  
                    invoice_amount = invoice_amount_match.group(1)  
          
        # 检查是否提取到所有必要信息  
        if all([order_id, invoice_number, invoice_amount]):  
            return order_id, invoice_number, invoice_amount, "Success"  
        else:  
            return None, None, None, "Failed to extract all necessary information from the PDF file."  
  
def rename_file(old_path, new_name):  
    dir_name = os.path.dirname(old_path)  
    new_path = os.path.join(dir_name, new_name)  
    try:  
        os.rename(old_path, new_path)  
        print(f"Renamed {old_path} to {new_path}")  
        return "Success"  
    except Exception as e:  
        return f"Failed to rename file: {e}"  
  
# 指定PDF文件路径  
pdf_path = 'D:\\Desktop\\code\\陈述事实.pdf'  
  
# 提取信息  
order_id, invoice_number, invoice_amount, extract_status = extract_info_from_pdf(pdf_path)  
  
if extract_status == "Success":  
    # 构建新文件名并重命名文件  
    new_filename = f"{order_id}-{invoice_number}-{invoice_amount}元.pdf"  
    rename_status = rename_file(pdf_path, new_filename)  
    if rename_status == "Success":  
        print("Overall operation successful.")  
    else:  
        print(rename_status)  
else:  
    print(extract_status)

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-03 16:17
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    你好!看起来你在尝试使用 Python 来从 PDF 文档中提取特定的文本信息,并用这些信息来重命名文件。你遇到的问题可能是由于几个原因造成的,让我们一步步来分析和解决。

    1. 文本提取问题pdfplumber 可能无法从 PDF 中提取文本,这可能是因为 PDF 的格式问题,或者是因为文本被以图像的形式嵌入到 PDF 中。这种情况下,pdfplumber 无法识别文本。

    2. 正则表达式匹配问题:你的正则表达式可能需要根据实际的文本格式进行调整。例如,如果订单编号或发票号前后有特殊字符或者格式,你的正则表达式可能需要相应地进行修改。

    3. 错误处理:你的代码在提取信息失败时会返回错误信息,但没有提供具体的调试信息来帮助定位问题。

    为了解决这个问题,你可以尝试以下几个步骤:

    • 确保 PDF 可读:首先确认 PDF 文件是否是文本格式,而不是扫描的图像。如果是图像,你可能需要使用 OCR(光学字符识别)技术来提取文本。

    • 调整正则表达式:检查你的 PDF 文档,看看订单编号和发票号前后是否有一致的格式或特殊字符,然后在正则表达式中相应地进行匹配。

    • 增加调试信息:在 extract_info_from_pdf 函数中,你可以在每个匹配步骤后打印出匹配到的值,这样可以帮助定位问题。

    • 处理特殊情况:如果 PDF 中包含多个发票号或者金额格式不一致,你的代码需要能够处理这些情况。

    下面是一些修改后的代码示例,增加了调试信息和一些可能的正则表达式调整:

    def extract_info_from_pdf(pdf_path):  
        # ... 省略之前的代码 ...
    
        for page in pdf.pages:  
            text = page.extract_text()  
            if text:  
                print(f"Extracted text from page: {text}")  # 调试信息
                # ... 省略之前的代码 ...
    
                # 发票金额可能有不同的格式,这里尝试更通用的匹配
                invoice_amount_match = re.search(r'(\d+(\.\d+)?)元', text)
                if invoice_amount_match:
                    invoice_amount = invoice_amount_match.group(1)
                    print(f"Matched invoice amount: {invoice_amount}")  # 调试信息
    
        # ... 省略之前的代码 ...
    
        if not all([order_id, invoice_number, invoice_amount]):
            missing_info = [info for info in [order_id, invoice_number, invoice_amount] if info is None]
            return None, None, None, f"Failed to extract all necessary information: Missing {missing_info}."
    
        return order_id, invoice_number, invoice_amount, "Success"
    
    # ... 省略之前的代码 ...
    

    希望这些建议能帮助你解决问题。如果你需要进一步的帮助,或者有其他问题,请随时告诉我!

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

报告相同问题?

问题事件

  • 系统已结题 7月18日
  • 已采纳回答 7月10日
  • 创建了问题 7月3日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?