nystronsolar/electric-bill-extractor

2.2.2 2023-09-01 00:29 UTC

README

NystronSolarBadge PHPUnitBadge PHPBadge PsalmBadge SemanticReleaseBadge

Electric Bill Extractor

Logo由Canva制作

入门

首先,使用composer安装此包

composer require nystronsolar/electric-bill-extractor

然后,从电费单中提取数据

<?php

use NystronSolar\ElectricBillExtractor\ExtractorFactory;

require_once __DIR__.'/vendor/autoload.php';

$bill = ExtractorFactory::extractFromFile('bill.pdf');

这个库是如何工作的?

提取器

每种类型的账单都需要一个自定义提取器。每个提取器扩展了Extractor抽象类,在实例化时,你需要提供账单的解析内容。之后,你可以使用extract()方法提取其内容,该方法将返回账单对象或错误情况下的false。

所有提取器的列表

提取器工厂

NystronSolar\ElectricBillExtractor\ExtractorFactory

提取器工厂是一个帮助创建提取器的类

使用提取器工厂,你可以

  • 使用identifyExtractorClassFromContent()identifyExtractorClassFromFile()方法从字符串内容或文件路径中识别提取器类
  • 使用instantiateExtractorClassFromFile()instantiateExtractorClassFromFile()方法从字符串内容或文件路径中实例化提取器类
  • 使用extractFromFile()extractFromFile()方法从字符串内容或文件路径中提取账单
<?php

use NystronSolar\ElectricBillExtractor\ExtractorFactory;

require_once __DIR__.'/vendor/autoload.php';

// Returns an class-string of an extractor that can be used or false
ExtractorFactory::identifyExtractorClassFromFile('bill.pdf');
ExtractorFactory::identifyExtractorClassFromContent('An parsed bill content');

// Return an new extractor instance or false
ExtractorFactory::instantiateExtractorFromFile('bill.pdf');
ExtractorFactory::instantiateExtractorFromContent('An parsed bill content');

// Extract an Bill - Return an bill object or false
ExtractorFactory::extractFromFile('bill.pdf');
ExtractorFactory::extractFromContent('An parsed bill content');

测试

电费提取器的测试非常棒!

内容

为了测试文件提取器库,我们需要许多文件来提取并检查结果。这是因为,在电费提取器中,在tests/Content/bills/目录下,你可以找到许多代表许多假账的.txt文件,遵循每个提取器的模式。

要比较提取器与实际账单的结果,你可以在tests/Content/expected/中找到.json文件,当测试运行时,它将比较预期的(json)与实际的账单(txt)

为什么不使用PDF文件?

在大多数实际情况中,项目将从PDF文件中提取数据。在这种方法中,电费提取器工厂将使用https://github.com/smalot/pdfparser将PDF文件解析为文本。

解析后,库将使用解析器返回的文本提取账单的所有数据。

但在测试中,我们可以跳过所有的解析。这是因为我们使用.txt而不是.pdf

测试用例

由于提取器有这种“奇怪”的方式来断言类,我们构建了Extractor Test Case,这是一个自定义PHPUnit测试用例。这个测试用例有一个assertByContentFolder方法,你需要提供文件夹名称和提取器类。

上传新的测试账单

tests/Content/bills下的账单通常是真实的账单,但一些值已被更改。如果你发现你的账单有错误,并想将其上传到存储库,更改一些值非常重要,例如真实姓名、CPF、安装代码等,因为这个项目是开源的,所以任何人都可以看到账单。

你可以使用composer upload-bill命令来帮助你添加新的账单,但你仍然需要删除所有秘密并填写JSON预期文件。

在这里,你可以看到所有账单中必须更改的值。

RGE V3

数值按葡萄牙语命名,顺序排列。

  • 名称
  • 街道和门牌号
  • 邮编,城市和州
  • 地块
  • 读数地址
  • 表号
  • CPF
  • 安装代码
  • 发票
  • 发票二维码访问密钥
  • 发票授权协议
  • “重要通知”框内的秘密值
  • 电表
  • 电力账户(ID号)
  • 银行自动扣款代码

RGE V2

数值按葡萄牙语命名,顺序排列。

  • 名称

  • 街道和门牌号

  • 邮编,城市和州

  • 发票 - 声明行为

  • 电力账户(ID号)和系列号

  • 合同账户

  • 地块

  • 读数路线

  • 表号

  • PN

  • “尊敬的客户”框内的秘密值

  • RG

  • 安装代码

  • 代码

  • 操作描述

  • CPF

  • 安装代码

  • 发票

  • 发票二维码访问密钥

  • 发票授权协议

  • “重要通知”框内的秘密值

  • 电表

  • 银行自动扣款代码