• 分享一点PDF中获取表格的探索过程


    版面分析:如何得到标题、如何的得到段落(正确的段落)、如何得到表格、如何得到图片,图和得到图片上的文字?

    还有细节问题:双栏和多栏的问题、公式问题

    扫描件:扫描件本质上是图片,如何从图片中解析得到文件。

    本篇文章,探索的是,非扫描件PDF中,获取表格的思路。

    挑选了可以解析PDF中表格的组件,进行了测试。主要测试了 pdfplumber 和 camelot
    整体的感受是:网上看啥组件都好,实际测,啥组件都不行。效果好的不开源收费,开源的效果不好。测试下来,发现把组件融合起来,还是能不花钱解决问题的,都是麻烦折腾一些。

    pdfplumber

    实际测试情况:解析表格的能力比较差,它把三列的表格解析成了很多列。

    安装

    pip install pdfplumber

    可运行代码

    1. # 导入pdfplumber
    2. import pdfplumber
    3. # 读取pdf文件,保存为pdf实例
    4. pdf =  pdfplumber.open("D:\\angus\\py\\困难pdf节选西藏奇正2022.pdf")
    5. # 访问第二页
    6. first_page = pdf.pages[2]
    7. # 自动读取表格信息,返回列表
    8. table = first_page.extract_table()
    9. print(table)

    实际PDF中的表格

    解析后的结果,可以看到都是错误的。因为它解析出来九列。

    camelot

    camelot可以正确的识别表格的列,问题是把正文当做表格。不过camelot的定位就是表格识别。

    tips1:这里camelot是可以传入表格的坐标的,可以配合其它的python组件,获取到表格位置,然后只解析表格。camelot最佳的用途就是解析表格。也只能解析表格,所以可以把要解析的表格部分单独给camelot。

    tips2:这里也可以考虑,把解析后为一列的表格去掉(表格为一列好像没有什么意义。虽然粗暴,但是没有太大问题)。

    安装

    pip install camelot-py[cv]

    可运行代码

    1. import camelot
    2. import pandas as pd
    3. def extract_table_data(pdf_path):
    4.     tables = camelot.read_pdf(pdf_path, flavor='stream', pages='all')
    5.     return tables
    6. # 用法示例
    7. pdf_path = "D:\\angus\\py\\困难pdf节选西藏奇正2022.pdf"
    8. table_data = extract_table_data(pdf_path)
    9. for idx, table in enumerate(table_data):
    10.     print(f"Table {idx+1}:")
    11.     print(table.df)
    12.     print(f"Number of columns: {len(table.df.columns)}")
    13.     print()

    python pdf2table-v2.py

    效果,正确解析了表格的列,但是把正文也当做了表格。

    原始表格如下,表格解析没有问题。

    最开始的想法是,把这些解析为一列的表格,通过LLM去分析段落。这并不是一个好主意

    我把数据给通义千问,它表示目前没有这项能力

    prompt如下

    1. 以下是一个文件的内容,请帮我分析提取真正的标题、正文
    2. 要求1:只需要根据内容,判断是否可以是标题。不要额外生成任何内容!!
    3. 要求2:其中正文要给我划分好段落!!
    4. 内容如下 :
    5. {0                  西藏奇正藏药股份有限公司 2022 年年度报告全文
    6. 1     管理层负责按照企业会计准则的规定编制财务报表,使其实现公允反映,并设计、执行
    7. 2        和维护必要的内部控制,以使财务报表不存在由于舞弊或错误导致的重大错报。
    8. 3     在编制财务报表时,管理层负责评估奇正藏药的持续经营能力,披露与持续经营相关的
    9. 4   事项(如适用),并运用持续经营假设,除非管理层计划清算奇正藏药、停止营运或别无其
    10. 5                                    他现实的选择。
    11. 6         奇正藏药治理层(以下简称“治理层”)负责监督奇正藏药的财务报告过程。
    12. 7                          六、注册会计师对财务报表审计的责任
    13. 8    我们的目标是对财务报表整体是否不存在由于舞弊或错误导致的重大错报获取合理保证,
    14. 9   并出具包含审计意见的审计报告。合理保证是高水平的保证,但并不能保证按照审计准则执
    15. 10  行的审计在某一重大错报存在时总能发现。错报可能由于舞弊或错误所导致,如果合理预期
    16. 11  错报单独或汇总起来可能影响财务报表使用者依据财务报表作出的经济决策,则通常认为错
    17. 12                                    报是重大的。
    18. 13    在按照审计准则执行审计的过程中,我们运用了职业判断,并保持了职业怀疑。同时,
    19. 14                                我们也执行以下工作:
    20. 15    (一)识别和评估由于舞弊或错误导致的财务报表重大错报风险,设计和实施审计程序
    21. 16  以应对这些风险,并获取充分、适当的审计证据,作为发表审计意见的基础。由于舞弊可能
    22. 17  涉及串通、伪造、故意遗漏、虚假陈述或凌驾于内部控制之上,未能发现由于舞弊导致的重
    23. 18               大错报的风险高于未能发现由于错误导致的重大错报的风险。
    24. 19               (二)了解与审计相关的内部控制,以设计恰当的审计程序。
    25. 20       (三)评价管理层选用会计政策的恰当性和作出会计估计及相关披露的合理性。
    26. 21    (四)对管理层使用持续经营假设的恰当性得出结论。同时,根据获取的审计证据,就
    27. 22  可能导致对奇正藏药持续经营能力产生重大疑虑的事项或情况是否存在重大不确定性得出结
    28. 23  论。如果我们得出结论认为存在重大不确定性,审计准则要求我们在审计报告中提请报表使
    29. 24  用者注意财务报表中的相关披露;如果披露不充分,我们应当发表非无保留意见。我们的结
    30. 25  论基于截至审计报告日可获得的信息。然而,未来的事项或情况可能导致奇正藏药不能持续
    31. 26                                       经营。
    32. 27    (五)评价财务报表的总体列报、结构和内容,并评价财务报表是否公允反映相关交易
    33. 28                                      和事项。
    34. 29    (六)就奇正藏药中实体或业务活动的财务信息获取充分、适当的审计证据,以对财务
    35. 30    报表发表意见。我们负责指导、监督和执行集团审计。我们对审计意见承担全部责任。
    36. 31    我们与治理层就计划的审计范围、时间安排和重大审计发现等事项进行沟通,包括沟通
    37. 32                    我们在审计中识别出的值得关注的内部控制缺陷。
    38. 33    我们还就已遵守与独立性相关的职业道德要求向治理层提供声明,并与治理层沟通可能}m模

    通义千问回答这活儿干不了

    我再问chatGPT

    首先给出了我正确的标题内容,但是段落还不是很OK。但是似乎离得不远了,之所以内容没有正确的分段落。

  • 相关阅读:
    多功能电力仪表在物联网的应用
    PID算法及其实现
    【JS/TS游戏开发实战】LayaAir 全平台 3D 引擎
    Zookeeper
    【zabbix监控三】zabbix之部署代理服务器
    1593. 拆分字符串使唯一子字符串的数目最大
    redis常用数据类型以及命令详细介绍
    Python数据分析和挖掘之入门理论+实操
    解决MySQL大版本升级导致.Net(C#)程序连接报错问题
    牛客周赛 Round 51
  • 原文地址:https://blog.csdn.net/star1210644725/article/details/136354262