Python中比较好用的PDF模块——发票金额提取

参考文档:常用Python PDF库对比

上文中:列举了几个常用的Python中PDF的模块。

我自己的应用场景是将发票金额提取,并用金额去命名pdf文件名。

经过个人测试:PyMuPDF模块效果显著。

Talk is cheap,I show you the code。

import os
import fitz
import shutil
'''
    支持滴滴行程单。
    # PyMuPDF模块:https://pymupdf.readthedocs.io/en/latest/tutorial.html#extracting-text-and-images
'''
root_dir = "./"
out_dir = "./output"
if not os.path.exists(out_dir):
    os.mkdir(out_dir)


def fapiao_read(text):
    if "¥" in text:
        print(text.split("¥")[-1].split("\n")[0])
        money = text.split("¥")[-1].split("\n")[0]
    elif "¥" in text:
        print(text.split("¥")[-1].split("\n")[0])
        money = text.split("¥")[-1].split("\n")[0]
    return money


def xingchengdan_read(text):
    print(text.split("合计")[1].split("元")[0].split()[0])
    money = text.split("合计")[1].split("元")[0].split()[0]
    return money


Repeat_name_list = []
for file in os.listdir("./"):
    if file.endswith(".pdf"):
        src = os.path.join(root_dir, file)
        doc = fitz.open(src)  # or fitz.Document(filename)
        page = doc.load_page(0)
        text = page.get_text("text")

        if "¥" in text or "¥" in text:
            if "敏感信息脱敏" in text and "敏感信息脱敏" in text:
                money = fapiao_read(text)
                out_file_name = "电子发票" + money + "元"
            else:
                continue
        else:
            money = xingchengdan_read(text)
            out_file_name = "电子发票" + money + "元行程单"
        Repeat_name_list.append(out_file_name)
        if out_file_name in Repeat_name_list:
            repeat_num = Repeat_name_list.count(out_file_name)
            if repeat_num == 1:
                out_file_name = out_file_name
            else:
                out_file_name = out_file_name + "(" + str(repeat_num-1) + ")"
        dst = os.path.join(out_dir, out_file_name+".pdf")
        shutil.copy(src, dst)

这个仅仅支持所有电子发票的pdf,同时支持滴滴发票和行程单的提取。其他pdf暂未考虑。因为我也用不到。

备注:据我观察人民币的“¥”符号,在发票中,有两种表现。代码中已经列出。

### 使用Python读取OFD文件 为了使用Python读取OFD文件,可以采用多种方法和技术栈来解析这些文档的内容。下面介绍几种常见的方案。 #### 方法一:利用`easyofd`库直接操作OFD文件 对于希望快速上手并专注于业务逻辑而非底层细节的应用场景来说,推荐使用专门针对中国国家标准设计的`easyofd`库。此库能够简化许多复杂流程,并提供便捷接口用于处理电子发票等特定类型的OFD文档[^3]。 ```bash pip install easyofd -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` 通过上述命令安装完成后,在脚本中导入该模块: ```python import easyofd # 加载OFD文件 doc = easyofd.load('path/to/your/file.ofd') # 遍历页面对象 for page in doc.pages: print(page.text) # 输出当前页的文字内容 ``` 这种方法适用于大多数常规需求,特别是当目标仅限于提取文本或其他简单属性时非常有效。 #### 方法二:基于ZIP压缩包特性手动解析OFD结构 由于OFD本质上是一个遵循XML标准定义的数据集合体,并被封装成类似于Office Open XML(.docx,.xlsx)那样的ZIP容器内;因此可以直接将其视为普通的ZIP档案来进行初步探索[^2]。 ```python import zipfile def extract_ofd_structure(ofd_path): """ 展示如何像对待普通ZIP那样打开OFD, 并列举其中包含的所有条目名称。 参数: ofd_path (str): OFD 文件路径 返回值: list[str]: ZIP 中所有成员的名字列表 """ with zipfile.ZipFile(ofd_path, mode='r') as zf: return sorted(zf.namelist()) if __name__ == '__main__': items = extract_ofd_structure('./example.ofd') for item in items: print(item) ``` 这段代码展示了怎样访问构成OFD的基础组件——即各个部分对应的XML描述符和其他资源文件的位置信息。然而,这仅仅是个起点,后续还需要进一步深入理解具体的标签含义以及它们之间的关联方式才能真正意义上“读懂”整个文档。 #### 方法三:借助PyGObject与GNOME项目下的LibreOffice套件间接支持 如果应用程序环境允许的话,还可以考虑集成更强大的办公软件作为后台服务端点之一。例如,通过调用LibreOffice API完成更加复杂的编辑任务,包括但不限于批量转换不同格式间的互转工作流自动化等等[^4]。 不过需要注意的是这种方式通常涉及到额外依赖项部署及其配置过程可能较为繁琐一些,除非确实存在特殊要求否则一般不建议初学者轻易尝试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值