首页 > 技术知识 > 正文

利用 OpenAI API 从 PDF 文件中提取信息-open pdf file

为什么很难从PDF文件中提取信息

PDF 或可移植文档格式是一种流行的文件格式,广泛用于发 票、采购订单和其他业务文档等文档。但是,对于开发人员来说,从 PDF 中提取信息可能是一项具有挑战性的任务。

难以从PDF中提取信息的一个原因是格式不是结构化的。与具有开发人员可以轻松识别的表格和标题的特定格式的 HTML 不同,PDF 没有一致的信息布局。这使得开发人员更难知道在哪里可以找到他们需要的特定信息。

难以从PDF中提取信息的另一个原因是没有标准的信息布局。每个系统生成发 票和采购订单的方式不同,因此开发人员必须经常编写自定义代码以从每个单独的文档中提取信息。这可能是一个耗时且容易出错的过程。

此外,PDF 可以同时包含文本和图像,这使得开发人员难以以编程方式从文档中提取信息。OCR(光学字符识别)可用于从图像中提取文本,但这会增加过程的复杂性,如果 OCR 软件不准确,可能会导致错误。

现有解决方案

用于从 PDF 中提取信息的现有解决方案包括:

使用正则表达式:在将 PDF 转换为纯文本后匹配文本中的模式。示例invoice2data和traprange-invoice。但是,此方法需要了解数据字段的格式。基于 AI 的云服务:利用机器学习从 PDF 中提取结构化数据。 示例包括 pdftable 和 docparser,但这些对开源不友好。

PDF 数据提取的另一种解决方案:使用 OpenAI

从PDF文件中提取信息的一种解决方案是使用OpenAI的自然语言处理功能来理解文档的内容。但是,OpenAI 无法直接处理 PDF 或图像格式,因此第一步是将 PDF 转换为文本,同时保留文本项的相对位置。

实现此目的的一种方法是使用 PDFLayoutTextStripper 库,该库使用 PDFBox 通读 PDF 文件中的所有文本项并按行组织它们,保持相对位置与原始 PDF 文件中相同。这一点很重要,因为例如,在发 票的物料表中,如果金额与数量位于同一列中,则在查询总金额和总数量时将导致值不正确。下面是剥离器输出的示例:

*PO-003847945* Page…………………….: 1 of 1 Address………..: Aeeee Consumer Good Co.(QSC) Purchase Order P.O.Box 1234 Dooo, PO-003847945 ABC TL-00074 Telephone……..: USR\S.Morato 5/10/2020 3:40 PM Fax……………….: 100225 Aaaaaa Eeeeee Date……………………………..: 5/10/2020 Expected DeliveryDate…: 5/10/2020 Phone……..: Attention Information Fax………….: Vendor : TL-00074 AAAA BBBB CCCCCAAI W.L.L. Payment Terms Current month plus 60 days Discount Barcode Item number Description Quantity Unit Unit price Amount Discount 5449000165336 304100 CRET ZERO 350ML PET 5.00 PACK24 54.00 270.00 0.00 0.00 350 5449000105394 300742 CEEOCE EOE SOFT DRINKS 1.25LTR 5.00 PACK6 27.00 135.00 0.00 0.00 1.25 (truncated…)
<

将PDF转换为文本后,下一步是调用OpenAI API并将文本与查询一起传递,例如“提取字段:PO编号,总金额”。响应将采用 JSON 格式,GSON 可用于解析它并提取最终结果。将PDF转换为文本,然后使用OpenAI的自然语言处理功能的两步过程可能是从PDF文件中提取信息的有效解决方案。

查询非常简单,%s 替换为 PO 文本内容:

private static final String QUERY = “”” Want to extract fields: “PO Number”, “Total Amount” and “Delivery Address”. Return result in JSON format without any explanation. The PO content is as follows: %s “””;

查询由两个组件组成:

指定所需字段。将字段值格式化为 JSON 数据,以便从 API 响应中轻松检索。

以下是OpenAI的示例响应:

{ “object”: “text_completion”, “model”: “text-davinci-003”, “choices”: [ { “text”: “\\n{\\n \\”PO Number\\”: \\”PO-003847945\\”,\\n \\”Total Amount\\”: \\”1,485.00\\”,\\n \\”Delivery Address\\”: \\”Peera Consumer Good Co.(QSC), P.O.Box 3371, Dohe, QAT\\”\\n}”, “index”: 0, “logprobs”: null, “finish_reason”: “stop” } ], // … some more fields }

解码字段的 JSON 字符串将生成以下所需字段:text

{ “PO Number”: “PO-003847945”, “Total Amount”: “1,485.00”, “Delivery Address”: “Peera Consumer Good Co.(QSC), P.O.Box 3371, Dohe, QAT” }

运行示例代码

先决条件:

Java 16+Maven

步骤:

创建一个OpenAI帐户。登录并生成 API 密钥。在主.java中替换为您的密钥。OPENAI_API_KEY如果需要,请更新。SAMPLE_PDF_FILE执行代码并查看输出中的结果。

猜你喜欢