首页 > 其他分享 >智能 Uber 发票 PDF 合并工具

智能 Uber 发票 PDF 合并工具

时间:2024-09-17 20:24:06浏览次数:11  
标签:Uber self 合并 发票 pdf PDF path

在现代商务出行中,尤其是在跨国出差中,处理和整合大量 Uber 发票已成为一项不小的挑战。手动整理和合并这些发票不仅耗时,还容易出错。作为开发者,为什么不开发一个自动化工具,将这些任务交给代码来完成呢?在这篇博客中,我将带你一步步构建一个结合 PyQt5pdfplumberPyPDF2 的智能 Uber 发票合并工具,不仅能自动提取数据,还能动态显示进度条,给用户带来极佳的使用体验。

项目亮点:

  • PyQt5 GUI 界面:基于 PyQt5 实现的可视化界面,简洁大方。
  • 自动提取发票数据:利用 pdfplumber 自动提取 Uber 发票中的日期、金额、地点等信息,支持多语言(中文、英文、西班牙语)。
  • PDF 合并功能:通过 PyPDF2 实现多份 PDF 发票的自动合并,并且生成一份总结页,显示所有行程的详细信息。
  • 动态进度条:实时显示合并进度,让用户一目了然处理状态。

1. 项目简介

本项目的主要目的是通过图形化用户界面(GUI)和后端的 PDF 处理技术,自动处理 Uber 发票,自动从 PDF 中提取关键信息,并合并成一个包含详细摘要的 PDF 文件。这样的工具对于经常出差、需要整理大量发票的用户来说,是一个非常实用的助手。

2. 使用技术栈

在开发过程中,我们使用了以下的技术栈:

  • PyQt5:用于创建用户界面,让用户可以轻松选择文件夹、选择语言以及合并 PDF 文件。
  • pdfplumber:用于从 Uber 发票 PDF 中提取文本和行程信息,支持多语言。
  • PyPDF2:用于将多个 PDF 文件合并成一个,同时在合并前生成一份包含所有行程数据的总结页。
  • ReportLab:用于生成总结页的 PDF 文件,方便将表格数据导出。

3. 代码实现

3.1 主窗口的设计与初始化

我们通过 QMainWindow 创建了主窗口,并初始化了必要的组件,比如上传文件按钮、合并按钮、进度条等。我们还为窗口添加了一个版权信息,并通过 setWindowIcon 方法设置了应用的图标。

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()  # 创建UI对象
        self.ui.setupUi(self)  # 调用setupUi方法,构建界面

        # 初始化进度条
        self.ui.progressBar.setValue(0)  # 初始化进度条值为 0

        # 设置窗口的图标(logo)
        self.setWindowIcon(QIcon('logo.png'))  # 替换为你的 logo 文件路径

        # 设置窗口标题
        self.setWindowTitle("Uber Pdf Merge")  # 设置自定义窗口标题

        # 添加版权信息
        self.add_copyright_label()

        # 其他初始化代码...
3.2 自动提取 Uber 发票中的行程数据

在这一部分中,pdfplumber 被用于提取每一张发票中的行程信息,包括日期、金额、起始地点和目的地。我们通过不同的正则表达式来处理不同语言的发票数据(支持中文、英文和西班牙语)。

    def merge_pdfs(self):
        if self.selected_folder:
            pdf_files = [os.path.join(self.selected_folder, f) for f in os.listdir(self.selected_folder) if f.endswith('.pdf')]

            total_files = len(pdf_files)
            if total_files:
                all_trips = []
                self.ui.progressBar.setValue(0)

                for i, pdf_file in enumerate(pdf_files):
                    # 提取PDF中的行程数据
                    trips = self.extract_trip_data_from_pdf(pdf_file)
                    all_trips.extend(trips)

                    # 更新进度条
                    progress = int(((i + 1) / total_files) * 100)
                    self.ui.progressBar.setValue(progress)

                # 生成总结页PDF
                summary_pdf_path = "summary.pdf"
                self.generate_summary_page(summary_pdf_path, all_trips)

                # 合并PDF
                save_path, _ = QFileDialog.getSaveFileName(self, "Save Merged PDF", "", "PDF Files (*.pdf)")
                if save_path:
                    merger = PdfMerger()
                    merger.append(summary_pdf_path)
                    for pdf in pdf_files:
                        merger.append(pdf)
                    merger.write(save_path)
                    merger.close()
3.4 生成包含行程信息的总结页

为了方便整理行程信息,我们在合并多个发票之前,生成了一份总结页,并将其合并到最终的 PDF 文件中。总结页显示了所有行程的详细信息,并通过 ReportLab 将其以表格形式展示。

def generate_summary_page(self, output_path, trips_data):
    pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))  # 使用 STSong-Light 字体
    doc = SimpleDocTemplate(output_path, pagesize=A4)

    table_data = [["日期", "起始时间", "启程地", "结束时间", "目的地", "金额", "单位"]]
    # 循环将行程数据添加到表格
    for trip in trips_data:
        table_data.append([trip["日期"], trip["起始时间"], trip["启程地"], trip["结束时间"], trip["目的地"], trip["金额"], trip["单位"]])

    table = Table(table_data, colWidths=[3 * cm, 2 * cm, 5 * cm, 2 * cm, 5 * cm, 2 * cm, 2 * cm])
    style = TableStyle([...])
    table.setStyle(style)
    elements = [table]
    doc.build(elements)

4. 运行效果展示

当用户运行该程序时,可以选择一个包含多个 Uber 发票的文件夹,点击 "Merge PDF NOW" 按钮后,程序会自动提取每一张发票中的行程数据,并动态更新进度条。处理完成后,用户可以保存最终合并的 PDF 文件,并查看生成的总结页。


5. 总结

通过这篇博客,你学会了如何使用 PyQt5 构建一个图形化的发票合并工具,并结合 pdfplumberPyPDF2ReportLab 实现发票的自动处理、数据提取以及文件合并。这种工具能够极大地提高发票处理的效率,并为用户带来便捷的体验。

如果你对 PDF 处理有需求或希望进一步优化用户界面,这将是一个非常好的入门项目。希望这篇文章对你有所帮助!

标签:Uber,self,合并,发票,pdf,PDF,path
From: https://blog.csdn.net/qq_36224726/article/details/142317797

相关文章

  • 概率分布深度解析:PMF、PDF和CDF的技术指南
    本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。在深入探讨PMF、PDF和CDF之前,有必要先简要介绍两种常用的概率分布:正态分布和均匀分布。正态分布: 也称为高斯分布或钟形曲线,正态分布以其均值为中心对称......
  • 2024-09-17-生活在Kubernetes中的Springboot
    Springboot和Kubernetes中的很多功能都是重叠的,SpringCloud重合的就更多了。不过我还是希望尽可能采用微服务及服务网格这套思路,应用层做轻,SpringCloud就不用了,重合的部分也尽可能用Kubernetes的功能。配置中心Kubernetes本身提供了对配置中心的支持,不需要再使用Apollo之类的工......
  • VBA_NZ系列工具NZ02:VBA读取PDF使用说明
    我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织成自己的程序呢?VBA可否能组织一个大型的程序呢?如何让VBA形成一个工具,拿来就用呢?在......
  • 【Kubernetes】常见面试题汇总(二十二)
    目录68.简述Helm及其优势?特别说明:题目1-68属于【Kubernetes】的常规概念题。68.简述Helm及其优势?(1)Helm是Kubernetes的软件包管理工具。类似Ubuntu中使用的apt、Centos中使用的yum或者Python中的pip一样。(2)Helm能够将一组K8S资源打包统一管理,是查......
  • 【Kubernetes】常见面试题汇总(二十一)
    目录65.简述Kubernetes中,如何使用EFK实现日志的统一管理?66.简述Kubernetes如何进行优雅的节点关机维护?67.简述Kubernetes集群联邦?65.简述Kubernetes中,如何使用EFK实现日志的统一管理?-在Kubernetes集群环境中,通常一个完整的应用或服务涉及组件过多,建议对......
  • DEDECMS编辑器支持PDF一键粘贴
    CMS:织梦CMS(dedecms)后端:PHP数据库:MySQL功能:粘贴Word图片内容,PPT一键导入,PDF一键导入,要求:开源,免费,技术支持咱们有一说一,昨天晚上论坛里有一位网友给我发私信沟通,说是需要实现这么一个功能。晚上我上网搜了一下相关的资料,发现目前也只有一种成熟的解决方案,其它的文章里面......
  • 深入Kubernetes的自动扩展与弹性伸缩实践
    在云原生架构学习的征途中,第33天我们踏入了Kubernetes(K8s)自动扩展与弹性伸缩的深邃领域。作为云原生技术的基石,Kubernetes不仅以其强大的容器编排能力著称,更在自动扩展和弹性伸缩方面展现出了无与伦比的灵活性与效率。今天,我们深入探讨了Kubernetes如何通过HorizontalPodAutoscal......
  • 常用PDF库总结
    本帖内容源自,在此仅做记录PDF(PortableDocumentFormat)是一种便携文档格式,便于跨操作系统传播文档。PDF文档遵循标准格式,因此存在很多可以操作PDF文档的工具,Python自然也不例外。本文从功能、开源协议及社区活跃度三方面对比7个常用的Python第三方库,以便根据具体需求选择合适的......
  • 探索Kubernetes服务发现与Ingress的奥秘
    在云原生架构的深邃海洋中,第32天我们扬帆起航,探索Kubernetes服务发现与Ingress的广阔天地。这两项技术如同航海中的灯塔与航道,为Pod间的通信及外部访问提供了可靠的导航。服务发现:Pod间的隐形桥梁在Kubernetes集群中,服务发现机制允许Pod通过服务(Service)这一抽象层相互发现并进行通......
  • Kubernetes概述,认识Kubernetes
            通过现代的Web服务,用户希望应用程序能够24/7全天候使用,开发人员希望每天可以多次发布部署新版本的应用程序。容器化可以帮助软件包达成这些目标,使应用程序能够以简单快速的方式发布和更新,而无需停机。Kubernetes帮助你确保这些容器化的应用程序在你想要......